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