diff options
Diffstat (limited to 'configure.ac')
-rw-r--r-- | configure.ac | 289 |
1 files changed, 289 insertions, 0 deletions
diff --git a/configure.ac b/configure.ac new file mode 100644 index 000000000..1acb6c805 --- /dev/null +++ b/configure.ac @@ -0,0 +1,289 @@ +AC_INIT([libndpi], [4.1.0]) + +AC_CONFIG_AUX_DIR([.]) +AC_CONFIG_MACRO_DIR([m4]) + +AM_INIT_AUTOMAKE([foreign subdir-objects]) + +AC_PREFIX_DEFAULT(/usr) + +EXTRA_TARGETS="example tests tests/unit tests/dga" +AC_ARG_WITH(only-libndpi, AS_HELP_STRING([--with-only-libndpi], [Build only libndpi (no examples, tests etc)])) +AS_IF([test "${with_only_libndpi+set}" = set],[ + EXTRA_TARGETS="" +]) + +GNU_PREFIX="" + +AC_ARG_WITH(sanitizer, AS_HELP_STRING([--with-sanitizer], [Build with support for address, undefined and leak sanitizer])) +AC_ARG_ENABLE(fuzztargets, AS_HELP_STRING([--enable-fuzztargets], [Enable fuzz targets]),[enable_fuzztargets=$enableval],[enable_fuzztargets=no]) +AS_IF([test "x$enable_fuzztargets" = "xyes"], [BUILD_FUZZTARGETS=1], [BUILD_FUZZTARGETS=0]) +AM_CONDITIONAL([BUILD_FUZZTARGETS], [test "x$enable_fuzztargets" = "xyes"]) + +AS_IF([test "${with_sanitizer+set}" = set],[ + CFLAGS="${CFLAGS} -g3 -O0 -fsanitize=address -fsanitize=undefined -fno-sanitize=alignment -fsanitize=leak -fno-omit-frame-pointer" + LDFLAGS="${LDFLAGS} -fsanitize=address -fsanitize=undefined -fno-sanitize=alignment -fsanitize=leak" +]) + +LT_INIT +LT_LIB_M +PKG_PROG_PKG_CONFIG + +SYSTEM=`uname -s` +if test $SYSTEM = "Darwin"; then +dnl> AC_PROG_CC(clang gcc) + AM_PROG_CC_C_O(clang gcc) + AC_PROG_CXX(clang++ g++) + AC_PROG_CC_STDC(clang gcc) +else +dnl> AC_PROG_CC + AM_PROG_CC_C_O + AC_PROG_CXX + AC_PROG_CC_STDC +fi +AC_LANG_WERROR + +NDPI_MAJOR=`echo "${PACKAGE_VERSION}" | cut -d . -f 1` +NDPI_MINOR=`echo "${PACKAGE_VERSION}" | cut -d . -f 2` +NDPI_PATCH=`echo "${PACKAGE_VERSION}" | cut -d . -f 3` +NDPI_VERSION_SHORT="$NDPI_MAJOR.$NDPI_MINOR.$NDPI_PATCH" + +AC_DEFINE_UNQUOTED(NDPI_MAJOR_RELEASE, "${NDPI_MAJOR}", [nDPI major release]) +AC_DEFINE_UNQUOTED(NDPI_MINOR_RELEASE, "${NDPI_MINOR}", [nDPI minor release]) +AC_DEFINE_UNQUOTED(NDPI_PATCH_LEVEL, "${NDPI_PATCH}", [nDPI patch level]) + +# .git as directory in a cloned repo +# .git as file in submodule based integration +if test -d ".git" || test -f ".git" ; then : + GIT_TAG=`git log -1 --format=%h` + GIT_DATE=`git log -1 --format=%cd` + # + # On CentOS 6 `git rev-list HEAD --count` does not work + # + # + GIT_NUM=`git log --pretty=oneline | wc -l | tr -d '[[:space:]]'` + GIT_RELEASE="${PACKAGE_VERSION}-${GIT_NUM}-${GIT_TAG}" + + A=`git log src/include/ndpi_typedefs.h|wc -l` + B=`git log src/include/ndpi_protocol_ids.h|wc -l` + C=`git log src/include/ndpi_api.h.in|wc -l` + NDPI_API_VERSION=$((A+B+C)) +else + GIT_RELEASE="${PACKAGE_VERSION}" + GIT_DATE=`date -u -r CHANGELOG.md` + if test -z "$SOURCE_DATE_EPOCH" ; then : + SOURCE_DATE_EPOCH=`date +%s` + fi + NDPI_API_VERSION=`echo $SOURCE_DATE_EPOCH | cut -c7-10` +fi + +NDPI_API_VERSION=`echo $NDPI_API_VERSION | sed 's/^0*//'` + +echo "Setting API version to $NDPI_API_VERSION" + +AC_DEFINE_UNQUOTED(NDPI_GIT_RELEASE, "${GIT_RELEASE}", [GIT Release]) +AC_DEFINE_UNQUOTED(NDPI_GIT_DATE, "${GIT_DATE}", [Last GIT change]) + +if ! test "${with_only_libndpi+set}" = set; then : + dnl> used by json-c for unit tests + PKG_CHECK_MODULES([JSONC], [json-c], [JSONC_LIBS="${pkg_cv_JSONC_LIBS}" JSONC_CFLAGS="${pkg_cv_JSONC_CFLAGS}"]) + AC_CHECK_LIB([json-c], [json_object_put], [], [ + AC_MSG_WARN([JSON-C not available. Disabled unit test.]) + JSONC_LIBS="" + JSONC_CFLAGS="" + EXTRA_TARGETS="example tests tests/dga" + ]) + AX_PTHREAD([],[ + AC_MSG_WARN([POSIX Threads not available. Building library only.]) + JSONC_LIBS="" + JSONC_CFLAGS="" + EXTRA_TARGETS="" + ]) +fi + +LIBS="$LIBS $JSONC_LIBS" +CFLAGS="-W -Wall -Wno-unused-parameter -Wno-unused-function $CFLAGS $JSONC_CFLAGS" + +AC_CHECK_HEADERS([netinet/in.h stdint.h stdlib.h string.h unistd.h math.h float.h]) +AC_CHECK_LIB([m], [sqrt], [], [LIBM="-lm"]) + +ADDITIONAL_LIBS="$LIBM" +PCAP_HOME=$HOME/PF_RING/userland + +DPDK_TARGET= +AC_MSG_CHECKING([DPDK (used by ndpiReader)]) +if test -d $HOME/DPDK; then : + AC_MSG_RESULT(yes) + DPDK_TARGET=dpdk +else + AC_MSG_RESULT([no (missing $HOME/DPDK)]) +fi + +if ! test -d $PCAP_HOME; then : + PCAP_HOME=`pwd`/../../PF_RING/userland +fi +SHORT_MACHINE=`uname -m | cut -b1-3` +if test $SHORT_MACHINE = "arm"; then + LIBNUMA="" +else + AC_CHECK_LIB([numa], [numa_available], [LIBNUMA="-lnuma"]) +fi + +MACHINE=`uname -m` + +CUSTOM_NDPI= + +if test -d ../nDPI-custom; then : + CUSTOM_NDPI="-DCUSTOM_NDPI_PROTOCOLS" + AC_MSG_RESULT([Compiling with custom nDPI protocols]) +fi + +if test -d ../ndpi-pro; then : + with_maxminddb=1 +fi + +case "$host" in + *-*-mingw32*|*-*-msys) + PCAP_INC="" + PCAP_LIB="" + case "$host" in + x86_64-*) + BUILD_MINGW_X64=1 + ;; + i686-*) + ;; + *) + AC_MSG_ERROR([Unsupported MingW cross compiler.]) + ;; + esac + CFLAGS="${CFLAGS}" + LDFLAGS="${LDFLAGS} -lws2_32" + BUILD_MINGW=1 + ;; + *) + if test -f $PCAP_HOME/libpcap/libpcap.a; then : + echo "Using libpcap from $PCAP_HOME" + PCAP_INC="-I $PCAP_HOME/libpcap" + PCAP_LIB="$PCAP_HOME/libpcap/libpcap.a $PCAP_HOME/lib/libpfring.a $LIBNUMA `$PCAP_HOME/lib/pfring_config --libs`" + AC_CHECK_LIB([rt], [clock_gettime], [PCAP_LIB="$PCAP_LIB -lrt"]) + AC_CHECK_LIB([nl], [nl_handle_alloc], [PCAP_LIB="$PCAP_LIB -lnl"]) + # The dlopen() function is in libdl on GLIBC-based systems + # and in the C library for *BSD systems + AC_CHECK_LIB([dl], [dlopen], [DL_LIB="-ldl"],[AC_CHECK_LIB([c], + [dlopen], [DL_LIB="-lc"], + [AC_MSG_ERROR([unable to find the dlopen(), dlsym() functions]) ]) ]) + elif test "${with_only_libndpi+set}" != set; then : + AC_CHECK_LIB([pcap], [pcap_open_live], [PCAP_LIB="-lpcap"]) + if test $ac_cv_lib_pcap_pcap_open_live = "no"; then : + AC_MSG_ERROR([Missing libpcap(-dev) library required to compile the example application.]) + fi + fi + ;; +esac + +AC_ARG_ENABLE([debug-messages], + AS_HELP_STRING([--enable-debug-messages], [Define NDPI_ENABLE_DEBUG_MESSAGES=1]), [ + AC_DEFINE(NDPI_ENABLE_DEBUG_MESSAGES, 1, [Enable ndpi_debug_messages]) ]) + +AS_IF([test "x$enable_fuzztargets" = "xyes"], [ + AC_PROG_CXX + AC_LANG_PUSH(C++) + tmp_saved_flags=$[]_AC_LANG_PREFIX[]FLAGS + AX_CHECK_COMPILE_FLAG([-fsanitize=fuzzer],, + [AC_MSG_ERROR([--enable-fuzztargets requires -fsanitize=fuzzer which is only supported by LLVM])], + [-Werror]) + AS_IF([test "x$LIB_FUZZING_ENGINE" = "x"], [ + LIB_FUZZING_ENGINE=-fsanitize=fuzzer + AC_SUBST(LIB_FUZZING_ENGINE) + ]) + _AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $LIB_FUZZING_ENGINE" + AC_MSG_CHECKING([whether $CXX accepts $LIB_FUZZING_ENGINE]) + AC_LINK_IFELSE([AC_LANG_SOURCE([[ +#include <sys/types.h> +extern "C" int LLVMFuzzerTestOneInput(const unsigned char *Data, size_t Size); +extern "C" int LLVMFuzzerTestOneInput(const unsigned char *Data, size_t Size) { +(void)Data; +(void)Size; +return 0; +} + ]])], + [ AC_MSG_RESULT(yes) + has_sanitizefuzzer=yes], + [ AC_MSG_RESULT(no) ] + ) + _AC_LANG_PREFIX[]FLAGS=$tmp_saved_flags + AC_LANG_POP() +]) +AM_CONDITIONAL([HAS_FUZZLDFLAGS], [test "x$has_sanitizefuzzer" = "xyes"]) + +AC_CHECK_LIB(pthread, pthread_setaffinity_np, AC_DEFINE_UNQUOTED(HAVE_PTHREAD_SETAFFINITY_NP, 1, [libc has pthread_setaffinity_np])) + +dnl> GCRYPT +GCRYPT_ENABLED=1 +AC_ARG_ENABLE([gcrypt], + [AS_HELP_STRING([--disable-gcrypt], [Avoid compiling with libgcrypt/libgpg-error, even if they are present. QUIC sub-classification may be missing])], + [GCRYPT_ENABLED=0], + [AC_CHECK_LIB(gcrypt, gcry_cipher_checktag)]) +AS_IF([test ${GCRYPT_ENABLED} -eq 1], [ + if test "x$ac_cv_lib_gcrypt_gcry_cipher_checktag" = xyes; then : + ADDITIONAL_LIBS="${ADDITIONAL_LIBS} -lgcrypt" + else + $as_unset ac_cv_lib_gcrypt_gcry_cipher_checktag + AC_CHECK_LIB(gpg-error, gpg_strerror_r) + AC_CHECK_LIB(gcrypt, gcry_cipher_checktag) + if test "x$ac_cv_lib_gcrypt_gcry_cipher_checktag" = xyes -a "x$ac_cv_lib_gpg_error_gpg_strerror_r" = xyes; then : + ADDITIONAL_LIBS="${ADDITIONAL_LIBS} -lgcrypt -lgpg-error" + else + GCRYPT_ENABLED=0 + fi + fi +]) + +dnl> PCRE +PCRE_ENABLED=0 +AC_ARG_WITH(pcre, [ --with-pcre Enable nDPI build with libpcre]) +if test "${with_pcre+set}" = set; then : + AC_CHECK_LIB(pcre, pcre_compile, AC_DEFINE_UNQUOTED(HAVE_PCRE, 1, [libpcre(-dev) is present])) + if test "x$ac_cv_lib_pcre_pcre_compile" = xyes; then : + ADDITIONAL_LIBS="${ADDITIONAL_LIBS} -lpcre" + PCRE_ENABLED=1 + fi +fi + +dnl> GeoIP +AC_ARG_WITH(maxminddb, [ --with-maxminddb Enable nDPI build with libmaxminddb]) +if test "${with_maxminddb+set}" = set; then : + AC_CHECK_LIB([maxminddb], [MMDB_lookup_sockaddr]) + AC_HAVE_HEADERS(maxminddb.h) + if test ".${ac_cv_lib_maxminddb_MMDB_lookup_sockaddr}" = ".yes" && test ".${ac_cv_header_maxminddb_h}" = ".yes"; then + ADDITIONAL_LIBS="${ADDITIONAL_LIBS} -lmaxminddb" + AC_DEFINE_UNQUOTED(HAVE_MAXMINDDB, 1, [MaxMind DB support]) + fi +fi + +AC_CONFIG_FILES([Makefile example/Makefile example/Makefile.dpdk tests/Makefile tests/unit/Makefile tests/dga/Makefile libndpi.pc src/include/ndpi_define.h src/lib/Makefile python/Makefile fuzz/Makefile src/include/ndpi_api.h]) +AC_CONFIG_FILES([tests/do.sh], [chmod +x tests/do.sh]) +AC_CONFIG_HEADERS(src/include/ndpi_config.h) +AC_SUBST(GIT_RELEASE) +AC_SUBST(NDPI_MAJOR) +AC_SUBST(NDPI_MINOR) +AC_SUBST(NDPI_PATCH) +AC_SUBST(NDPI_VERSION_SHORT) +AC_SUBST(PCAP_INC) +AC_SUBST(PCAP_LIB) +AC_SUBST(ADDITIONAL_LIBS) +AC_SUBST(DL_LIB) +AC_SUBST(DPDK_TARGET) +AC_SUBST(HAVE_PTHREAD_SETAFFINITY_NP) +AC_SUBST(CUSTOM_NDPI) +AC_SUBST(NDPI_API_VERSION) +AC_SUBST(EXTRA_TARGETS) +AC_SUBST(BUILD_MINGW) +AC_SUBST(BUILD_MINGW_X64) +AC_SUBST(BUILD_FUZZTARGETS) +AC_SUBST(JSONC_CFLAGS) +AC_SUBST(JSONC_LIBS) +AC_SUBST(GCRYPT_ENABLED) +AC_SUBST(PCRE_ENABLED) +AC_SUBST(GNU_PREFIX) +AC_OUTPUT |