blob: 7b1b1e309564da1812fde9274f21a96fd3440551 [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)
Amna366382f2023-10-02 16:37:02 -040011include(CheckIncludeFileCXX)
Adrien Bérauda4030cd2023-06-21 09:35:40 -040012set (prefix ${CMAKE_INSTALL_PREFIX})
13set (exec_prefix "\${prefix}")
14set (libdir "${CMAKE_INSTALL_FULL_LIBDIR}")
15set (includedir "${CMAKE_INSTALL_FULL_INCLUDEDIR}")
Adrien Béraudd50178b2023-07-09 21:41:12 -040016set (VERSION ${CMAKE_PROJECT_VERSION})
Adrien Béraud612b55b2023-05-29 10:42:04 -040017
Adrien Béraud370257c2023-08-15 20:53:09 -040018option(DHTNET_PUPNP "Enable UPnP support" ON)
19option(DHTNET_NATPMP "Enable NAT-PMP support" ON)
Adrien Beraudb975dbf2023-08-22 17:33:42 -040020option(DHTNET_TESTABLE "Enable API for tests" ON)
Andreas Traczyk24cc01e2023-08-23 18:55:15 -040021option(BUILD_TOOLS "Build tools" ON)
Adrien Béraud6c6a9622023-08-27 12:49:31 -040022option(BUILD_BENCHMARKS "Build benchamrks" ON)
Amna41d76622023-09-20 11:14:27 -040023option(BUILD_DEPENDENCIES "Build dependencies" ON)
Andreas Traczyk24cc01e2023-08-23 18:55:15 -040024
25if (NOT MSVC)
Adrien Béraudb1bcdec2023-11-23 14:45:54 -050026 set(DEPENDENCIES_PATH ${CMAKE_CURRENT_SOURCE_DIR}/dependencies/install/${TARGET})
27 message("dependencies path: ${DEPENDENCIES_PATH}")
Amna41d76622023-09-20 11:14:27 -040028 if (BUILD_DEPENDENCIES)
Amnae7711902023-09-28 18:56:36 -040029 find_package(Python3 COMPONENTS Interpreter)
30 execute_process(
31 COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/dependencies/build.py
32 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/dependencies
33 )
Amna41d76622023-09-20 11:14:27 -040034 endif()
Adrien Béraudb1bcdec2023-11-23 14:45:54 -050035 include (GNUInstallDirs)
36 list(APPEND CMAKE_FIND_ROOT_PATH ${DEPENDENCIES_PATH})
37 set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE BOTH)
38 list(APPEND CMAKE_PREFIX_PATH ${DEPENDENCIES_PATH})
Andreas Traczyk24cc01e2023-08-23 18:55:15 -040039 find_package (PkgConfig REQUIRED)
Amna23158302023-12-04 14:08:19 -050040 if(NOT BUILD_SHARED_LIBS)
Adrien Béraudb1bcdec2023-11-23 14:45:54 -050041 list(APPEND PKG_CONFIG_EXECUTABLE "--static")
42 endif()
Andreas Traczyk24cc01e2023-08-23 18:55:15 -040043
Amna366382f2023-10-02 16:37:02 -040044 check_include_file_cxx(msgpack.hpp HAVE_MSGPACKCXX)
45 if (NOT HAVE_MSGPACKCXX)
46 find_package(msgpack QUIET CONFIG NAMES msgpack msgpackc-cxx)
47 if (NOT msgpack_FOUND)
48 find_package(msgpack REQUIRED CONFIG NAMES msgpack-cxx)
49 set(MSGPACK_TARGET "msgpack-cxx")
50 else()
51 set(MSGPACK_TARGET "msgpackc-cxx")
52 endif()
Andreas Traczyk24cc01e2023-08-23 18:55:15 -040053 endif()
Amna05eb28d2024-01-15 15:43:42 -050054
55 if (BUILD_TOOLS)
56 find_package(yaml-cpp REQUIRED)
57 endif()
58
Amna4e52b162024-01-14 21:16:57 -050059 include_directories(${YAML_CPP_INCLUDE_DIR})
Andreas Traczyk24cc01e2023-08-23 18:55:15 -040060 find_package(fmt)
Amna41d76622023-09-20 11:14:27 -040061 pkg_search_module (opendht REQUIRED IMPORTED_TARGET opendht)
62 pkg_search_module (pjproject REQUIRED IMPORTED_TARGET libpjproject)
Andreas Traczyk24cc01e2023-08-23 18:55:15 -040063else()
64 set (WIN32_DEP_DIR ${PROJECT_SOURCE_DIR}/../)
65 include_directories(
66 ${WIN32_DEP_DIR}/../msvc/include
67 ${WIN32_DEP_DIR}/msgpack-c/include
68 ${WIN32_DEP_DIR}/asio/asio/include
69 ${WIN32_DEP_DIR}/fmt/include
70 ${WIN32_DEP_DIR}/pjproject/pjlib/include
71 ${WIN32_DEP_DIR}/pjproject/pjlib-util/include
72 ${WIN32_DEP_DIR}/pjproject/pjnath/include
73 ${WIN32_DEP_DIR}/opendht/include
74 ${WIN32_DEP_DIR}/opendht/src/compat/msvc
75 ${WIN32_DEP_DIR}/openssl/include
76 ${WIN32_DEP_DIR}/restinio/dev
77 ${WIN32_DEP_DIR}/http_parser
78 ${WIN32_DEP_DIR}/pupnp/include
79 ${WIN32_DEP_DIR}/natpmp/include
80 )
81 # windirent.h
82 include_directories(include/compat/msvc)
83endif()
84
85if (NOT MSVC)
86 set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} \
87 -DMSGPACK_NO_BOOST \
88 -DMSGPACK_DISABLE_LEGACY_NIL \
89 -DMSGPACK_DISABLE_LEGACY_CONVERT")
90else()
91 set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} \
92 -DGNUTLS_INTERNAL_BUILD \
93 -D_USE_MATH_DEFINES \
94 -D_SCL_SECURE_NO_WARNINGS \
95 -D_CRT_SECURE_NO_WARNINGS \
96 -D_WINSOCK_DEPRECATED_NO_WARNINGS \
97 -DASIO_STANDALONE \
98 -DWIN32_LEAN_AND_MEAN \
99 -D_WIN32_WINNT=0x0601 \
100 -DNATPMP_STATICLIB \
101 -DMSGPACK_NO_BOOST \
102 -DMSGPACK_DISABLE_LEGACY_NIL \
103 -DMSGPACK_DISABLE_LEGACY_CONVERT \
104 -DUNICODE \
105 -D_UNICODE")
106endif()
Adrien Béraud370257c2023-08-15 20:53:09 -0400107
Adrien Béraud612b55b2023-05-29 10:42:04 -0400108# Sources
109list (APPEND dhtnet_SOURCES
110 src/connectionmanager.cpp
111 src/ice_transport.cpp
112 src/multiplexed_socket.cpp
113 src/peer_connection.cpp
114 src/string_utils.cpp
115 src/fileutils.cpp
Adrien Béraud80c14e12023-07-18 16:13:15 -0400116 src/ip_utils.cpp
Adrien Béraud612b55b2023-05-29 10:42:04 -0400117 src/security/tls_session.cpp
118 src/security/certstore.cpp
119 src/security/threadloop.cpp
Adrien Béraud45dfac92023-07-19 00:08:50 -0400120 src/security/diffie-hellman.cpp
Adrien Bérauda1d294f2023-07-17 22:42:13 -0400121 src/turn/turn_cache.cpp
122 src/turn/turn_transport.cpp
Morteza Namvar5f639522023-07-04 17:08:58 -0400123 src/upnp/upnp_context.cpp
124 src/upnp/upnp_control.cpp
125 src/upnp/protocol/mapping.cpp
Adrien Béraud80c14e12023-07-18 16:13:15 -0400126 src/upnp/protocol/igd.cpp
Adrien Béraud612b55b2023-05-29 10:42:04 -0400127)
128
129list (APPEND dhtnet_HEADERS
Adrien Béraud149f29e2023-07-05 14:47:49 -0400130 include/connectionmanager.h
131 include/multiplexed_socket.h
132 include/tls_session.h
133 include/certstore.h
134 include/ice_options.h
Adrien Béraud6de3f882023-07-06 12:56:29 -0400135 include/ice_transport.h
Adrien Béraudcb121f82023-07-08 09:18:39 -0400136 include/ice_transport_factory.h
Adrien Béraudaa8c4422023-07-07 11:40:36 -0400137 include/ice_socket.h
Adrien Béraud149f29e2023-07-05 14:47:49 -0400138 include/fileutils.h
139 include/string_utils.h
140 include/ip_utils.h
141 include/upnp/mapping.h
142 include/upnp/upnp_context.h
143 include/upnp/upnp_control.h
Adrien Béraud612b55b2023-05-29 10:42:04 -0400144)
145
Andreas Traczyk24cc01e2023-08-23 18:55:15 -0400146# Port mapping dependencies - add sources and libraries
147if (DHTNET_PUPNP AND NOT MSVC)
Adrien Béraud370257c2023-08-15 20:53:09 -0400148 pkg_search_module (upnp IMPORTED_TARGET upnp libupnp)
149 if (NOT upnp_FOUND)
150 message("libupnp not found: disabling")
151 set(DHTNET_PUPNP Off)
Adrien Béraud6c6a9622023-08-27 12:49:31 -0400152 else()
153 set(upnp_LIBRARIES PkgConfig::upnp)
Adrien Béraud0e6730e2023-08-29 14:12:52 -0400154 set (requiresprivate "${requiresprivate} libupnp")
Adrien Béraud370257c2023-08-15 20:53:09 -0400155 endif()
156endif()
Andreas Traczyk24cc01e2023-08-23 18:55:15 -0400157if (DHTNET_NATPMP AND NOT MSVC)
Adrien Béraud370257c2023-08-15 20:53:09 -0400158 pkg_search_module (natpmp IMPORTED_TARGET natpmp)
159 if (NOT natpmp_FOUND)
160 find_library(natpmp_LIBRARIES natpmp)
161 if (NOT natpmp_LIBRARIES)
162 message("NAT-PMP not found: disabling")
163 set(DHTNET_NATPMP Off)
164 else()
165 message("NAT-PMP found: ${natpmp_LIBRARIES}")
Adrien Béraud0e6730e2023-08-29 14:12:52 -0400166 set (libsprivate "${libsprivate} -lnatpmp")
Adrien Béraud370257c2023-08-15 20:53:09 -0400167 endif()
168 endif()
Andreas Traczyk24cc01e2023-08-23 18:55:15 -0400169endif()
170
171if (DHTNET_PUPNP)
172 list (APPEND dhtnet_PRIVATE_DEFS HAVE_LIBUPNP)
173 list (APPEND dhtnet_SOURCES
174 src/upnp/protocol/pupnp/pupnp.cpp
175 src/upnp/protocol/pupnp/upnp_igd.cpp
176 )
177 list (APPEND dhtnet_PRIVATELIBS ${upnp_LIBRARIES})
178endif()
179if (DHTNET_NATPMP)
180 list (APPEND dhtnet_PRIVATE_DEFS HAVE_LIBNATPMP)
181 list (APPEND dhtnet_SOURCES
182 src/upnp/protocol/natpmp/nat_pmp.cpp
183 src/upnp/protocol/natpmp/pmp_igd.cpp
184 )
185 list (APPEND dhtnet_PRIVATELIBS ${natpmp_LIBRARIES})
Adrien Béraud370257c2023-08-15 20:53:09 -0400186endif()
187
Adrien Béraud612b55b2023-05-29 10:42:04 -0400188add_library(dhtnet ${dhtnet_SOURCES})
Andreas Traczyk24cc01e2023-08-23 18:55:15 -0400189if (NOT MSVC)
190 target_link_libraries(dhtnet PUBLIC PkgConfig::opendht PkgConfig::pjproject fmt::fmt ${MSGPACK_LIB})
191else()
192 target_link_libraries(dhtnet PUBLIC
193 ${WIN32_DEP_DIR}/../msvc/lib/libopendht.lib
194 ${WIN32_DEP_DIR}/../msvc/lib/libpjproject.lib
195 ${WIN32_DEP_DIR}/../msvc/lib/libfmt.lib
196 ${WIN32_DEP_DIR}/../msvc/lib/libmsgpackc-cxx.lib)
197endif()
Amna366382f2023-10-02 16:37:02 -0400198if (NOT HAVE_MSGPACKCXX)
Adrien Béraud62aefa62023-10-05 22:30:09 -0400199 target_link_libraries(dhtnet PUBLIC ${MSGPACK_TARGET})
Amna366382f2023-10-02 16:37:02 -0400200endif()
Adrien Béraud06271002023-07-27 15:52:29 -0400201if (APPLE)
Adrien Béraud08548d92023-07-27 16:02:48 -0400202 target_link_libraries(dhtnet PRIVATE "-framework CoreFoundation" "-framework Security" "resolv")
Adrien Béraud06271002023-07-27 15:52:29 -0400203endif()
204
Adrien Béraud665d1112023-06-01 19:03:57 -0400205target_include_directories(dhtnet PUBLIC
206 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
207 $<INSTALL_INTERFACE:include>
208)
Andreas Traczyk24cc01e2023-08-23 18:55:15 -0400209
210target_compile_definitions(dhtnet PRIVATE ${dhtnet_PRIVATE_DEFS})
211target_link_libraries(dhtnet PRIVATE ${dhtnet_PRIVATELIBS})
212if (MSVC)
213 target_compile_definitions(dhtnet PRIVATE
214 _CRT_SECURE_NO_WARNINGS
215 _WINSOCK_DEPRECATED_NO_WARNINGS
216 ASIO_STANDALONE
217 _WIN32_WINNT=0x0601
218 MSGPACK_NO_BOOST
219 MSGPACK_DISABLE_LEGACY_NIL
220 MSGPACK_DISABLE_LEGACY_CONVERT
221 DHTNET_STATIC
222 DHTNET_STATIC_DEFINE
223 DHTNET_EXPORTS
224 DHTNET_BUILDING
225 DHT)
226 target_compile_options(dhtnet PRIVATE
227 /O2; /Oi; ${DEFAULT_CXX_RUNTIME_LIBRARY}; /Gy; /MP; /Oy-; /sdl-; /W0;
228 /FC; /FS; /nologo; /Zi; /wd4996; /wd4503; /wd4180; /wd4244; /wd4267;
229 /Zc:__cplusplus;
230 ${DEFAULT_CXX_EXCEPTION_HANDLING})
231else()
232 target_compile_definitions(dhtnet PUBLIC PJ_AUTOCONF=1)
Adrien Béraud370257c2023-08-15 20:53:09 -0400233endif()
Andreas Traczyk24cc01e2023-08-23 18:55:15 -0400234
235if (BUILD_TESTING AND NOT MSVC)
Adrien Béraud6b6a5d32023-08-15 15:53:33 -0400236 target_compile_definitions(dhtnet PUBLIC DHTNET_TESTABLE)
237endif()
Adrien Bérauda4030cd2023-06-21 09:35:40 -0400238
239configure_file(dhtnet.pc.in dhtnet.pc @ONLY)
240
Adrien Bérauda4030cd2023-06-21 09:35:40 -0400241# Install targets
Adrien Béraud13e33432023-07-18 14:49:35 -0400242install(TARGETS dhtnet)
Adrien Béraud149f29e2023-07-05 14:47:49 -0400243install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/dhtnet)
Adrien Béraud13e33432023-07-18 14:49:35 -0400244install(FILES ${CMAKE_CURRENT_BINARY_DIR}/dhtnet.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
Adrien Bérauda4030cd2023-06-21 09:35:40 -0400245
Andreas Traczyk24cc01e2023-08-23 18:55:15 -0400246if (BUILD_TOOLS AND NOT MSVC)
Amna38768302023-08-21 11:51:56 -0400247 add_executable(dnc
248 tools/dnc/main.cpp
249 tools/dnc/dnc.cpp
Amna423b25b2024-02-06 13:21:19 -0500250 tools/common.cpp
251 tools/dhtnet_crtmgr/dhtnet_crtmgr.cpp)
Amna41848a22024-01-22 16:22:57 -0500252 target_link_libraries(dnc PRIVATE dhtnet fmt::fmt yaml-cpp)
Amna38768302023-08-21 11:51:56 -0400253 target_include_directories(dnc PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/tools)
254 install(TARGETS dnc RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
Adrien Béraudb75ab9d2023-08-23 09:26:58 -0400255
Amna4a70f5c2023-09-14 17:32:05 -0400256 add_executable(dsh
257 tools/dsh/main.cpp
258 tools/dsh/dsh.cpp
Amna423b25b2024-02-06 13:21:19 -0500259 tools/common.cpp
260 tools/dhtnet_crtmgr/dhtnet_crtmgr.cpp)
Amna41848a22024-01-22 16:22:57 -0500261 target_link_libraries(dsh PRIVATE dhtnet fmt::fmt yaml-cpp)
Amna4e52b162024-01-14 21:16:57 -0500262 target_include_directories(dsh PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/tools)
Amna4a70f5c2023-09-14 17:32:05 -0400263 install(TARGETS dsh RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
264
Amna4e52b162024-01-14 21:16:57 -0500265 add_executable(dvpn
266 tools/dvpn/main.cpp
267 tools/dvpn/dvpn.cpp
Amna423b25b2024-02-06 13:21:19 -0500268 tools/common.cpp
269 tools/dhtnet_crtmgr/dhtnet_crtmgr.cpp)
Amna4e52b162024-01-14 21:16:57 -0500270 target_link_libraries(dvpn PRIVATE dhtnet fmt::fmt yaml-cpp)
271 target_include_directories(dvpn PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/tools)
272 install(TARGETS dvpn RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
273
Adrien Béraudbd09c992023-09-20 11:55:37 -0400274 find_library(READLINE_LIBRARIES readline)
275 find_path(READLINE_INCLUDE_DIR readline/readline.h)
276 add_library(readline STATIC IMPORTED)
277 set_target_properties(readline PROPERTIES
278 IMPORTED_LOCATION "${READLINE_LIBRARIES}"
279 INTERFACE_INCLUDE_DIRECTORIES "${READLINE_INCLUDE_DIR}")
Adrien Béraudb75ab9d2023-08-23 09:26:58 -0400280 add_executable(upnpctrl
281 tools/upnp/upnpctrl.cpp)
282 target_link_libraries(upnpctrl PRIVATE dhtnet fmt::fmt readline)
283 target_include_directories(upnpctrl PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/tools)
284 install(TARGETS upnpctrl RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
Amnab10c6e72023-09-25 11:12:35 -0400285
Amna423b25b2024-02-06 13:21:19 -0500286 add_executable(dhtnet-crtmgr
287 tools/dhtnet_crtmgr/main.cpp
288 tools/dhtnet_crtmgr/dhtnet_crtmgr.cpp)
289 target_link_libraries(dhtnet-crtmgr PRIVATE dhtnet fmt::fmt)
290 target_include_directories(dhtnet-crtmgr PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/tools)
291 install(TARGETS dhtnet-crtmgr RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
292
Amnab10c6e72023-09-25 11:12:35 -0400293 install(FILES
294 tools/dnc/dnc.1
295 tools/dsh/dsh.1
296 DESTINATION ${CMAKE_INSTALL_MANDIR})
Amna38768302023-08-21 11:51:56 -0400297endif()
298
Adrien Béraud6c6a9622023-08-27 12:49:31 -0400299if (BUILD_BENCHMARKS)
300 add_executable(bench
301 tools/benchmark/main.cpp
302 tools/common.cpp)
303 target_link_libraries(bench PRIVATE dhtnet fmt::fmt)
304 target_include_directories(bench PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/tools)
305 install(TARGETS bench RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
306endif()
307
Adrien Béraudefe27372023-05-27 18:56:29 -0400308if (BUILD_TESTING AND NOT MSVC)
309 pkg_search_module(Cppunit REQUIRED IMPORTED_TARGET cppunit)
310 add_executable(tests_certstore tests/certstore.cpp)
311 target_link_libraries(tests_certstore PRIVATE dhtnet fmt::fmt PkgConfig::Cppunit)
312 add_test(NAME tests_certstore COMMAND tests_certstore)
313
314 add_executable(tests_connectionManager tests/connectionManager.cpp)
315 target_link_libraries(tests_connectionManager PRIVATE dhtnet fmt::fmt PkgConfig::Cppunit)
316 add_test(NAME tests_connectionManager COMMAND tests_connectionManager)
317
Adrien Béraud2a4e73d2023-08-27 12:53:55 -0400318 add_executable(tests_fileutils tests/testFileutils.cpp)
319 target_link_libraries(tests_fileutils PRIVATE dhtnet fmt::fmt PkgConfig::Cppunit)
320 add_test(NAME tests_fileutils COMMAND tests_fileutils)
Adrien Béraudefe27372023-05-27 18:56:29 -0400321
322 #add_executable(tests_stringutils tests/testString_utils.cpp)
323 #target_link_libraries(tests_stringutils PRIVATE dhtnet fmt::fmt PkgConfig::Cppunit)
324 #add_test(NAME tests_stringutils COMMAND tests_stringutils)
Adrien Bérauda4030cd2023-06-21 09:35:40 -0400325endif()