cmake_minimum_required (VERSION 3.1) project (opendht) set (opendht_VERSION_MAJOR 1) set (opendht_VERSION_MINOR 8.2) set (opendht_VERSION ${opendht_VERSION_MAJOR}.${opendht_VERSION_MINOR}) set (PACKAGE_VERSION ${opendht_VERSION}) set (VERSION "${opendht_VERSION}") # Options option (OPENDHT_STATIC "Build static library" ON) option (OPENDHT_SHARED "Build shared library" ON) option (OPENDHT_LOG "Build with logs" ON) option (OPENDHT_PYTHON "Build Python bindings" OFF) option (OPENDHT_TOOLS "Build DHT tools" ON) option (OPENDHT_SYSTEMD "Install systemd module" OFF) option (OPENDHT_ARGON2 "Use included argon2 sources" OFF) option (OPENDHT_LTO "Build with LTO" OFF) option (OPENDHT_SANITIZE "Build with address sanitizer and stack protector" OFF) option (OPENDHT_PROXY_SERVER "Enable DHT proxy server, use Restbed and jsoncpp" OFF) option (OPENDHT_PUSH_NOTIFICATIONS "Enable push notifications support" OFF) option (OPENDHT_PROXY_SERVER_IDENTITY "Allow clients to use the node identity" OFF) option (OPENDHT_PROXY_CLIENT "Enable DHT proxy client, use Restbed and jsoncpp" OFF) option (OPENDHT_INDEX "Build DHT indexation feature" OFF) option (OPENDHT_TESTS "Add unit tests executable" OFF) find_package(Doxygen) option (OPENDHT_DOCUMENTATION "Create and install the HTML based API documentation (requires Doxygen)" ${DOXYGEN_FOUND}) # Dependencies list (APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake") find_package (Threads) find_package (PkgConfig) find_package (GnuTLS 3.3 REQUIRED) pkg_search_module (Nettle nettle) find_package (Msgpack 1.2 REQUIRED) if (OPENDHT_TOOLS) find_package (Readline 6 REQUIRED) endif () if (NOT OPENDHT_ARGON2) find_package(PkgConfig) pkg_search_module(argon2 libargon2) if (argon2_FOUND) message("Argon2 found " ${argon2_req}) set(argon2_lib ", libargon2") else () message("Argon2 not found, using included version.") set(OPENDHT_ARGON2 ON) endif() endif () pkg_search_module(Jsoncpp jsoncpp) if (Jsoncpp_FOUND) add_definitions(-DOPENDHT_JSONCPP) list (APPEND opendht_SOURCES src/base64.h src/base64.cpp ) endif() if (OPENDHT_PROXY_SERVER OR OPENDHT_PROXY_CLIENT) find_package(Restbed REQUIRED) if (NOT Jsoncpp_FOUND) message(SEND_ERROR "Jsoncpp is required for DHT proxy support") endif() endif() # Build flags set (CMAKE_CXX_STANDARD 11) set (CMAKE_CXX_STANDARD_REQUIRED on) set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-return-type -Wall -Wextra -Wnon-virtual-dtor -pedantic-errors -fvisibility=hidden") if (OPENDHT_SANITIZE) set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fstack-protector-strong") endif () set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DMSGPACK_DISABLE_LEGACY_NIL -DMSGPACK_DISABLE_LEGACY_CONVERT") if (NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE Release) endif () if (OPENDHT_LOG) add_definitions(-DOPENDHT_LOG=true) else () add_definitions(-DOPENDHT_LOG=false) endif() if (OPENDHT_LTO) set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -flto") if (CMAKE_COMPILER_IS_GNUCC) set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fuse-linker-plugin") set (CMAKE_AR "gcc-ar") set (CMAKE_NM "gcc-nm") set (CMAKE_RANLIB "gcc-ranlib") endif () endif () if (MSGPACK_INCLUDE_DIRS) include_directories (SYSTEM "${MSGPACK_INCLUDE_DIRS}") endif () if (GNUTLS_INCLUDE_DIRS) include_directories (SYSTEM "${GNUTLS_INCLUDE_DIRS}") endif () if (Nettle_INCLUDE_DIRS) include_directories (SYSTEM "${Nettle_INCLUDE_DIRS}") endif () if (Restbed_INCLUDE_DIR) include_directories (SYSTEM "${Restbed_INCLUDE_DIR}") endif () if (Jsoncpp_INCLUDE_DIRS) include_directories (SYSTEM "${Jsoncpp_INCLUDE_DIRS}") endif () link_directories (${Nettle_LIBRARY_DIRS}) link_directories (${Jsoncpp_LIBRARY_DIRS}) include_directories ( ./ include/ include/opendht/ ${CMAKE_CURRENT_BINARY_DIR}/include/ ) # Install dirs include (GNUInstallDirs) set (prefix ${CMAKE_INSTALL_PREFIX}) set (exec_prefix "\${prefix}") set (libdir "\${exec_prefix}/${CMAKE_INSTALL_LIBDIR}") set (includedir "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}") set (bindir "${CMAKE_INSTALL_FULL_BINDIR}") set (sysconfdir "${CMAKE_INSTALL_FULL_SYSCONFDIR}") set (top_srcdir "${CMAKE_CURRENT_SOURCE_DIR}") # Sources list (APPEND opendht_SOURCES src/utils.cpp src/infohash.cpp src/crypto.cpp src/default_types.cpp src/node.cpp src/value.cpp src/dht.cpp src/op_cache.cpp src/storage.h src/listener.h src/search.h src/value_cache.h src/op_cache.h src/net.h src/parsed_message.h src/request.h src/callbacks.cpp src/routing_table.cpp src/node_cache.cpp src/network_engine.cpp src/securedht.cpp src/dhtrunner.cpp src/log.cpp ) list (APPEND opendht_HEADERS include/opendht/def.h include/opendht/utils.h include/opendht/sockaddr.h include/opendht/rng.h include/opendht/crypto.h include/opendht/infohash.h include/opendht/default_types.h include/opendht/node.h include/opendht/value.h include/opendht/dht.h include/opendht/dht_interface.h include/opendht/callbacks.h include/opendht/routing_table.h include/opendht/node_cache.h include/opendht/network_engine.h include/opendht/scheduler.h include/opendht/rate_limiter.h include/opendht/securedht.h include/opendht/log.h include/opendht/log_enable.h include/opendht.h ) if (OPENDHT_INDEX) list (APPEND opendht_SOURCES src/indexation/pht.cpp) list (APPEND opendht_HEADERS include/opendht/indexation/pht.h) add_definitions(-DOPENDHT_INDEXATION) endif() if (OPENDHT_PROXY_SERVER) add_definitions(-DOPENDHT_PROXY_SERVER) if (OPENDHT_PROXY_SERVER_IDENTITY) add_definitions(-DOPENDHT_PROXY_SERVER_IDENTITY) endif() list (APPEND opendht_HEADERS include/opendht/dht_proxy_server.h ) list (APPEND opendht_SOURCES src/thread_pool.h src/thread_pool.cpp src/dht_proxy_server.cpp ) endif () if (OPENDHT_PROXY_CLIENT) add_definitions(-DOPENDHT_PROXY_CLIENT) list (APPEND opendht_HEADERS include/opendht/dht_proxy_client.h ) list (APPEND opendht_SOURCES src/dht_proxy_client.cpp ) endif () if (OPENDHT_PROXY_SERVER OR OPENDHT_PROXY_CLIENT) if (OPENDHT_PUSH_NOTIFICATIONS) message("Using push notification") add_definitions(-DOPENDHT_PUSH_NOTIFICATIONS) endif () list (APPEND opendht_HEADERS include/opendht/proxy.h ) endif () if(OPENDHT_ARGON2) # make sure argon2 submodule is up to date and initialized message("Initializing Argon2 submodule") execute_process(COMMAND git submodule update --init) # add local argon2 files to build list (APPEND opendht_SOURCES argon2/src/argon2.c argon2/src/core.c argon2/src/blake2/blake2b.c argon2/src/thread.c argon2/src/ref.c argon2/src/encoding.c ) include_directories(argon2/include/) endif() # Targets if (OPENDHT_STATIC) add_library (opendht-static STATIC ${opendht_SOURCES} ${opendht_HEADERS} ) set_target_properties (opendht-static PROPERTIES OUTPUT_NAME "opendht") if (OPENDHT_ARGON2) target_include_directories(opendht-static SYSTEM PRIVATE argon2) else () target_include_directories(opendht-static SYSTEM PRIVATE ${argon2_INCLUDE_DIRS}) endif () target_link_libraries(opendht-static PRIVATE ${Restbed_LIBRARY} ${argon2_LIBRARIES} PUBLIC ${CMAKE_THREAD_LIBS_INIT} ${GNUTLS_LIBRARIES} ${Nettle_LIBRARIES} ${Jsoncpp_LIBRARIES}) install (TARGETS opendht-static DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT opendht) endif () if (OPENDHT_SHARED) add_library (opendht SHARED ${opendht_SOURCES} ${opendht_HEADERS} ) set_target_properties (opendht PROPERTIES IMPORT_SUFFIX "_import.lib") set_target_properties (opendht PROPERTIES SOVERSION ${opendht_VERSION_MAJOR} VERSION ${opendht_VERSION}) target_compile_definitions(opendht PRIVATE OPENDHT_BUILD) if (OPENDHT_ARGON2) target_include_directories(opendht SYSTEM PRIVATE argon2) else () target_link_libraries(opendht PRIVATE ${argon2_LIBRARIES}) target_include_directories(opendht SYSTEM PRIVATE ${argon2_INCLUDE_DIRS}) endif () target_link_libraries(opendht PRIVATE ${CMAKE_THREAD_LIBS_INIT} ${GNUTLS_LIBRARIES} ${Nettle_LIBRARIES} ${Restbed_LIBRARY} ${Jsoncpp_LIBRARIES}) install (TARGETS opendht DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT opendht) endif () if (OPENDHT_TOOLS) add_subdirectory(tools) endif () add_subdirectory(doc) if (OPENDHT_PYTHON) add_subdirectory(python) endif () # CMake module include(CMakePackageConfigHelpers) write_basic_package_version_file("${CMAKE_CURRENT_BINARY_DIR}/opendhtConfigVersion.cmake" VERSION ${opendht_VERSION} COMPATIBILITY AnyNewerVersion ) # PkgConfig module configure_file ( opendht.pc.in opendht.pc @ONLY ) # Install targets install (DIRECTORY include DESTINATION ${CMAKE_INSTALL_PREFIX}) install (FILES ${CMAKE_CURRENT_BINARY_DIR}/opendht.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) install (EXPORT opendht DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/opendht FILE opendhtConfig.cmake) install (FILES ${CMAKE_CURRENT_BINARY_DIR}/opendhtConfigVersion.cmake DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/opendht) # Unit tests if (OPENDHT_TESTS) FIND_PACKAGE(Cppunit REQUIRED) # unit testing list (APPEND test_FILES tests/infohashtester.h tests/infohashtester.cpp tests/valuetester.h tests/valuetester.cpp tests/cryptotester.h tests/cryptotester.cpp tests/dhtrunnertester.h tests/dhtrunnertester.cpp ) if (OPENDHT_PROXY_SERVER AND OPENDHT_PROXY_CLIENT) list (APPEND test_FILES tests/dhtproxytester.h tests/dhtproxytester.cpp ) endif() add_executable(opendht_unit_tests tests/tests_runner.cpp ${test_FILES} ) target_include_directories(opendht_unit_tests SYSTEM PRIVATE ${CPPUNIT_INCLUDE_DIRS}) if (OPENDHT_SHARED) target_link_libraries(opendht_unit_tests opendht) else () target_link_libraries(opendht_unit_tests opendht-static) endif () target_link_libraries(opendht_unit_tests ${CMAKE_THREAD_LIBS_INIT} ${CPPUNIT_LIBRARIES} ${GNUTLS_LIBRARIES} ) enable_testing() add_test(TEST opendht_unit_tests) endif()