| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288 |
- #!/bin/bash
- . "$(dirname "$0")/scripts/shini.sh"
- print_help() {
- shini_parse "config.ini"
- cat << END
- Usage: ./configure [--option] ...
- options:
- --prefix=PREFIX (DEFAULT: $PREFIX)
- --incdir=INSTALL_INCDIR (DEFAULT: $PREFIX/include/hv)
- --libdir=INSTALL_LIBDIR (DEFAULT: $PREFIX/lib)
- --with-MODULE
- --without-MODULE
- --enable-FEATURE
- --disable-FEATURE
- modules:
- --with-protocol compile protocol module? (DEFAULT: $WITH_PROTOCOL)
- --with-evpp compile evpp module? (DEFAULT: $WITH_EVPP)
- --with-http compile http module? (DEFAULT: $WITH_HTTP)
- --with-http-client compile http client module? (DEFAULT: $WITH_HTTP_CLIENT)
- --with-http-server compile http server module? (DEFAULT: $WITH_HTTP_SERVER)
- --with-mqtt compile mqtt module? (DEFAULT: $WITH_MQTT)
- features:
- --enable-uds enable Unix Domain Socket? (DEFAULT: $ENABLE_UDS)
- --enable-windump enable Windows coredump? (DEFAULT: $ENABLE_WINDUMP)
- dependencies:
- --with-curl compile with curl? (DEFAULT: $WITH_CURL)
- --with-nghttp2 compile with nghttp2? (DEFAULT: $WITH_NGHTTP2)
- --with-openssl compile with openssl? (DEFAULT: $WITH_OPENSSL)
- --with-gnutls compile with gnutls? (DEFAULT: $WITH_GNUTLS)
- --with-mbedtls compile with mbedtls? (DEFAULT: $WITH_MBEDTLS)
- rudp:
- --with-kcp compile with kcp? (DEFAULT: $WITH_KCP)
- END
- }
- mkdir tmp 2>/dev/null
- while [ -n "$1" ]
- do
- opt="$1"
- KEY=""
- VAL=yes
- case $opt in
- --help)
- print_help
- exit 0
- ;;
- --prefix=*)
- KEY="PREFIX"
- VAL=${opt:9}
- ;;
- --incdir=*)
- KEY="INSTALL_INCDIR"
- VAL=${opt:9}
- ;;
- --libdir=*)
- KEY="INSTALL_LIBDIR"
- VAL=${opt:9}
- ;;
- --with-*)
- KEY="WITH_${opt:7}"
- ;;
- --without-*)
- KEY="WITH_${opt:10}"
- VAL=no
- ;;
- --enable-*)
- KEY="ENABLE_${opt:9}"
- ;;
- --disable-*)
- KEY="ENABLE_${opt:10}"
- VAL=no
- ;;
- *)
- print_help
- exit 255
- ;;
- esac
- if [ -n $KEY ]; then
- FEATURE=$(echo "$KEY" | tr "a-z-" "A-Z_")
- if [ ! -f tmp/config.mk ]; then
- cp config.ini tmp/config.mk
- fi
- shini_write "tmp/config.mk" "" "$FEATURE" "$VAL"
- fi
- shift 1
- done
- # config.mk
- echo "[config.mk]"
- if [ -f tmp/config.mk ]; then
- mv tmp/config.mk config.mk
- shini_write "config.mk" "" "CONFIG_DATE" "$(date +%Y%m%d)"
- fi
- cat config.mk
- echo ""
- # Checks for compiler
- echo -e "\nchecking for compiler..."
- if [ $CROSS_COMPILE ]; then
- CC=${CROSS_COMPILE}gcc
- CXX=${CROSS_COMPILE}g++
- fi
- if [ ! $CC ]; then
- CC=gcc
- CXX=g++
- fi
- CC_VERSION=`$CC --version 2>&1 | head -n 1`
- echo "CC = $CC"
- echo "CXX = $CXX"
- echo "$CC_VERSION"
- # Checks for os
- echo -e "\nchecking for os..."
- HOST_OS=`uname -s`
- HOST_ARCH=`uname -m`
- TARGET_PLATFORM=`$CC -v 2>&1 | grep Target | sed 's/Target: //'`
- TARGET_ARCH=`echo $TARGET_PLATFORM | awk -F'-' '{print $1}'`
- case $TARGET_PLATFORM in
- *mingw*) TARGET_OS=Windows ;;
- *android*) TARGET_OS=Android ;;
- *darwin*) TARGET_OS=Darwin ;;
- *) TARGET_OS=Linux ;;
- esac
- echo "HOST_OS = $HOST_OS"
- echo "HOST_ARCH = $HOST_ARCH"
- echo "TARGET_PLATFORM = $TARGET_PLATFORM"
- echo "TARGET_OS = $TARGET_OS"
- echo "TARGET_ARCH = $TARGET_ARCH"
- # hconfig.h
- echo -e "\n>> hconfig.h"
- confile=hconfig.h
- cat << END > $confile
- #ifndef HV_CONFIG_H_
- #define HV_CONFIG_H_
- END
- write_define() {
- cat << END >> hconfig.h
- #ifndef $macro
- #define $macro $value
- #endif
- END
- }
- CheckHeaderExists() {
- rm tmp/check 2>/dev/null
- cat << END > tmp/check.c
- #include <$header>
- int main() {
- return 0;
- }
- END
- $CC -o tmp/check tmp/check.c 2>/dev/null
- if [ -x tmp/check ]; then
- value=1
- else
- value=0
- fi
- }
- CheckSymbolExists() {
- CheckHeaderExists
- if [ $value -eq 0 ]; then
- return;
- fi
- rm tmp/check 2>/dev/null
- cat << END > tmp/check.c
- #include <$header>
- int $function(void** pp) {return 0;}
- int main() {
- void* p;
- return $function(&p);
- }
- END
- $CC -o tmp/check tmp/check.c 2>/dev/null
- if [ -x tmp/check ]; then
- value=0
- else
- value=1
- fi
- }
- check_header() {
- echo -n "checking for $header... "
- CheckHeaderExists
- if [ $value -eq 0 ]; then
- echo "no"
- else
- echo "yes"
- fi
- macro=HAVE_$(echo $header | tr a-z./ A-Z__)
- write_define
- }
- check_function() {
- echo -n "checking for $function... "
- CheckSymbolExists
- if [ $value -eq 0 ]; then
- echo "no"
- else
- echo "yes"
- fi
- macro=HAVE_$(echo $function | tr a-z A-Z)
- write_define
- }
- check_option() {
- value=$(eval echo \$$option)
- echo "checking for $option=$value"
- if [ "$value" == "yes" ]; then
- cat << END >> $confile
- #define $option 1
- END
- else
- cat << END >> $confile
- /* #undef $option */
- END
- fi
- }
- # Checks for programs
- # Checks for libraries
- # Checks for header files
- header=stdbool.h && check_header
- header=stdint.h && check_header
- header=stdatomic.h && check_header
- header=sys/types.h && check_header
- header=sys/stat.h && check_header
- header=sys/time.h && check_header
- header=fcntl.h && check_header
- header=pthread.h && check_header
- header=endian.h && check_header
- header=sys/endian.h && check_header
- # Checks for functions
- function=gettid && header=unistd.h && check_function
- function=strlcpy && header=string.h && check_function
- function=strlcat && header=string.h && check_function
- function=clock_gettime && header=time.h && check_function
- function=gettimeofday && header=sys/time.h && check_function
- function=pthread_spin_lock && header=pthread.h && check_function
- function=pthread_mutex_timedlock && header=pthread.h && check_function
- function=sem_timedwait && header=semaphore.h && check_function
- function=pipe && header=unistd.h && check_function
- function=socketpair && header=sys/socket.h && check_function
- function=eventfd && header=sys/eventfd.h && check_function
- function=setproctitle && header=unistd.h && check_function
- # Checks for options
- source config.mk 2>/dev/null
- option=WITH_OPENSSL && check_option
- option=WITH_GNUTLS && check_option
- option=WITH_MBEDTLS && check_option
- option=ENABLE_UDS && check_option
- option=USE_MULTIMAP && check_option
- option=WITH_KCP && check_option
- # end confile
- cat << END >> $confile
- #endif // HV_CONFIG_H_
- END
- echo "configure done."
|