#!/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."