diff options
Diffstat (limited to 'CMakeLists.txt')
-rw-r--r-- | CMakeLists.txt | 620 |
1 files changed, 620 insertions, 0 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 000000000..b10262580 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,620 @@ +cmake_minimum_required(VERSION 3.12.4) +project(nDPId C) +if(CMAKE_COMPILER_IS_GNUCXX) + execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION) + if (GCC_VERSION VERSION_GREATER 4.7 OR GCC_VERSION VERSION_EQUAL 4.7) + message(STATUS "${CMAKE_C_COMPILER} supports C11 standard.") + else () + message(FATAL_ERROR "C Compiler with C11 standard needed. Therefore a gcc compiler with a version equal or higher than 4.7 is needed.") + endif() +endif(CMAKE_COMPILER_IS_GNUCXX) +set(CMAKE_C_STANDARD 11) +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c11 -D_DEFAULT_SOURCE=1 -D_GNU_SOURCE=1") +if("${PROJECT_SOURCE_DIR}" STREQUAL "${PROJECT_BINARY_DIR}") + message(FATAL_ERROR "In-source builds are not allowed.\n" + "Please remove ${PROJECT_SOURCE_DIR}/CMakeCache.txt\n" + "and\n" + "${PROJECT_SOURCE_DIR}/CMakeFiles\n" + "Create a build directory somewhere and run CMake again.") +endif() +set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) +find_package(PkgConfig REQUIRED) + +set(CPACK_PACKAGE_CONTACT "toni@impl.cc") +set(CPACK_DEBIAN_PACKAGE_NAME "nDPId") +set(CPACK_DEBIAN_PACKAGE_SECTION "network") +set(CPACK_DEBIAN_PACKAGE_DESCRIPTION "nDPId is a set of daemons and tools to capture, process and classify network traffic.") +set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Toni Uhlig") +set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA "${CMAKE_SOURCE_DIR}/packages/debian/preinst;${CMAKE_SOURCE_DIR}/packages/debian/prerm;${CMAKE_SOURCE_DIR}/packages/debian/postrm") +set(CPACK_DEBIAN_PACKAGE_CONTROL_STRICT_PERMISSION TRUE) +set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON) +set(CPACK_DEBIAN_DEBUGINFO_PACKAGE ON) +set(CPACK_STRIP_FILES ON) +set(CPACK_PACKAGE_VERSION_MAJOR 1) +set(CPACK_PACKAGE_VERSION_MINOR 6) +set(CPACK_PACKAGE_VERSION_PATCH 0) +# Note: CPACK_PACKAGING_INSTALL_PREFIX and CMAKE_INSTALL_PREFIX are *not* the same. +# It is used only to ease environment file loading via systemd. +set(CPACK_PACKAGING_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") +set(CMAKE_MACOSX_RPATH 1) + +include(CPack) +include(CheckFunctionExists) +include(CheckLibraryExists) +include(CheckEpoll) + +check_epoll(HAS_EPOLL) +if(HAS_EPOLL) + option(FORCE_POLL "Force the use of poll() instead of epoll()." OFF) + if(NOT FORCE_POLL) + set(EPOLL_DEFS "-DENABLE_EPOLL=1") + endif() +else() + if(BUILD_EXAMPLES) + message(FATAL_ERROR "Examples are using epoll event I/O. Without epoll available, you can not build/run those.") + endif() +endif() + +if(NOT MATH_FUNCTION_EXISTS AND NOT NEED_LINKING_AGAINST_LIBM) + CHECK_FUNCTION_EXISTS(log2f MATH_FUNCTION_EXISTS) + if(NOT MATH_FUNCTION_EXISTS) + unset(MATH_FUNCTION_EXISTS CACHE) + list(APPEND CMAKE_REQUIRED_LIBRARIES m) + CHECK_FUNCTION_EXISTS(log2f MATH_FUNCTION_EXISTS) + if(MATH_FUNCTION_EXISTS) + set(NEED_LINKING_AGAINST_LIBM TRUE CACHE BOOL "" FORCE) + else() + check_library_exists(m sqrt "" NEED_LINKING_AGAINST_LIBM) + if(NOT NEED_LINKING_AGAINST_LIBM) + # Was not able to figure out if explicit linkage against libm is required. + # Forcing libm linkage. Good idea? + set(NEED_LINKING_AGAINST_LIBM TRUE CACHE BOOL "" FORCE) + endif() + endif() + endif() +endif() + +if(NEED_LINKING_AGAINST_LIBM) + set(LIBM_LIB "-lm") +else() + set(LIBM_LIB "") +endif() + +option(ENABLE_COVERAGE "Generate a code coverage report using lcov/genhtml." OFF) +option(ENABLE_SANITIZER "Enable ASAN/LSAN/UBSAN." OFF) +option(ENABLE_SANITIZER_THREAD "Enable TSAN (does not work together with ASAN)." OFF) +option(ENABLE_MEMORY_STATUS "Enable malloc/free wrapper to gather and send heap memory statistics." ON) +option(ENABLE_MEMORY_PROFILING "Enable dynamic memory tracking." OFF) +option(ENABLE_ZLIB "Enable zlib support for nDPId (experimental)." OFF) +option(ENABLE_SYSTEMD "Install systemd components." OFF) +option(BUILD_EXAMPLES "Build C examples." ON) +if(BUILD_EXAMPLES) +option(ENABLE_DBUS "Build DBus notification example." OFF) +option(ENABLE_CURL "Build influxdb data write example." OFF) +endif() +option(ENABLE_PFRING "Enable PF_RING support for nDPId (experimental)" OFF) +option(BUILD_NDPI "Clone and build nDPI from github." OFF) + +if(ENABLE_PFRING) + option(PFRING_LINK_STATIC "Link against a static version of pfring." ON) + set(PFRING_KERNEL_INC "" CACHE STRING "Path to PFRING kernel module include directory.") + set(PFRING_DEFS "-DENABLE_PFRING=1") + + if(PFRING_KERNEL_INC STREQUAL "") + message(FATAL_ERROR "PFRING_KERNEL_INC needs to be set to the PFRING kernel module include directory.") + endif() + if(NOT EXISTS "${PFRING_KERNEL_INC}/linux/pf_ring.h") + message(FATAL_ERROR "Expected to find <linux/pf_ring.h> below ${PFRING_KERNEL_INC}, but none found.") + endif() + + set(PFRING_INSTALLDIR "/opt/PF_RING/usr" CACHE STRING "") + set(PFRING_INC "${PFRING_INSTALLDIR}/include") + + if(NOT EXISTS "${PFRING_INC}") + message(FATAL_ERROR "Include directory \"${PFRING_INC}\" does not exist!") + endif() + if(PFRING_LINK_STATIC) + if(CMAKE_SIZEOF_VOID_P EQUAL 8) + if(EXISTS "${PFRING_INSTALLDIR}/lib64") + set(STATIC_PFRING_LIB "${PFRING_INSTALLDIR}/lib64/libpfring.a") + else() + set(STATIC_PFRING_LIB "${PFRING_INSTALLDIR}/lib/libpfring.a") + endif() + else() + if(EXISTS "${PFRING_INSTALLDIR}/lib32") + set(STATIC_PFRING_LIB "${PFRING_INSTALLDIR}/lib32/libpfring.a") + else() + set(STATIC_PFRING_LIB "${PFRING_INSTALLDIR}/lib/libpfring.a") + endif() + endif() + + if(NOT EXISTS "${STATIC_PFRING_LIB}") + message(FATAL_ERROR "Static library \"${STATIC_PFRING_LIB}\" does not exist!") + endif() + else() + if(CMAKE_SIZEOF_VOID_P EQUAL 8) + if(EXISTS "${PFRING_INSTALLDIR}/lib64") + find_library(PF_RING_LIB pfring PATHS "${PFRING_INSTALLDIR}/lib64") + else() + find_library(PF_RING_LIB pfring PATHS "${PFRING_INSTALLDIR}/lib") + endif() + else() + if(EXISTS "${PFRING_INSTALLDIR}/lib32") + find_library(PF_RING_LIB pfring PATHS "${PFRING_INSTALLDIR}/lib32") + else() + find_library(PF_RING_LIB pfring PATHS "${PFRING_INSTALLDIR}/lib") + endif() + endif() + + if(NOT PF_RING_LIB) + message(FATAL_ERROR "libpfring.so not found below ${PFRING_INSTALLDIR}/{lib,lib32,lib64}") + endif() + endif() + + if(NOT EXISTS "${PFRING_INSTALLDIR}/include/pfring.h") + message(FATAL_ERROR "Expected to find <include/pfring.h> inside ${PFRING_INSTALLDIR}, but none found.") + endif() +else() + unset(PFRING_INSTALLDIR CACHE) + unset(PFRING_INC CACHE) + unset(STATIC_PFRING_LIB CACHE) + unset(PFRING_LINK_STATIC CACHE) +endif() + +if(BUILD_NDPI) + option(BUILD_NDPI_FORCE_GIT_UPDATE "Forcefully instruments nDPI build script to update the git submodule." OFF) + unset(NDPI_NO_PKGCONFIG CACHE) + unset(STATIC_LIBNDPI_INSTALLDIR CACHE) +else() + option(NDPI_NO_PKGCONFIG "Do not use pkgconfig to search for libnDPI." OFF) + if(NDPI_NO_PKGCONFIG) + set(STATIC_LIBNDPI_INSTALLDIR "/opt/libnDPI/usr" CACHE STRING "Path to a installation directory of libnDPI e.g. /opt/libnDPI/usr") + if(STATIC_LIBNDPI_INSTALLDIR STREQUAL "") + message(FATAL_ERROR "STATIC_LIBNDPI_INSTALLDIR can not be an empty string within your configuration!") + endif() + else() + unset(STATIC_LIBNDPI_INSTALLDIR CACHE) + endif() +endif() + +if(STATIC_LIBNDPI_INSTALLDIR OR BUILD_NDPI OR NDPI_NO_PKGCONFIG) + option(NDPI_WITH_GCRYPT "Link static libndpi library against libgcrypt." OFF) + option(NDPI_WITH_PCRE "Link static libndpi library against libpcre." OFF) + option(NDPI_WITH_MAXMINDDB "Link static libndpi library against libmaxminddb." OFF) +else() + unset(NDPI_WITH_GCRYPT CACHE) + unset(NDPI_WITH_PCRE CACHE) + unset(NDPI_WITH_MAXMINDDB CACHE) +endif() + +if (ENABLE_MEMORY_STATUS) + set(MEMORY_STATUS_DEFS "-DENABLE_MEMORY_STATUS=1") +endif() +if (ENABLE_MEMORY_PROFILING AND NOT ENABLE_MEMORY_STATUS) + message(FATAL_ERROR "ENABLE_MEMORY_PROFILING requires ENABLE_MEMORY_STATUS to make it work!") +endif() + +if(ENABLE_PFRING) + set(NDPID_PFRING_SRCS npfring.c) +endif() +add_executable(nDPId nDPId.c ${NDPID_PFRING_SRCS} nio.c utils.c) +add_executable(nDPIsrvd nDPIsrvd.c nio.c utils.c) +add_executable(nDPId-test nDPId-test.c ${NDPID_PFRING_SRCS}) + +add_custom_target(dist) +add_custom_command( + TARGET dist + COMMAND "${CMAKE_SOURCE_DIR}/scripts/make-dist.sh" +) + +add_custom_target(daemon) +add_custom_command( + TARGET daemon + COMMAND env nDPIsrvd_ARGS='-C 1024' "${CMAKE_SOURCE_DIR}/scripts/daemon.sh" "$<TARGET_FILE:nDPId>" "$<TARGET_FILE:nDPIsrvd>" + DEPENDS nDPId nDPIsrvd +) + +if(CMAKE_CROSSCOMPILING) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) +endif() + +if(BUILD_NDPI) + enable_testing() + add_test(NAME run_tests + COMMAND "${CMAKE_SOURCE_DIR}/test/run_tests.sh" + "${CMAKE_SOURCE_DIR}/libnDPI" + "$<TARGET_FILE:nDPId-test>") + if(NDPI_WITH_PCRE OR NDPI_WITH_MAXMINDDB) + message(WARNING "NDPI_WITH_PCRE or NDPI_WITH_MAXMINDDB enabled.\n" + "${CMAKE_CURRENT_SOURCE_DIR}/test/run_tests.sh or ctest will fail!") + endif() +endif() + +if(ENABLE_COVERAGE) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fprofile-arcs -ftest-coverage") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --coverage") + set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} --coverage") + add_custom_target(coverage DEPENDS "${CMAKE_BINARY_DIR}/coverage_report/nDPId/index.html") + add_custom_command( + OUTPUT "${CMAKE_BINARY_DIR}/coverage_report/nDPId/index.html" + COMMAND lcov --directory "${CMAKE_BINARY_DIR}" --directory "${CMAKE_SOURCE_DIR}/libnDPI" --capture --output-file "${CMAKE_BINARY_DIR}/lcov.info" + COMMAND genhtml -o "${CMAKE_BINARY_DIR}/coverage_report" "${CMAKE_BINARY_DIR}/lcov.info" + DEPENDS nDPId nDPId-test nDPIsrvd + ) + add_custom_target(coverage-clean) + add_custom_command( + TARGET coverage-clean + COMMAND find "${CMAKE_BINARY_DIR}" "${CMAKE_SOURCE_DIR}/libnDPI" -name "*.gcda" -delete + ) + add_custom_target(coverage-view) + add_custom_command( + TARGET coverage-view + COMMAND cd "${CMAKE_BINARY_DIR}/coverage_report" && python3 -m http.server + DEPENDS "${CMAKE_BINARY_DIR}/coverage_report/nDPId/index.html" + ) +endif() +if(ENABLE_SANITIZER) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -fsanitize=undefined -fno-sanitize=alignment -fsanitize=enum -fsanitize=leak") +endif() +if(ENABLE_SANITIZER_THREAD) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=undefined -fno-sanitize=alignment -fsanitize=enum -fsanitize=thread") +endif() +if(ENABLE_ZLIB) + set(ZLIB_DEFS "-DENABLE_ZLIB=1") + pkg_check_modules(ZLIB REQUIRED zlib) +endif() +if(BUILD_EXAMPLES) + if(ENABLE_DBUS) + pkg_check_modules(DBUS REQUIRED dbus-1) + endif() + if(ENABLE_CURL) + pkg_check_modules(CURL REQUIRED libcurl) + endif() +endif() +if(NDPI_WITH_GCRYPT) + message(STATUS "nDPI: Enable GCRYPT") + set(NDPI_ADDITIONAL_ARGS "${NDPI_ADDITIONAL_ARGS} --with-local-libgcrypt") +endif() +if(NDPI_WITH_PCRE) + message(STATUS "nDPI: Enable PCRE") + set(NDPI_ADDITIONAL_ARGS "${NDPI_ADDITIONAL_ARGS} --with-pcre2") +endif() +if(NDPI_WITH_MAXMINDDB) + message(STATUS "nDPI: Enable MAXMINDDB") + set(NDPI_ADDITIONAL_ARGS "${NDPI_ADDITIONAL_ARGS} --with-maxminddb") +endif() +if(ENABLE_COVERAGE) + message(STATUS "nDPI: Enable Coverage") + set(NDPI_ADDITIONAL_ARGS "${NDPI_ADDITIONAL_ARGS} --enable-code-coverage") +endif() + +execute_process( + COMMAND git describe --tags + WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" + OUTPUT_VARIABLE GIT_VERSION ERROR_QUIET) +string(STRIP "${GIT_VERSION}" GIT_VERSION) +if(GIT_VERSION STREQUAL "" OR NOT IS_DIRECTORY "${CMAKE_SOURCE_DIR}/.git") + if(CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_BUILD_TYPE STREQUAL "") + set(GIT_VERSION "${CPACK_PACKAGE_VERSION}-pre") + else() + set(GIT_VERSION "${CPACK_PACKAGE_VERSION}-release") + endif() +endif() +set(PKG_VERSION "${CPACK_PACKAGE_VERSION}") + +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra") +set(NDPID_DEFS -DJSMN_STATIC=1 -DJSMN_STRICT=1 -DJSMN_PARENT_LINKS=1) +set(NDPID_DEPS_INC "${CMAKE_SOURCE_DIR}" + "${CMAKE_SOURCE_DIR}/dependencies" + "${CMAKE_SOURCE_DIR}/dependencies/jsmn" + "${CMAKE_SOURCE_DIR}/dependencies/uthash/src") +if(CMAKE_CROSSCOMPILING) + add_definitions("-DCROSS_COMPILATION=1") +endif() +if(ENABLE_MEMORY_PROFILING) + message(WARNING "ENABLE_MEMORY_PROFILING should not be used in production environments.") + add_definitions("-DENABLE_MEMORY_PROFILING=1" + "-Duthash_malloc=nDPIsrvd_uthash_malloc" + "-Duthash_free=nDPIsrvd_uthash_free") +else() + set(NDPID_TEST_MPROF_DEFS "-DENABLE_MEMORY_PROFILING=1") +endif() + +if(CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_BUILD_TYPE STREQUAL "") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0 -g3 -fno-omit-frame-pointer -fno-inline") +endif() + +if(ENABLE_SANITIZER AND ENABLE_SANITIZER_THREAD) + message(FATAL_ERROR "ENABLE_SANITIZER and ENABLE_SANITIZER_THREAD can not be used together!") +endif() + +if(BUILD_NDPI) + include(ExternalProject) + ExternalProject_Add( + libnDPI + SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/libnDPI + DOWNLOAD_COMMAND "" + CONFIGURE_COMMAND env + CC=${CMAKE_C_COMPILER} + CXX=false + AR=${CMAKE_AR} + RANLIB=${CMAKE_RANLIB} + PKG_CONFIG=${PKG_CONFIG_EXECUTABLE} + CFLAGS=${CMAKE_C_FLAGS} + LDFLAGS=${CMAKE_MODULE_LINKER_FLAGS} + ADDITIONAL_ARGS=${NDPI_ADDITIONAL_ARGS} + MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM} + DEST_INSTALL=${CMAKE_BINARY_DIR}/libnDPI + FORCE_GIT_UPDATE=${BUILD_NDPI_FORCE_GIT_UPDATE} + ${CMAKE_CURRENT_SOURCE_DIR}/scripts/get-and-build-libndpi.sh + BUILD_BYPRODUCTS ${CMAKE_BINARY_DIR}/libnDPI/lib/libndpi.a + BUILD_COMMAND "" + INSTALL_COMMAND "" + BUILD_IN_SOURCE 1) + + add_custom_target(clean-libnDPI + COMMAND ${CMAKE_BUILD_TOOL} clean + COMMAND rm -rf ${CMAKE_BINARY_DIR}/libnDPI + COMMAND rm -f ${CMAKE_BINARY_DIR}/libnDPI-prefix/src/libnDPI-stamp/libnDPI-configure + ) + + set(STATIC_LIBNDPI_INSTALLDIR "${CMAKE_BINARY_DIR}/libnDPI") + add_dependencies(nDPId libnDPI) + add_dependencies(nDPId-test libnDPI) +endif() + +if(STATIC_LIBNDPI_INSTALLDIR OR BUILD_NDPI OR NDPI_NO_PKGCONFIG) + if(NDPI_WITH_GCRYPT) + find_package(GCRYPT "1.4.2" REQUIRED) + endif() + + if(NDPI_WITH_PCRE) + pkg_check_modules(PCRE REQUIRED libpcre2-8) + endif() + + if(NDPI_WITH_MAXMINDDB) + pkg_check_modules(MAXMINDDB REQUIRED libmaxminddb) + endif() +endif() + +if(STATIC_LIBNDPI_INSTALLDIR OR BUILD_NDPI) + add_definitions("-DLIBNDPI_STATIC=1") + set(STATIC_LIBNDPI_INC "${STATIC_LIBNDPI_INSTALLDIR}/include/ndpi") + if(CMAKE_SIZEOF_VOID_P EQUAL 8) + if(EXISTS "${STATIC_LIBNDPI_INSTALLDIR}/lib64/libndpi.a") + set(STATIC_LIBNDPI_LIB "${STATIC_LIBNDPI_INSTALLDIR}/lib64/libndpi.a") + else() + set(STATIC_LIBNDPI_LIB "${STATIC_LIBNDPI_INSTALLDIR}/lib/libndpi.a") + endif() + else() + if(EXISTS "${STATIC_LIBNDPI_INSTALLDIR}/lib32/libndpi.a") + set(STATIC_LIBNDPI_LIB "${STATIC_LIBNDPI_INSTALLDIR}/lib32/libndpi.a") + else() + set(STATIC_LIBNDPI_LIB "${STATIC_LIBNDPI_INSTALLDIR}/lib/libndpi.a") + endif() + endif() + + if(STATIC_LIBNDPI_INSTALLDIR AND NOT BUILD_NDPI) + if(NOT EXISTS "${STATIC_LIBNDPI_INC}" OR NOT EXISTS "${STATIC_LIBNDPI_LIB}") + message(FATAL_ERROR "Include directory \"${STATIC_LIBNDPI_INC}\" or\n" + "static library \"${STATIC_LIBNDPI_LIB}\" does not exist!") + endif() + endif() + + unset(DEFAULT_NDPI_INCLUDE CACHE) + unset(pkgcfg_lib_NDPI_ndpi CACHE) +else() + if(NOT NDPI_NO_PKGCONFIG) + pkg_check_modules(NDPI REQUIRED libndpi>=4.9.0) + if(NOT pkgcfg_lib_NDPI_ndpi) + find_package(NDPI "4.9.0" REQUIRED) + endif() + + unset(STATIC_LIBNDPI_INC CACHE) + unset(STATIC_LIBNDPI_LIB CACHE) + endif() + + set(DEFAULT_NDPI_INCLUDE ${NDPI_INCLUDE_DIRS}) +endif() + +pkg_check_modules(PCAP libpcap>=1.9.0) # no *.pc file before 1.9.0 +if(NOT pkgcfg_lib_PCAP_pcap) + pkg_check_modules(PCAP libpcap>=1.8.1) # seems like some distributions provide their own *.pc file for 1.8.1 (e.g. Ubuntu-18.04) +endif() +if(NOT pkgcfg_lib_PCAP_pcap) + find_package(PCAP "1.9.0" REQUIRED) +endif() + +target_compile_options(nDPId PRIVATE "-pthread") +target_compile_definitions(nDPId PRIVATE -D_GNU_SOURCE=1 -DPKG_VERSION=\"${PKG_VERSION}\" -DGIT_VERSION=\"${GIT_VERSION}\" ${NDPID_DEFS} ${EPOLL_DEFS} ${ZLIB_DEFS} ${PFRING_DEFS} ${MEMORY_STATUS_DEFS}) +target_include_directories(nDPId PRIVATE "${STATIC_LIBNDPI_INC}" "${DEFAULT_NDPI_INCLUDE}" ${NDPID_DEPS_INC} ${PFRING_KERNEL_INC} ${PFRING_INC}) +target_link_libraries(nDPId "${STATIC_LIBNDPI_LIB}" "${STATIC_PFRING_LIB}" "${pkgcfg_lib_PCAP_pcap}" "${pkgcfg_lib_NDPI_ndpi}" + "${pkgcfg_lib_PCRE_pcre2-8}" "${pkgcfg_lib_MAXMINDDB_maxminddb}" "${pkgcfg_lib_ZLIB_z}" + "${GCRYPT_LIBRARY}" "${GCRYPT_ERROR_LIBRARY}" "${PCAP_LIBRARY}" "${LIBM_LIB}" "${PF_RING_LIB}" + "-pthread") + +target_compile_definitions(nDPIsrvd PRIVATE -D_GNU_SOURCE=1 -DPKG_VERSION=\"${PKG_VERSION}\" -DGIT_VERSION=\"${GIT_VERSION}\" ${NDPID_DEFS} ${EPOLL_DEFS}) +target_include_directories(nDPIsrvd PRIVATE ${NDPID_DEPS_INC}) + +target_compile_options(nDPId-test PRIVATE "-Wno-unused-function" "-pthread") +target_compile_definitions(nDPId-test PRIVATE -D_GNU_SOURCE=1 -DNO_MAIN=1 -DPKG_VERSION=\"${PKG_VERSION}\" -DGIT_VERSION=\"${GIT_VERSION}\" + ${NDPID_DEFS} ${EPOLL_DEFS} ${ZLIB_DEFS} ${PFRING_DEFS} ${MEMORY_STATUS_DEFS} ${NDPID_TEST_MPROF_DEFS}) +target_include_directories(nDPId-test PRIVATE + "${STATIC_LIBNDPI_INC}" "${DEFAULT_NDPI_INCLUDE}" ${NDPID_DEPS_INC} ${PFRING_KERNEL_INC} ${PFRING_INC}) +target_link_libraries(nDPId-test "${STATIC_LIBNDPI_LIB}" "${STATIC_PFRING_LIB}" "${pkgcfg_lib_PCAP_pcap}" "${pkgcfg_lib_NDPI_ndpi}" + "${pkgcfg_lib_PCRE_pcre2-8}" "${pkgcfg_lib_MAXMINDDB_maxminddb}" "${pkgcfg_lib_ZLIB_z}" + "${GCRYPT_LIBRARY}" "${GCRYPT_ERROR_LIBRARY}" "${PCAP_LIBRARY}" "${LIBM_LIB}" "${PF_RING_LIB}" + "-pthread") + +if(BUILD_EXAMPLES) + add_executable(nDPIsrvd-collectd examples/c-collectd/c-collectd.c utils.c) + if(BUILD_NDPI) + add_dependencies(nDPIsrvd-collectd libnDPI) + endif() + target_compile_definitions(nDPIsrvd-collectd PRIVATE ${NDPID_DEFS}) + target_include_directories(nDPIsrvd-collectd PRIVATE + "${STATIC_LIBNDPI_INC}" "${DEFAULT_NDPI_INCLUDE}" "${CMAKE_SOURCE_DIR}" ${NDPID_DEPS_INC}) + + add_executable(nDPIsrvd-captured examples/c-captured/c-captured.c utils.c) + if(BUILD_NDPI) + add_dependencies(nDPIsrvd-captured libnDPI) + endif() + target_compile_definitions(nDPIsrvd-captured PRIVATE ${NDPID_DEFS}) + target_include_directories(nDPIsrvd-captured PRIVATE + "${STATIC_LIBNDPI_INC}" "${DEFAULT_NDPI_INCLUDE}" "${CMAKE_SOURCE_DIR}" ${NDPID_DEPS_INC}) + target_link_libraries(nDPIsrvd-captured "${pkgcfg_lib_PCAP_pcap}" "${pkgcfg_lib_NDPI_ndpi}" + "${pkgcfg_lib_PCRE_pcre2-8}" "${pkgcfg_lib_MAXMINDDB_maxminddb}" + "${GCRYPT_LIBRARY}" "${GCRYPT_ERROR_LIBRARY}" "${PCAP_LIBRARY}") + + add_executable(nDPIsrvd-analysed examples/c-analysed/c-analysed.c utils.c) + if(BUILD_NDPI) + add_dependencies(nDPIsrvd-analysed libnDPI) + endif() + target_compile_definitions(nDPIsrvd-analysed PRIVATE ${NDPID_DEFS}) + target_include_directories(nDPIsrvd-analysed PRIVATE + "${STATIC_LIBNDPI_INC}" "${DEFAULT_NDPI_INCLUDE}" "${CMAKE_SOURCE_DIR}" ${NDPID_DEPS_INC}) + + add_executable(nDPIsrvd-simple examples/c-simple/c-simple.c) + target_compile_definitions(nDPIsrvd-simple PRIVATE ${NDPID_DEFS}) + target_include_directories(nDPIsrvd-simple PRIVATE ${NDPID_DEPS_INC}) + + if(ENABLE_COVERAGE) + add_dependencies(coverage nDPIsrvd-analysed nDPIsrvd-collectd nDPIsrvd-captured nDPIsrvd-simple) + if(BUILD_NDPI) + add_dependencies(coverage libnDPI) + endif() + endif() + + if(ENABLE_DBUS) + add_executable(nDPIsrvd-notifyd examples/c-notifyd/c-notifyd.c utils.c) + if(BUILD_NDPI) + add_dependencies(nDPIsrvd-notifyd libnDPI) + endif() + target_include_directories(nDPIsrvd-notifyd PRIVATE + "${STATIC_LIBNDPI_INC}" "${DEFAULT_NDPI_INCLUDE}" "${CMAKE_SOURCE_DIR}" "${NDPID_DEPS_INC}" + "${DBUS_INCLUDE_DIRS}") + target_link_libraries(nDPIsrvd-notifyd "${DBUS_LIBRARIES}") + install(TARGETS nDPIsrvd-notifyd DESTINATION bin) + endif() + + if(ENABLE_CURL) + add_executable(nDPIsrvd-influxd examples/c-influxd/c-influxd.c utils.c) + if(BUILD_NDPI) + add_dependencies(nDPIsrvd-influxd libnDPI) + endif() + target_include_directories(nDPIsrvd-influxd PRIVATE + "${STATIC_LIBNDPI_INC}" "${DEFAULT_NDPI_INCLUDE}" "${CMAKE_SOURCE_DIR}" "${NDPID_DEPS_INC}" + "${CURL_INCLUDE_DIRS}") + target_link_libraries(nDPIsrvd-influxd "${CURL_LIBRARIES}") + install(TARGETS nDPIsrvd-influxd DESTINATION bin) + endif() + + install(TARGETS nDPIsrvd-analysed nDPIsrvd-collectd nDPIsrvd-captured nDPIsrvd-simple DESTINATION bin) + install(FILES examples/c-collectd/plugin_nDPIsrvd.conf examples/c-collectd/rrdgraph.sh DESTINATION share/nDPId/nDPIsrvd-collectd) + install(DIRECTORY examples/c-collectd/www DESTINATION share/nDPId/nDPIsrvd-collectd) +endif() + +if(ENABLE_SYSTEMD) + configure_file(packages/systemd/ndpisrvd.service.in ndpisrvd.service @ONLY) + configure_file(packages/systemd/ndpid@.service.in ndpid@.service @ONLY) + + install(DIRECTORY DESTINATION etc/nDPId) + install(FILES "ndpid.conf.example" DESTINATION share/nDPId) + install(FILES "ndpisrvd.conf.example" DESTINATION share/nDPId) + install(FILES "${CMAKE_BINARY_DIR}/ndpisrvd.service" DESTINATION lib/systemd/system) + install(FILES "${CMAKE_BINARY_DIR}/ndpid@.service" DESTINATION lib/systemd/system) +endif() + +install(FILES config.h + dependencies/nDPIsrvd.h + dependencies/jsmn/jsmn.h + dependencies/uthash/src/utarray.h + dependencies/uthash/src/uthash.h + dependencies/uthash/src/utlist.h + dependencies/uthash/src/utringbuffer.h + dependencies/uthash/src/utstack.h + dependencies/uthash/src/utstring.h + DESTINATION include/nDPId) +install(TARGETS nDPId DESTINATION sbin) +install(TARGETS nDPIsrvd nDPId-test DESTINATION bin) +if(BUILD_EXAMPLES) + install(FILES dependencies/nDPIsrvd.py examples/py-flow-dashboard/plotly_dash.py + DESTINATION share/nDPId) + install(FILES examples/py-flow-info/flow-info.py + DESTINATION bin RENAME nDPIsrvd-flow-info.py + PERMISSIONS OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) + install(FILES examples/py-flow-dashboard/flow-dash.py + DESTINATION bin RENAME nDPIsrvd-flow-dash.py + PERMISSIONS OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) + install(FILES examples/py-json-stdout/json-stdout.py + DESTINATION bin RENAME nDPIsrvd-json-stdout.py + PERMISSIONS OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) + install(FILES examples/py-schema-validation/py-schema-validation.py + DESTINATION bin RENAME nDPIsrvd-schema-validation.py + PERMISSIONS OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) + install(FILES examples/py-semantic-validation/py-semantic-validation.py + DESTINATION bin RENAME nDPIsrvd-semantic-validation.py + PERMISSIONS OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) + install(FILES examples/py-machine-learning/sklearn-random-forest.py + DESTINATION bin RENAME nDPIsrvd-sklearn.py + PERMISSIONS OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) +endif() +install(FILES schema/error_event_schema.json schema/daemon_event_schema.json + schema/flow_event_schema.json schema/packet_event_schema.json DESTINATION share/nDPId/json-schema) + +message(STATUS "--------------------------") +message(STATUS "nDPId GIT_VERSION........: ${GIT_VERSION}") +message(STATUS "Cross Compilation........: ${CMAKE_CROSSCOMPILING}") +message(STATUS "CMAKE_BUILD_TYPE.........: ${CMAKE_BUILD_TYPE}") +message(STATUS "CMAKE_C_FLAGS............: ${CMAKE_C_FLAGS}") +message(STATUS "NDPID_DEFS...............: ${NDPID_DEFS}") +message(STATUS "FORCE_POLL...............: ${FORCE_POLL}") +message(STATUS "ENABLE_PFRING............: ${ENABLE_PFRING}") +if(ENABLE_PFRING) +message(STATUS "PFRING_LINK_STATIC.......: ${PFRING_LINK_STATIC}") +endif() +message(STATUS "ENABLE_COVERAGE..........: ${ENABLE_COVERAGE}") +message(STATUS "ENABLE_SANITIZER.........: ${ENABLE_SANITIZER}") +message(STATUS "ENABLE_SANITIZER_THREAD..: ${ENABLE_SANITIZER_THREAD}") +message(STATUS "ENABLE_MEMORY_STATUS.....: ${ENABLE_MEMORY_STATUS}") +message(STATUS "ENABLE_MEMORY_PROFILING..: ${ENABLE_MEMORY_PROFILING}") +message(STATUS "ENABLE_ZLIB..............: ${ENABLE_ZLIB}") +message(STATUS "BUILD_NDPI...............: ${BUILD_NDPI}") +message(STATUS "BUILD_EXAMPLES...........: ${BUILD_EXAMPLES}") +if(BUILD_EXAMPLES) +message(STATUS "ENABLE_DBUS..............: ${ENABLE_DBUS}") +message(STATUS "ENABLE_CURL..............: ${ENABLE_CURL}") +endif() +if(BUILD_NDPI) +message(STATUS "NDPI_ADDITIONAL_ARGS.....: ${NDPI_ADDITIONAL_ARGS}") +endif() +message(STATUS "NDPI_NO_PKGCONFIG........: ${NDPI_NO_PKGCONFIG}") +message(STATUS "--------------------------") +if(PFRING_INSTALLDIR) +message(STATUS "PFRING_INSTALLDIR........: ${PFRING_INSTALLDIR}") +message(STATUS "- PFRING_INC.............: ${PFRING_INC}") +message(STATUS "- PFRING_KERNEL_INC......: ${PFRING_KERNEL_INC}") +message(STATUS "- STATIC_PFRING_LIB......: ${STATIC_PFRING_LIB}") +message(STATUS "- SHARED_PFRING_LIB......: ${PF_RING_LIB}") +message(STATUS "--------------------------") +endif() +if(STATIC_LIBNDPI_INSTALLDIR) +message(STATUS "STATIC_LIBNDPI_INSTALLDIR: ${STATIC_LIBNDPI_INSTALLDIR}") +endif() +if(STATIC_LIBNDPI_INSTALLDIR OR BUILD_NDPI OR NDPI_NO_PKGCONFIG) +message(STATUS "- STATIC_LIBNDPI_INC.....: ${STATIC_LIBNDPI_INC}") +message(STATUS "- STATIC_LIBNDPI_LIB.....: ${STATIC_LIBNDPI_LIB}") +message(STATUS "- NDPI_WITH_GCRYPT.......: ${NDPI_WITH_GCRYPT}") +message(STATUS "- NDPI_WITH_PCRE.........: ${NDPI_WITH_PCRE}") +message(STATUS "- NDPI_WITH_MAXMINDDB....: ${NDPI_WITH_MAXMINDDB}") +endif() +if(NOT STATIC_LIBNDPI_INSTALLDIR AND NOT BUILD_NDPI) +message(STATUS "- DEFAULT_NDPI_INCLUDE...: ${DEFAULT_NDPI_INCLUDE}") +endif() +if(NOT NDPI_NO_PKGCONFIG) +message(STATUS "- pkgcfg_lib_NDPI_ndpi...: ${pkgcfg_lib_NDPI_ndpi}") +endif() +message(STATUS "--------------------------") |