blob: d78795898045cf06935d6c780b9e9d5544eb1e3c [file] [log] [blame]
Adrien Béraud53bc4452023-07-12 11:15:13 -04001cmake_minimum_required(VERSION 3.16)
Adrien Béraudd50178b2023-07-09 21:41:12 -04002project(dhtnet
3 VERSION 0.0.1
4 LANGUAGES CXX
5 DESCRIPTION "A C++ library for NAT traversal and secure communication")
Adrien Béraud612b55b2023-05-29 10:42:04 -04006
7set(CMAKE_CXX_STANDARD 17)
8set(CMAKE_CXX_STANDARD_REQUIRED ON)
Adrien Béraudefe27372023-05-27 18:56:29 -04009include(CTest)
Adrien Béraud665d1112023-06-01 19:03:57 -040010include(GNUInstallDirs)
Adrien Bérauda4030cd2023-06-21 09:35:40 -040011set (prefix ${CMAKE_INSTALL_PREFIX})
12set (exec_prefix "\${prefix}")
13set (libdir "${CMAKE_INSTALL_FULL_LIBDIR}")
14set (includedir "${CMAKE_INSTALL_FULL_INCLUDEDIR}")
Adrien Béraudd50178b2023-07-09 21:41:12 -040015set (VERSION ${CMAKE_PROJECT_VERSION})
Adrien Béraud612b55b2023-05-29 10:42:04 -040016
17find_package (PkgConfig REQUIRED)
Adrien Béraud20649b52023-07-14 14:16:31 -040018
19find_package(msgpack-cxx CONFIG)
Adrien Béraud883c7652023-07-21 13:16:11 -040020if(msgpack-cxx_FOUND)
21 set(MSGPACK_LIB msgpack-cxx)
22else()
Adrien Béraud20649b52023-07-14 14:16:31 -040023 find_package(msgpackc-cxx CONFIG REQUIRED NAMES msgpackc-cxx msgpack)
Adrien Béraud883c7652023-07-21 13:16:11 -040024 set(MSGPACK_LIB msgpackc-cxx)
Adrien Bérauddbb06862023-07-08 09:18:39 -040025endif()
26
Adrien Béraudefe27372023-05-27 18:56:29 -040027find_package(fmt)
Adrien Béraud612b55b2023-05-29 10:42:04 -040028pkg_check_modules (opendht REQUIRED IMPORTED_TARGET opendht>=2.6.0)
29pkg_check_modules (pjproject REQUIRED IMPORTED_TARGET libpjproject)
30
31set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DMSGPACK_NO_BOOST -DMSGPACK_DISABLE_LEGACY_NIL -DMSGPACK_DISABLE_LEGACY_CONVERT")
32
Adrien Beraudb975dbf2023-08-22 17:33:42 -040033option(BUILD_TOOLS "Build dnc" ON)
Adrien Béraud370257c2023-08-15 20:53:09 -040034option(DHTNET_PUPNP "Enable UPnP support" ON)
35option(DHTNET_NATPMP "Enable NAT-PMP support" ON)
Adrien Beraudb975dbf2023-08-22 17:33:42 -040036option(DHTNET_TESTABLE "Enable API for tests" ON)
Adrien Béraud370257c2023-08-15 20:53:09 -040037
Adrien Béraud612b55b2023-05-29 10:42:04 -040038# Sources
39list (APPEND dhtnet_SOURCES
40 src/connectionmanager.cpp
41 src/ice_transport.cpp
42 src/multiplexed_socket.cpp
43 src/peer_connection.cpp
44 src/string_utils.cpp
45 src/fileutils.cpp
Adrien Béraud80c14e12023-07-18 16:13:15 -040046 src/ip_utils.cpp
Adrien Béraud612b55b2023-05-29 10:42:04 -040047 src/security/tls_session.cpp
48 src/security/certstore.cpp
49 src/security/threadloop.cpp
Adrien Béraud45dfac92023-07-19 00:08:50 -040050 src/security/diffie-hellman.cpp
Adrien Bérauda1d294f2023-07-17 22:42:13 -040051 src/turn/turn_cache.cpp
52 src/turn/turn_transport.cpp
Morteza Namvar5f639522023-07-04 17:08:58 -040053 src/upnp/upnp_context.cpp
54 src/upnp/upnp_control.cpp
55 src/upnp/protocol/mapping.cpp
Adrien Béraud80c14e12023-07-18 16:13:15 -040056 src/upnp/protocol/igd.cpp
Adrien Béraud612b55b2023-05-29 10:42:04 -040057)
58
59list (APPEND dhtnet_HEADERS
Adrien Béraud149f29e2023-07-05 14:47:49 -040060 include/connectionmanager.h
61 include/multiplexed_socket.h
62 include/tls_session.h
63 include/certstore.h
64 include/ice_options.h
Adrien Béraud6de3f882023-07-06 12:56:29 -040065 include/ice_transport.h
Adrien Béraudcb121f82023-07-08 09:18:39 -040066 include/ice_transport_factory.h
Adrien Béraudaa8c4422023-07-07 11:40:36 -040067 include/ice_socket.h
Adrien Béraud149f29e2023-07-05 14:47:49 -040068 include/fileutils.h
69 include/string_utils.h
70 include/ip_utils.h
71 include/upnp/mapping.h
72 include/upnp/upnp_context.h
73 include/upnp/upnp_control.h
Adrien Béraud612b55b2023-05-29 10:42:04 -040074)
75
Adrien Béraud370257c2023-08-15 20:53:09 -040076if (DHTNET_PUPNP)
77 pkg_search_module (upnp IMPORTED_TARGET upnp libupnp)
78 if (NOT upnp_FOUND)
79 message("libupnp not found: disabling")
80 set(DHTNET_PUPNP Off)
81 else()
82 list (APPEND dhtnet_SOURCES
83 src/upnp/protocol/pupnp/pupnp.cpp
84 src/upnp/protocol/pupnp/upnp_igd.cpp
85 )
Adrien Béraudadac7cf2023-08-16 15:28:33 -040086 set (requiresprivate "${requiresprivate} libupnp")
Adrien Béraud370257c2023-08-15 20:53:09 -040087 endif()
88endif()
89if (DHTNET_NATPMP)
90 pkg_search_module (natpmp IMPORTED_TARGET natpmp)
91 if (NOT natpmp_FOUND)
92 find_library(natpmp_LIBRARIES natpmp)
93 if (NOT natpmp_LIBRARIES)
94 message("NAT-PMP not found: disabling")
95 set(DHTNET_NATPMP Off)
96 else()
97 message("NAT-PMP found: ${natpmp_LIBRARIES}")
98 endif()
99 endif()
100 if (DHTNET_NATPMP)
101 list (APPEND dhtnet_SOURCES
102 src/upnp/protocol/natpmp/nat_pmp.cpp
103 src/upnp/protocol/natpmp/pmp_igd.cpp
104 )
Adrien Béraudadac7cf2023-08-16 15:28:33 -0400105 set (libsprivate "${libsprivate} ${natpmp_LIBRARIES}")
Adrien Béraud370257c2023-08-15 20:53:09 -0400106 endif()
107endif()
108
Adrien Béraud612b55b2023-05-29 10:42:04 -0400109add_library(dhtnet ${dhtnet_SOURCES})
Adrien Béraud883c7652023-07-21 13:16:11 -0400110target_link_libraries(dhtnet PUBLIC PkgConfig::opendht PkgConfig::pjproject fmt::fmt ${MSGPACK_LIB})
Adrien Béraud06271002023-07-27 15:52:29 -0400111if (APPLE)
Adrien Béraud08548d92023-07-27 16:02:48 -0400112 target_link_libraries(dhtnet PRIVATE "-framework CoreFoundation" "-framework Security" "resolv")
Adrien Béraud06271002023-07-27 15:52:29 -0400113endif()
114
Adrien Béraud665d1112023-06-01 19:03:57 -0400115target_include_directories(dhtnet PUBLIC
116 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
117 $<INSTALL_INTERFACE:include>
118)
Adrien Béraud370257c2023-08-15 20:53:09 -0400119if (DHTNET_PUPNP)
120 target_compile_definitions(dhtnet PRIVATE HAVE_LIBUPNP)
121 target_link_libraries(dhtnet PRIVATE PkgConfig::upnp)
122endif()
123if (DHTNET_NATPMP)
124 target_compile_definitions(dhtnet PRIVATE HAVE_LIBNATPMP)
125 target_link_libraries(dhtnet PRIVATE ${natpmp_LIBRARIES})
126endif()
Amnae3fd9f52023-08-08 16:56:06 -0400127if (DHTNET_TESTABLE)
Adrien Béraud6b6a5d32023-08-15 15:53:33 -0400128 target_compile_definitions(dhtnet PUBLIC DHTNET_TESTABLE)
129endif()
Adrien Béraud665d1112023-06-01 19:03:57 -0400130target_compile_definitions(dhtnet PUBLIC PJ_AUTOCONF=1)
Adrien Béraudea1e6932023-07-18 15:33:10 -0400131# set_target_properties(dhtnet PROPERTIES PUBLIC_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/include/${dhtnet_HEADERS}")
Adrien Bérauda4030cd2023-06-21 09:35:40 -0400132
133configure_file(dhtnet.pc.in dhtnet.pc @ONLY)
134
Adrien Bérauda4030cd2023-06-21 09:35:40 -0400135# Install targets
Adrien Béraud13e33432023-07-18 14:49:35 -0400136install(TARGETS dhtnet)
Adrien Béraud149f29e2023-07-05 14:47:49 -0400137install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/dhtnet)
Adrien Béraud13e33432023-07-18 14:49:35 -0400138install(FILES ${CMAKE_CURRENT_BINARY_DIR}/dhtnet.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
Adrien Bérauda4030cd2023-06-21 09:35:40 -0400139
Amna38768302023-08-21 11:51:56 -0400140if (BUILD_TOOLS)
141 add_executable(dnc
142 tools/dnc/main.cpp
143 tools/dnc/dnc.cpp
144 tools/common.cpp)
145 target_link_libraries(dnc PRIVATE dhtnet fmt::fmt)
146 target_include_directories(dnc PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/tools)
147 install(TARGETS dnc RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
Adrien Béraudb75ab9d2023-08-23 09:26:58 -0400148
149 add_executable(upnpctrl
150 tools/upnp/upnpctrl.cpp)
151 target_link_libraries(upnpctrl PRIVATE dhtnet fmt::fmt readline)
152 target_include_directories(upnpctrl PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/tools)
153 install(TARGETS upnpctrl RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
Amna38768302023-08-21 11:51:56 -0400154endif()
155
Adrien Béraudefe27372023-05-27 18:56:29 -0400156if (BUILD_TESTING AND NOT MSVC)
157 pkg_search_module(Cppunit REQUIRED IMPORTED_TARGET cppunit)
158 add_executable(tests_certstore tests/certstore.cpp)
159 target_link_libraries(tests_certstore PRIVATE dhtnet fmt::fmt PkgConfig::Cppunit)
160 add_test(NAME tests_certstore COMMAND tests_certstore)
161
162 add_executable(tests_connectionManager tests/connectionManager.cpp)
163 target_link_libraries(tests_connectionManager PRIVATE dhtnet fmt::fmt PkgConfig::Cppunit)
164 add_test(NAME tests_connectionManager COMMAND tests_connectionManager)
165
166 #add_executable(tests_fileutils tests/testFileutils.cpp)
167 #target_link_libraries(tests_fileutils PRIVATE dhtnet fmt::fmt PkgConfig::Cppunit)
168 #add_test(NAME tests_fileutils COMMAND tests_fileutils)
169
170 #add_executable(tests_stringutils tests/testString_utils.cpp)
171 #target_link_libraries(tests_stringutils PRIVATE dhtnet fmt::fmt PkgConfig::Cppunit)
172 #add_test(NAME tests_stringutils COMMAND tests_stringutils)
Adrien Bérauda4030cd2023-06-21 09:35:40 -0400173endif()