blob: 6086fb439ee9cbc126a714e6b0a944aef6dbe703 [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
Adrien Béraud370257c2023-08-15 20:53:09 -040017option(DHTNET_PUPNP "Enable UPnP support" ON)
18option(DHTNET_NATPMP "Enable NAT-PMP support" ON)
Adrien Beraudb975dbf2023-08-22 17:33:42 -040019option(DHTNET_TESTABLE "Enable API for tests" ON)
Andreas Traczyk24cc01e2023-08-23 18:55:15 -040020option(BUILD_TOOLS "Build tools" ON)
Adrien Béraud6c6a9622023-08-27 12:49:31 -040021option(BUILD_BENCHMARKS "Build benchamrks" ON)
Amna41d76622023-09-20 11:14:27 -040022option(BUILD_DEPENDENCIES "Build dependencies" ON)
Andreas Traczyk24cc01e2023-08-23 18:55:15 -040023
24if (NOT MSVC)
Amna41d76622023-09-20 11:14:27 -040025
26 if (BUILD_DEPENDENCIES)
27 set(DEPENDENCIES_PATH ${CMAKE_CURRENT_SOURCE_DIR}/dependencies/install/${TARGET})
28 include (GNUInstallDirs)
29 message("dependencies path: ${DEPENDENCIES_PATH}")
30 list(APPEND CMAKE_FIND_ROOT_PATH ${DEPENDENCIES_PATH})
31 set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE BOTH)
32 list(APPEND CMAKE_PREFIX_PATH ${DEPENDENCIES_PATH})
33 endif()
34
Andreas Traczyk24cc01e2023-08-23 18:55:15 -040035 find_package (PkgConfig REQUIRED)
36
37 find_package(msgpack-cxx CONFIG)
38 if(msgpack-cxx_FOUND)
39 set(MSGPACK_LIB msgpack-cxx)
40 else()
41 find_package(msgpackc-cxx CONFIG REQUIRED NAMES msgpackc-cxx msgpack)
42 set(MSGPACK_LIB msgpackc-cxx)
43 endif()
44
45 find_package(fmt)
Amna41d76622023-09-20 11:14:27 -040046 pkg_search_module (opendht REQUIRED IMPORTED_TARGET opendht)
47 pkg_search_module (pjproject REQUIRED IMPORTED_TARGET libpjproject)
Andreas Traczyk24cc01e2023-08-23 18:55:15 -040048else()
49 set (WIN32_DEP_DIR ${PROJECT_SOURCE_DIR}/../)
50 include_directories(
51 ${WIN32_DEP_DIR}/../msvc/include
52 ${WIN32_DEP_DIR}/msgpack-c/include
53 ${WIN32_DEP_DIR}/asio/asio/include
54 ${WIN32_DEP_DIR}/fmt/include
55 ${WIN32_DEP_DIR}/pjproject/pjlib/include
56 ${WIN32_DEP_DIR}/pjproject/pjlib-util/include
57 ${WIN32_DEP_DIR}/pjproject/pjnath/include
58 ${WIN32_DEP_DIR}/opendht/include
59 ${WIN32_DEP_DIR}/opendht/src/compat/msvc
60 ${WIN32_DEP_DIR}/openssl/include
61 ${WIN32_DEP_DIR}/restinio/dev
62 ${WIN32_DEP_DIR}/http_parser
63 ${WIN32_DEP_DIR}/pupnp/include
64 ${WIN32_DEP_DIR}/natpmp/include
65 )
66 # windirent.h
67 include_directories(include/compat/msvc)
68endif()
69
70if (NOT MSVC)
71 set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} \
72 -DMSGPACK_NO_BOOST \
73 -DMSGPACK_DISABLE_LEGACY_NIL \
74 -DMSGPACK_DISABLE_LEGACY_CONVERT")
75else()
76 set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} \
77 -DGNUTLS_INTERNAL_BUILD \
78 -D_USE_MATH_DEFINES \
79 -D_SCL_SECURE_NO_WARNINGS \
80 -D_CRT_SECURE_NO_WARNINGS \
81 -D_WINSOCK_DEPRECATED_NO_WARNINGS \
82 -DASIO_STANDALONE \
83 -DWIN32_LEAN_AND_MEAN \
84 -D_WIN32_WINNT=0x0601 \
85 -DNATPMP_STATICLIB \
86 -DMSGPACK_NO_BOOST \
87 -DMSGPACK_DISABLE_LEGACY_NIL \
88 -DMSGPACK_DISABLE_LEGACY_CONVERT \
89 -DUNICODE \
90 -D_UNICODE")
91endif()
Adrien Béraud370257c2023-08-15 20:53:09 -040092
Adrien Béraud612b55b2023-05-29 10:42:04 -040093# Sources
94list (APPEND dhtnet_SOURCES
95 src/connectionmanager.cpp
96 src/ice_transport.cpp
97 src/multiplexed_socket.cpp
98 src/peer_connection.cpp
99 src/string_utils.cpp
100 src/fileutils.cpp
Adrien Béraud80c14e12023-07-18 16:13:15 -0400101 src/ip_utils.cpp
Adrien Béraud612b55b2023-05-29 10:42:04 -0400102 src/security/tls_session.cpp
103 src/security/certstore.cpp
104 src/security/threadloop.cpp
Adrien Béraud45dfac92023-07-19 00:08:50 -0400105 src/security/diffie-hellman.cpp
Adrien Bérauda1d294f2023-07-17 22:42:13 -0400106 src/turn/turn_cache.cpp
107 src/turn/turn_transport.cpp
Morteza Namvar5f639522023-07-04 17:08:58 -0400108 src/upnp/upnp_context.cpp
109 src/upnp/upnp_control.cpp
110 src/upnp/protocol/mapping.cpp
Adrien Béraud80c14e12023-07-18 16:13:15 -0400111 src/upnp/protocol/igd.cpp
Adrien Béraud612b55b2023-05-29 10:42:04 -0400112)
113
114list (APPEND dhtnet_HEADERS
Adrien Béraud149f29e2023-07-05 14:47:49 -0400115 include/connectionmanager.h
116 include/multiplexed_socket.h
117 include/tls_session.h
118 include/certstore.h
119 include/ice_options.h
Adrien Béraud6de3f882023-07-06 12:56:29 -0400120 include/ice_transport.h
Adrien Béraudcb121f82023-07-08 09:18:39 -0400121 include/ice_transport_factory.h
Adrien Béraudaa8c4422023-07-07 11:40:36 -0400122 include/ice_socket.h
Adrien Béraud149f29e2023-07-05 14:47:49 -0400123 include/fileutils.h
124 include/string_utils.h
125 include/ip_utils.h
126 include/upnp/mapping.h
127 include/upnp/upnp_context.h
128 include/upnp/upnp_control.h
Adrien Béraud612b55b2023-05-29 10:42:04 -0400129)
130
Andreas Traczyk24cc01e2023-08-23 18:55:15 -0400131# Port mapping dependencies - add sources and libraries
132if (DHTNET_PUPNP AND NOT MSVC)
Adrien Béraud370257c2023-08-15 20:53:09 -0400133 pkg_search_module (upnp IMPORTED_TARGET upnp libupnp)
134 if (NOT upnp_FOUND)
135 message("libupnp not found: disabling")
136 set(DHTNET_PUPNP Off)
Adrien Béraud6c6a9622023-08-27 12:49:31 -0400137 else()
138 set(upnp_LIBRARIES PkgConfig::upnp)
Adrien Béraud0e6730e2023-08-29 14:12:52 -0400139 set (requiresprivate "${requiresprivate} libupnp")
Adrien Béraud370257c2023-08-15 20:53:09 -0400140 endif()
141endif()
Andreas Traczyk24cc01e2023-08-23 18:55:15 -0400142if (DHTNET_NATPMP AND NOT MSVC)
Adrien Béraud370257c2023-08-15 20:53:09 -0400143 pkg_search_module (natpmp IMPORTED_TARGET natpmp)
144 if (NOT natpmp_FOUND)
145 find_library(natpmp_LIBRARIES natpmp)
146 if (NOT natpmp_LIBRARIES)
147 message("NAT-PMP not found: disabling")
148 set(DHTNET_NATPMP Off)
149 else()
150 message("NAT-PMP found: ${natpmp_LIBRARIES}")
Adrien Béraud0e6730e2023-08-29 14:12:52 -0400151 set (libsprivate "${libsprivate} -lnatpmp")
Adrien Béraud370257c2023-08-15 20:53:09 -0400152 endif()
153 endif()
Andreas Traczyk24cc01e2023-08-23 18:55:15 -0400154endif()
155
156if (DHTNET_PUPNP)
157 list (APPEND dhtnet_PRIVATE_DEFS HAVE_LIBUPNP)
158 list (APPEND dhtnet_SOURCES
159 src/upnp/protocol/pupnp/pupnp.cpp
160 src/upnp/protocol/pupnp/upnp_igd.cpp
161 )
162 list (APPEND dhtnet_PRIVATELIBS ${upnp_LIBRARIES})
163endif()
164if (DHTNET_NATPMP)
165 list (APPEND dhtnet_PRIVATE_DEFS HAVE_LIBNATPMP)
166 list (APPEND dhtnet_SOURCES
167 src/upnp/protocol/natpmp/nat_pmp.cpp
168 src/upnp/protocol/natpmp/pmp_igd.cpp
169 )
170 list (APPEND dhtnet_PRIVATELIBS ${natpmp_LIBRARIES})
Adrien Béraud370257c2023-08-15 20:53:09 -0400171endif()
172
Adrien Béraud612b55b2023-05-29 10:42:04 -0400173add_library(dhtnet ${dhtnet_SOURCES})
Andreas Traczyk24cc01e2023-08-23 18:55:15 -0400174if (NOT MSVC)
175 target_link_libraries(dhtnet PUBLIC PkgConfig::opendht PkgConfig::pjproject fmt::fmt ${MSGPACK_LIB})
176else()
177 target_link_libraries(dhtnet PUBLIC
178 ${WIN32_DEP_DIR}/../msvc/lib/libopendht.lib
179 ${WIN32_DEP_DIR}/../msvc/lib/libpjproject.lib
180 ${WIN32_DEP_DIR}/../msvc/lib/libfmt.lib
181 ${WIN32_DEP_DIR}/../msvc/lib/libmsgpackc-cxx.lib)
182endif()
Adrien Béraud06271002023-07-27 15:52:29 -0400183if (APPLE)
Adrien Béraud08548d92023-07-27 16:02:48 -0400184 target_link_libraries(dhtnet PRIVATE "-framework CoreFoundation" "-framework Security" "resolv")
Adrien Béraud06271002023-07-27 15:52:29 -0400185endif()
186
Adrien Béraud665d1112023-06-01 19:03:57 -0400187target_include_directories(dhtnet PUBLIC
188 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
189 $<INSTALL_INTERFACE:include>
190)
Andreas Traczyk24cc01e2023-08-23 18:55:15 -0400191
192target_compile_definitions(dhtnet PRIVATE ${dhtnet_PRIVATE_DEFS})
193target_link_libraries(dhtnet PRIVATE ${dhtnet_PRIVATELIBS})
194if (MSVC)
195 target_compile_definitions(dhtnet PRIVATE
196 _CRT_SECURE_NO_WARNINGS
197 _WINSOCK_DEPRECATED_NO_WARNINGS
198 ASIO_STANDALONE
199 _WIN32_WINNT=0x0601
200 MSGPACK_NO_BOOST
201 MSGPACK_DISABLE_LEGACY_NIL
202 MSGPACK_DISABLE_LEGACY_CONVERT
203 DHTNET_STATIC
204 DHTNET_STATIC_DEFINE
205 DHTNET_EXPORTS
206 DHTNET_BUILDING
207 DHT)
208 target_compile_options(dhtnet PRIVATE
209 /O2; /Oi; ${DEFAULT_CXX_RUNTIME_LIBRARY}; /Gy; /MP; /Oy-; /sdl-; /W0;
210 /FC; /FS; /nologo; /Zi; /wd4996; /wd4503; /wd4180; /wd4244; /wd4267;
211 /Zc:__cplusplus;
212 ${DEFAULT_CXX_EXCEPTION_HANDLING})
213else()
214 target_compile_definitions(dhtnet PUBLIC PJ_AUTOCONF=1)
Adrien Béraud370257c2023-08-15 20:53:09 -0400215endif()
Andreas Traczyk24cc01e2023-08-23 18:55:15 -0400216
217if (BUILD_TESTING AND NOT MSVC)
Adrien Béraud6b6a5d32023-08-15 15:53:33 -0400218 target_compile_definitions(dhtnet PUBLIC DHTNET_TESTABLE)
219endif()
Adrien Bérauda4030cd2023-06-21 09:35:40 -0400220
221configure_file(dhtnet.pc.in dhtnet.pc @ONLY)
222
Adrien Bérauda4030cd2023-06-21 09:35:40 -0400223# Install targets
Adrien Béraud13e33432023-07-18 14:49:35 -0400224install(TARGETS dhtnet)
Adrien Béraud149f29e2023-07-05 14:47:49 -0400225install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/dhtnet)
Adrien Béraud13e33432023-07-18 14:49:35 -0400226install(FILES ${CMAKE_CURRENT_BINARY_DIR}/dhtnet.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
Adrien Bérauda4030cd2023-06-21 09:35:40 -0400227
Andreas Traczyk24cc01e2023-08-23 18:55:15 -0400228if (BUILD_TOOLS AND NOT MSVC)
Amna38768302023-08-21 11:51:56 -0400229 add_executable(dnc
230 tools/dnc/main.cpp
231 tools/dnc/dnc.cpp
232 tools/common.cpp)
233 target_link_libraries(dnc PRIVATE dhtnet fmt::fmt)
234 target_include_directories(dnc PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/tools)
235 install(TARGETS dnc RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
Adrien Béraudb75ab9d2023-08-23 09:26:58 -0400236
Amna4a70f5c2023-09-14 17:32:05 -0400237 add_executable(dsh
238 tools/dsh/main.cpp
239 tools/dsh/dsh.cpp
240 tools/common.cpp)
241 target_link_libraries(dsh PRIVATE dhtnet fmt::fmt)
242 target_include_directories(dnc PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/tools)
243 install(TARGETS dsh RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
244
Adrien Béraudbd09c992023-09-20 11:55:37 -0400245 find_library(READLINE_LIBRARIES readline)
246 find_path(READLINE_INCLUDE_DIR readline/readline.h)
247 add_library(readline STATIC IMPORTED)
248 set_target_properties(readline PROPERTIES
249 IMPORTED_LOCATION "${READLINE_LIBRARIES}"
250 INTERFACE_INCLUDE_DIRECTORIES "${READLINE_INCLUDE_DIR}")
Adrien Béraudb75ab9d2023-08-23 09:26:58 -0400251 add_executable(upnpctrl
252 tools/upnp/upnpctrl.cpp)
253 target_link_libraries(upnpctrl PRIVATE dhtnet fmt::fmt readline)
254 target_include_directories(upnpctrl PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/tools)
255 install(TARGETS upnpctrl RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
Amnab10c6e72023-09-25 11:12:35 -0400256
257 install(FILES
258 tools/dnc/dnc.1
259 tools/dsh/dsh.1
260 DESTINATION ${CMAKE_INSTALL_MANDIR})
Amna38768302023-08-21 11:51:56 -0400261endif()
262
Adrien Béraud6c6a9622023-08-27 12:49:31 -0400263if (BUILD_BENCHMARKS)
264 add_executable(bench
265 tools/benchmark/main.cpp
266 tools/common.cpp)
267 target_link_libraries(bench PRIVATE dhtnet fmt::fmt)
268 target_include_directories(bench PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/tools)
269 install(TARGETS bench RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
270endif()
271
Adrien Béraudefe27372023-05-27 18:56:29 -0400272if (BUILD_TESTING AND NOT MSVC)
273 pkg_search_module(Cppunit REQUIRED IMPORTED_TARGET cppunit)
274 add_executable(tests_certstore tests/certstore.cpp)
275 target_link_libraries(tests_certstore PRIVATE dhtnet fmt::fmt PkgConfig::Cppunit)
276 add_test(NAME tests_certstore COMMAND tests_certstore)
277
278 add_executable(tests_connectionManager tests/connectionManager.cpp)
279 target_link_libraries(tests_connectionManager PRIVATE dhtnet fmt::fmt PkgConfig::Cppunit)
280 add_test(NAME tests_connectionManager COMMAND tests_connectionManager)
281
Adrien Béraud2a4e73d2023-08-27 12:53:55 -0400282 add_executable(tests_fileutils tests/testFileutils.cpp)
283 target_link_libraries(tests_fileutils PRIVATE dhtnet fmt::fmt PkgConfig::Cppunit)
284 add_test(NAME tests_fileutils COMMAND tests_fileutils)
Adrien Béraudefe27372023-05-27 18:56:29 -0400285
286 #add_executable(tests_stringutils tests/testString_utils.cpp)
287 #target_link_libraries(tests_stringutils PRIVATE dhtnet fmt::fmt PkgConfig::Cppunit)
288 #add_test(NAME tests_stringutils COMMAND tests_stringutils)
Adrien Bérauda4030cd2023-06-21 09:35:40 -0400289endif()