289 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			289 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/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."
 | 
