mirror of
https://github.com/ntop/n2n.git
synced 2024-09-19 16:41:11 +02:00
7c7072ff7c
This is a only exception while all other libraries are dynamically linked. The "TODO" does not make any sense as libcap provides both dynamic and static libraries. There is not reason to explain why it needs to be statically linked 'especially' as dynamic linking works very well. Then just make it dynamically-linked by default, which also matches the behaviour on autotools. Compiled and tested on aarch64, no errors found. Signed-off-by: Tianling Shen <i@cnsztl.eu.org>
334 lines
11 KiB
CMake
334 lines
11 KiB
CMake
project(n2n)
|
|
cmake_minimum_required(VERSION 2.6)
|
|
include(CheckFunctionExists)
|
|
SET(CMAKE_VERBOSE_MAKEFILE ON)
|
|
|
|
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
|
|
|
# N2n release information
|
|
execute_process(
|
|
COMMAND scripts/version.sh
|
|
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
|
|
OUTPUT_VARIABLE PACKAGE_VERSION
|
|
RESULT_VARIABLE GIT_ERROR_CODE
|
|
)
|
|
if (NOT GIT_ERROR_CODE EQUAL 0)
|
|
# - if we can run version.sh and it exits with an error that is signaling
|
|
# a build failure.
|
|
# - if we are on windows with no MSYS or Cygwin, we cannot run version.sh
|
|
# which is the fallback case handled below
|
|
# TODO: Distinguish between these two cases
|
|
|
|
# Fallback to just using the non dynamic short version string
|
|
file(STRINGS VERSION PACKAGE_VERSION)
|
|
endif (NOT GIT_ERROR_CODE EQUAL 0)
|
|
|
|
string(STRIP "${PACKAGE_VERSION}" PACKAGE_VERSION)
|
|
MESSAGE(STATUS "Build for version: ${PACKAGE_VERSION}")
|
|
|
|
add_definitions(-DCMAKE_BUILD)
|
|
add_definitions(-DPACKAGE_OSNAME="${CMAKE_SYSTEM_NAME}")
|
|
add_definitions(-DPACKAGE_VERSION="${PACKAGE_VERSION}")
|
|
|
|
# third-party directory
|
|
set(THIRD_PARTY_DIR ${CMAKE_SOURCE_DIR}/thirdparty)
|
|
|
|
# Build information
|
|
OPTION(BUILD_SHARED_LIBS "BUILD Shared Library" OFF)
|
|
|
|
# N2n specific params
|
|
OPTION(N2N_OPTION_USE_PTHREAD "USE PTHREAD Library" OFF)
|
|
OPTION(N2N_OPTION_USE_OPENSSL "USE OPENSSL Library" OFF)
|
|
OPTION(N2N_OPTION_USE_CAPLIB "USE CAP Library" OFF)
|
|
OPTION(N2N_OPTION_USE_PCAPLIB "USE PCAP Library" OFF)
|
|
OPTION(N2N_OPTION_USE_ZSTD "USE ZSTD Library" OFF)
|
|
OPTION(N2N_OPTION_USE_PORTMAPPING "USE MINIUPNP and NATPMP Libraries" OFF)
|
|
|
|
|
|
if(N2N_OPTION_USE_PTHREAD)
|
|
find_library(PTHREAD_LIB pthread)
|
|
if(NOT PTHREAD_LIB)
|
|
MESSAGE(FATAL_ERROR "libpthread not found.")
|
|
endif(NOT PTHREAD_LIB)
|
|
MESSAGE(STATUS "Using libpthread.")
|
|
ADD_DEFINITIONS("-DHAVE_PTHREAD")
|
|
endif(N2N_OPTION_USE_PTHREAD)
|
|
|
|
if(N2N_OPTION_USE_OPENSSL)
|
|
find_package(OpenSSL QUIET)
|
|
if(NOT OPENSSL_FOUND)
|
|
MESSAGE(FATAL_ERROR "OpenSSL not found.")
|
|
endif(NOT OPENSSL_FOUND)
|
|
MESSAGE(STATUS "Found OpenSSL ${OPENSSL_VERSION}")
|
|
string(COMPARE GREATER "${OPENSSL_VERSION}" "1.1" OPENSSL_V11)
|
|
if(NOT OPENSSL_V11)
|
|
MESSAGE(FATAL_ERROR "OpenSSL too old")
|
|
endif()
|
|
include_directories(${OPENSSL_INCLUDE_DIR})
|
|
add_definitions(-DHAVE_OPENSSL_1_1)
|
|
endif(N2N_OPTION_USE_OPENSSL)
|
|
|
|
if(N2N_OPTION_USE_ZSTD)
|
|
find_library(LIBZSTD zstd)
|
|
if(NOT LIBZSTD)
|
|
MESSAGE(FATAL_ERROR "libzstd not found.")
|
|
endif(NOT LIBZSTD)
|
|
MESSAGE(STATUS "Using libztd.")
|
|
add_definitions(-DHAVE_ZSTD)
|
|
endif(N2N_OPTION_USE_ZSTD)
|
|
|
|
if(N2N_OPTION_USE_PCAPLIB)
|
|
find_library(PCAP_LIB pcap)
|
|
if(NOT PCAP_LIB)
|
|
MESSAGE(FATAL_ERROR "libpcap not found.")
|
|
endif(NOT PCAP_LIB)
|
|
|
|
# Set var needed for check_function_exists()
|
|
set(CMAKE_REQUIRED_LIBRARIES ${PCAP_LIB})
|
|
|
|
# TODO
|
|
# - pcap_set_immediate_mode has been available since libpcap 1.5 in 2013
|
|
# probably should remove this check
|
|
check_function_exists(pcap_set_immediate_mode HAVE_PCAP_IMMEDIATE_MODE)
|
|
IF(NOT HAVE_PCAP_IMMEDIATE_MODE)
|
|
MESSAGE(FATAL_ERROR "libpcap not support pcap_set_immediate_mode()")
|
|
ENDIF(NOT HAVE_PCAP_IMMEDIATE_MODE)
|
|
MESSAGE(STATUS "Using libpcap.")
|
|
|
|
ADD_DEFINITIONS("-DHAVE_PCAP_IMMEDIATE_MODE")
|
|
add_executable(n2n-decode tools/n2n-decode.c)
|
|
target_link_libraries(n2n-decode n2n pcap)
|
|
install(TARGETS n2n-decode RUNTIME DESTINATION bin)
|
|
|
|
endif(N2N_OPTION_USE_PCAPLIB)
|
|
|
|
if(N2N_OPTION_USE_CAPLIB)
|
|
# Linux Capabilities
|
|
find_library(CAP_LIB cap)
|
|
if(NOT CAP_LIB)
|
|
MESSAGE(FATAL_ERROR "libcap not found.")
|
|
endif(NOT CAP_LIB)
|
|
MESSAGE(STATUS "Using libcap.")
|
|
|
|
ADD_DEFINITIONS("-DHAVE_LIBCAP")
|
|
|
|
endif(N2N_OPTION_USE_CAPLIB)
|
|
|
|
if(N2N_OPTION_USE_PORTMAPPING)
|
|
ADD_DEFINITIONS("-DHAVE_MINIUPNP")
|
|
include_directories(${THIRD_PARTY_DIR}/miniupnp/miniupnpc/include)
|
|
add_subdirectory(${THIRD_PARTY_DIR}/miniupnp/miniupnpc lib_miniupnpc)
|
|
link_directories(${PROJECT_BINARY_DIR}/lib_miniupnpc)
|
|
|
|
ADD_DEFINITIONS("-DHAVE_NATPMP")
|
|
include_directories(${THIRD_PARTY_DIR}/libnatpmp)
|
|
add_subdirectory(${THIRD_PARTY_DIR}/libnatpmp libnatpmp)
|
|
link_directories(${PROJECT_BINARY_DIR}/libnatpmp)
|
|
|
|
# TODO:
|
|
# - this is the odd one out, is it needed?
|
|
include_directories(${PROJECT_BINARY_DIR}/lib_miniupnpc)
|
|
endif(N2N_OPTION_USE_PORTMAPPING)
|
|
|
|
|
|
if(NOT DEFINED CMAKE_BUILD_TYPE)
|
|
set(CMAKE_BUILD_TYPE None)
|
|
endif(NOT DEFINED CMAKE_BUILD_TYPE)
|
|
#set(CMAKE_BUILD_TYPE Debug)
|
|
#set(CMAKE_BUILD_TYPE Release)
|
|
|
|
if (DEFINED UNIX)
|
|
# None
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wshadow -Wpointer-arith -Wmissing-declarations -Wnested-externs")
|
|
set(CMAKE_CXX_FLAGS "-Wall -Wshadow -Wpointer-arith -Wmissing-declarations -Wnested-externs")
|
|
# Debug
|
|
set(CMAKE_C_FLAGS_DEBUG "-g")
|
|
set(CMAKE_CXX_FLAGS_DEBUG "-g")
|
|
# Release
|
|
set(CMAKE_C_FLAGS_RELEASE "-O2 -DNDEBUG")
|
|
set(CMAKE_CXX_FLAGS_RELEASE "-O2 -DNDEBUG")
|
|
endif(DEFINED UNIX)
|
|
|
|
# Static target.
|
|
#SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -static")
|
|
|
|
|
|
INCLUDE_DIRECTORIES(.)
|
|
INCLUDE_DIRECTORIES(include)
|
|
if(DEFINED WIN32)
|
|
INCLUDE_DIRECTORIES(win32)
|
|
# Customize include.
|
|
# INCLUDE_DIRECTORIES("D:/Program Files/MinGW/opt/include/" "D:/Program Files/MinGW/x86_64-w64-mingw32/include/")
|
|
# Customize library.
|
|
# LINK_DIRECTORIES("D:/Program Files/MinGW/opt/lib/" "D:/Program Files/MinGW/x86_64-w64-mingw32/lib/")
|
|
endif(DEFINED WIN32)
|
|
|
|
|
|
#aux_source_directory(./src N2N_DIR_SRCS)
|
|
#add_library(n2n STATIC ${N2N_DIR_SRCS})
|
|
add_library(n2n STATIC
|
|
src/n2n.c
|
|
src/edge_management.c
|
|
src/edge_utils.c
|
|
src/sn_management.c
|
|
src/sn_utils.c
|
|
src/wire.c
|
|
src/hexdump.c
|
|
src/minilzo.c
|
|
src/tf.c
|
|
src/cc20.c
|
|
src/transform_null.c
|
|
src/transform_tf.c
|
|
src/transform_aes.c
|
|
src/transform_cc20.c
|
|
src/transform_speck.c
|
|
src/transform_lzo.c
|
|
src/transform_zstd.c
|
|
src/aes.c
|
|
src/speck.c
|
|
src/random_numbers.c
|
|
src/management.c
|
|
src/pearson.c
|
|
src/header_encryption.c
|
|
src/tuntap_freebsd.c
|
|
src/tuntap_netbsd.c
|
|
src/tuntap_linux.c
|
|
src/tuntap_osx.c
|
|
src/n2n_regex.c
|
|
src/network_traffic_filter.c
|
|
src/sn_selection.c
|
|
src/auth.c
|
|
src/curve25519.c
|
|
src/n2n_port_mapping.c
|
|
src/json.c)
|
|
|
|
|
|
if(DEFINED WIN32)
|
|
add_library(edge_utils_win32 src/edge_utils_win32.c)
|
|
add_subdirectory(win32)
|
|
target_link_libraries(n2n edge_utils_win32 n2n_win32 iphlpapi)
|
|
endif(DEFINED WIN32)
|
|
|
|
add_executable(edge src/edge.c)
|
|
target_link_libraries(edge n2n)
|
|
|
|
add_executable(supernode src/supernode.c)
|
|
target_link_libraries(supernode n2n)
|
|
|
|
add_executable(example_edge_embed_quick_edge_init src/example_edge_embed_quick_edge_init.c)
|
|
target_link_libraries(example_edge_embed_quick_edge_init n2n)
|
|
|
|
add_executable(example_edge_embed src/example_edge_embed.c)
|
|
target_link_libraries(example_edge_embed n2n)
|
|
|
|
add_executable(example_sn_embed src/example_sn_embed.c)
|
|
target_link_libraries(example_sn_embed n2n)
|
|
|
|
if(N2N_OPTION_USE_PTHREAD)
|
|
target_link_libraries(n2n pthread)
|
|
endif(N2N_OPTION_USE_PTHREAD)
|
|
|
|
if(N2N_OPTION_USE_OPENSSL)
|
|
# target_link_libraries(n2n crypto)
|
|
target_link_libraries(n2n ${OPENSSL_LIBRARIES})
|
|
endif(N2N_OPTION_USE_OPENSSL)
|
|
|
|
if(N2N_OPTION_USE_ZSTD)
|
|
target_link_libraries(n2n zstd)
|
|
endif(N2N_OPTION_USE_ZSTD)
|
|
|
|
if(N2N_OPTION_USE_CAPLIB)
|
|
target_link_libraries(edge cap)
|
|
endif(N2N_OPTION_USE_CAPLIB)
|
|
|
|
if(N2N_OPTION_USE_PORTMAPPING)
|
|
target_link_libraries(n2n libminiupnpc-static)
|
|
target_link_libraries(n2n natpmp)
|
|
endif(N2N_OPTION_USE_PORTMAPPING)
|
|
|
|
install(TARGETS edge supernode
|
|
RUNTIME DESTINATION sbin
|
|
LIBRARY DESTINATION lib
|
|
ARCHIVE DESTINATION lib
|
|
)
|
|
|
|
|
|
# Tools
|
|
add_executable(n2n-benchmark tools/n2n-benchmark.c)
|
|
target_link_libraries(n2n-benchmark n2n)
|
|
add_executable(n2n-keygen tools/n2n-keygen.c)
|
|
target_link_libraries(n2n-keygen n2n)
|
|
add_executable(n2n-route tools/n2n-route.c)
|
|
target_link_libraries(n2n-route n2n)
|
|
add_executable(n2n-portfwd tools/n2n-portfwd.c)
|
|
target_link_libraries(n2n-portfwd n2n)
|
|
|
|
add_executable(tests-auth tools/tests-auth.c)
|
|
target_link_libraries(tests-auth n2n)
|
|
add_executable(tests-compress tools/tests-compress.c)
|
|
target_link_libraries(tests-compress n2n)
|
|
add_executable(tests-elliptic tools/tests-elliptic.c)
|
|
target_link_libraries(tests-elliptic n2n)
|
|
add_executable(tests-hashing tools/tests-hashing.c)
|
|
target_link_libraries(tests-hashing n2n)
|
|
add_executable(tests-transform tools/tests-transform.c)
|
|
target_link_libraries(tests-transform n2n)
|
|
add_executable(tests-wire tools/tests-wire.c)
|
|
target_link_libraries(tests-wire n2n)
|
|
|
|
install(TARGETS n2n-benchmark RUNTIME DESTINATION bin)
|
|
|
|
# Documentation
|
|
if(DEFINED UNIX)
|
|
add_dependencies(n2n doc)
|
|
file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/doc)
|
|
add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/doc/edge.8.gz
|
|
COMMAND gzip -c ${PROJECT_SOURCE_DIR}/edge.8 > ${PROJECT_BINARY_DIR}/doc/edge.8.gz
|
|
DEPENDS ${PROJECT_SOURCE_DIR}/edge.8
|
|
)
|
|
|
|
add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/doc/supernode.1.gz
|
|
COMMAND gzip -c ${PROJECT_SOURCE_DIR}/supernode.1 > ${PROJECT_BINARY_DIR}/doc/supernode.1.gz
|
|
DEPENDS ${PROJECT_SOURCE_DIR}/supernode.1
|
|
)
|
|
|
|
add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/doc/n2n.7.gz
|
|
COMMAND gzip -c ${PROJECT_SOURCE_DIR}/n2n.7 > ${PROJECT_BINARY_DIR}/doc/n2n.7.gz
|
|
DEPENDS ${PROJECT_SOURCE_DIR}/n2n.7
|
|
)
|
|
|
|
add_custom_target(doc DEPENDS ${PROJECT_BINARY_DIR}/doc/edge.8.gz
|
|
${PROJECT_BINARY_DIR}/doc/supernode.1.gz
|
|
${PROJECT_BINARY_DIR}/doc/n2n.7.gz
|
|
)
|
|
|
|
set_source_files_properties(${PROJECT_BINARY_DIR}/doc/edge.8.gz
|
|
${PROJECT_BINARY_DIR}/doc/supernode.1.gz
|
|
${PROJECT_BINARY_DIR}/doc/n2n.7.gz
|
|
PROPERTIES GENERATED 1)
|
|
|
|
install(FILES ${PROJECT_BINARY_DIR}/doc/edge.8.gz
|
|
DESTINATION /usr/share/man/man8)
|
|
install(FILES ${PROJECT_BINARY_DIR}/doc/supernode.1.gz
|
|
DESTINATION /usr/share/man/man1)
|
|
install(FILES ${PROJECT_BINARY_DIR}/doc/n2n.7.gz
|
|
DESTINATION /usr/share/man/man7)
|
|
endif(DEFINED UNIX)
|
|
|
|
if (CMAKE_SYSTEM_NAME STREQUAL Linux)
|
|
|
|
# TODO:
|
|
# - Add the right dependancy so that the tests binaries get built first
|
|
enable_testing()
|
|
add_test(NAME unit
|
|
COMMAND ${CMAKE_COMMAND} -E env
|
|
TOPDIR=${PROJECT_SOURCE_DIR} BINDIR=${PROJECT_BINARY_DIR}
|
|
${PROJECT_SOURCE_DIR}/scripts/test_harness.sh ${PROJECT_SOURCE_DIR}/tests/tests_units.list
|
|
)
|
|
add_test(NAME integration
|
|
COMMAND ${CMAKE_COMMAND} -E env
|
|
TOPDIR=${PROJECT_SOURCE_DIR} BINDIR=${PROJECT_BINARY_DIR}
|
|
${PROJECT_SOURCE_DIR}/scripts/test_harness.sh ${PROJECT_SOURCE_DIR}/tests/tests_integration.list
|
|
)
|
|
endif()
|