blob: a3db42298460edd7cf8612cdb180e97437b2d03b [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 if (BUILD_DEPENDENCIES)
Amnae7711902023-09-28 18:56:36 -040026 find_package(Python3 COMPONENTS Interpreter)
27 execute_process(
28 COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/dependencies/build.py
29 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/dependencies
30 )
Amna41d76622023-09-20 11:14:27 -040031 set(DEPENDENCIES_PATH ${CMAKE_CURRENT_SOURCE_DIR}/dependencies/install/${TARGET})
32 include (GNUInstallDirs)
33 message("dependencies path: ${DEPENDENCIES_PATH}")
34 list(APPEND CMAKE_FIND_ROOT_PATH ${DEPENDENCIES_PATH})
35 set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE BOTH)
36 list(APPEND CMAKE_PREFIX_PATH ${DEPENDENCIES_PATH})
37 endif()
38
Andreas Traczyk24cc01e2023-08-23 18:55:15 -040039 find_package (PkgConfig REQUIRED)
40
41 find_package(msgpack-cxx CONFIG)
42 if(msgpack-cxx_FOUND)
43 set(MSGPACK_LIB msgpack-cxx)
44 else()
45 find_package(msgpackc-cxx CONFIG REQUIRED NAMES msgpackc-cxx msgpack)
46 set(MSGPACK_LIB msgpackc-cxx)
47 endif()
48
49 find_package(fmt)
Amna41d76622023-09-20 11:14:27 -040050 pkg_search_module (opendht REQUIRED IMPORTED_TARGET opendht)
51 pkg_search_module (pjproject REQUIRED IMPORTED_TARGET libpjproject)
Andreas Traczyk24cc01e2023-08-23 18:55:15 -040052else()
53 set (WIN32_DEP_DIR ${PROJECT_SOURCE_DIR}/../)
54 include_directories(
55 ${WIN32_DEP_DIR}/../msvc/include
56 ${WIN32_DEP_DIR}/msgpack-c/include
57 ${WIN32_DEP_DIR}/asio/asio/include
58 ${WIN32_DEP_DIR}/fmt/include
59 ${WIN32_DEP_DIR}/pjproject/pjlib/include
60 ${WIN32_DEP_DIR}/pjproject/pjlib-util/include
61 ${WIN32_DEP_DIR}/pjproject/pjnath/include
62 ${WIN32_DEP_DIR}/opendht/include
63 ${WIN32_DEP_DIR}/opendht/src/compat/msvc
64 ${WIN32_DEP_DIR}/openssl/include
65 ${WIN32_DEP_DIR}/restinio/dev
66 ${WIN32_DEP_DIR}/http_parser
67 ${WIN32_DEP_DIR}/pupnp/include
68 ${WIN32_DEP_DIR}/natpmp/include
69 )
70 # windirent.h
71 include_directories(include/compat/msvc)
72endif()
73
74if (NOT MSVC)
75 set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} \
76 -DMSGPACK_NO_BOOST \
77 -DMSGPACK_DISABLE_LEGACY_NIL \
78 -DMSGPACK_DISABLE_LEGACY_CONVERT")
79else()
80 set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} \
81 -DGNUTLS_INTERNAL_BUILD \
82 -D_USE_MATH_DEFINES \
83 -D_SCL_SECURE_NO_WARNINGS \
84 -D_CRT_SECURE_NO_WARNINGS \
85 -D_WINSOCK_DEPRECATED_NO_WARNINGS \
86 -DASIO_STANDALONE \
87 -DWIN32_LEAN_AND_MEAN \
88 -D_WIN32_WINNT=0x0601 \
89 -DNATPMP_STATICLIB \
90 -DMSGPACK_NO_BOOST \
91 -DMSGPACK_DISABLE_LEGACY_NIL \
92 -DMSGPACK_DISABLE_LEGACY_CONVERT \
93 -DUNICODE \
94 -D_UNICODE")
95endif()
Adrien Béraud370257c2023-08-15 20:53:09 -040096
Adrien Béraud612b55b2023-05-29 10:42:04 -040097# Sources
98list (APPEND dhtnet_SOURCES
99 src/connectionmanager.cpp
100 src/ice_transport.cpp
101 src/multiplexed_socket.cpp
102 src/peer_connection.cpp
103 src/string_utils.cpp
104 src/fileutils.cpp
Adrien Béraud80c14e12023-07-18 16:13:15 -0400105 src/ip_utils.cpp
Adrien Béraud612b55b2023-05-29 10:42:04 -0400106 src/security/tls_session.cpp
107 src/security/certstore.cpp
108 src/security/threadloop.cpp
Adrien Béraud45dfac92023-07-19 00:08:50 -0400109 src/security/diffie-hellman.cpp
Adrien Bérauda1d294f2023-07-17 22:42:13 -0400110 src/turn/turn_cache.cpp
111 src/turn/turn_transport.cpp
Morteza Namvar5f639522023-07-04 17:08:58 -0400112 src/upnp/upnp_context.cpp
113 src/upnp/upnp_control.cpp
114 src/upnp/protocol/mapping.cpp
Adrien Béraud80c14e12023-07-18 16:13:15 -0400115 src/upnp/protocol/igd.cpp
Adrien Béraud612b55b2023-05-29 10:42:04 -0400116)
117
118list (APPEND dhtnet_HEADERS
Adrien Béraud149f29e2023-07-05 14:47:49 -0400119 include/connectionmanager.h
120 include/multiplexed_socket.h
121 include/tls_session.h
122 include/certstore.h
123 include/ice_options.h
Adrien Béraud6de3f882023-07-06 12:56:29 -0400124 include/ice_transport.h
Adrien Béraudcb121f82023-07-08 09:18:39 -0400125 include/ice_transport_factory.h
Adrien Béraudaa8c4422023-07-07 11:40:36 -0400126 include/ice_socket.h
Adrien Béraud149f29e2023-07-05 14:47:49 -0400127 include/fileutils.h
128 include/string_utils.h
129 include/ip_utils.h
130 include/upnp/mapping.h
131 include/upnp/upnp_context.h
132 include/upnp/upnp_control.h
Adrien Béraud612b55b2023-05-29 10:42:04 -0400133)
134
Andreas Traczyk24cc01e2023-08-23 18:55:15 -0400135# Port mapping dependencies - add sources and libraries
136if (DHTNET_PUPNP AND NOT MSVC)
Adrien Béraud370257c2023-08-15 20:53:09 -0400137 pkg_search_module (upnp IMPORTED_TARGET upnp libupnp)
138 if (NOT upnp_FOUND)
139 message("libupnp not found: disabling")
140 set(DHTNET_PUPNP Off)
Adrien Béraud6c6a9622023-08-27 12:49:31 -0400141 else()
142 set(upnp_LIBRARIES PkgConfig::upnp)
Adrien Béraud0e6730e2023-08-29 14:12:52 -0400143 set (requiresprivate "${requiresprivate} libupnp")
Adrien Béraud370257c2023-08-15 20:53:09 -0400144 endif()
145endif()
Andreas Traczyk24cc01e2023-08-23 18:55:15 -0400146if (DHTNET_NATPMP AND NOT MSVC)
Adrien Béraud370257c2023-08-15 20:53:09 -0400147 pkg_search_module (natpmp IMPORTED_TARGET natpmp)
148 if (NOT natpmp_FOUND)
149 find_library(natpmp_LIBRARIES natpmp)
150 if (NOT natpmp_LIBRARIES)
151 message("NAT-PMP not found: disabling")
152 set(DHTNET_NATPMP Off)
153 else()
154 message("NAT-PMP found: ${natpmp_LIBRARIES}")
Adrien Béraud0e6730e2023-08-29 14:12:52 -0400155 set (libsprivate "${libsprivate} -lnatpmp")
Adrien Béraud370257c2023-08-15 20:53:09 -0400156 endif()
157 endif()
Andreas Traczyk24cc01e2023-08-23 18:55:15 -0400158endif()
159
160if (DHTNET_PUPNP)
161 list (APPEND dhtnet_PRIVATE_DEFS HAVE_LIBUPNP)
162 list (APPEND dhtnet_SOURCES
163 src/upnp/protocol/pupnp/pupnp.cpp
164 src/upnp/protocol/pupnp/upnp_igd.cpp
165 )
166 list (APPEND dhtnet_PRIVATELIBS ${upnp_LIBRARIES})
167endif()
168if (DHTNET_NATPMP)
169 list (APPEND dhtnet_PRIVATE_DEFS HAVE_LIBNATPMP)
170 list (APPEND dhtnet_SOURCES
171 src/upnp/protocol/natpmp/nat_pmp.cpp
172 src/upnp/protocol/natpmp/pmp_igd.cpp
173 )
174 list (APPEND dhtnet_PRIVATELIBS ${natpmp_LIBRARIES})
Adrien Béraud370257c2023-08-15 20:53:09 -0400175endif()
176
Adrien Béraud612b55b2023-05-29 10:42:04 -0400177add_library(dhtnet ${dhtnet_SOURCES})
Andreas Traczyk24cc01e2023-08-23 18:55:15 -0400178if (NOT MSVC)
179 target_link_libraries(dhtnet PUBLIC PkgConfig::opendht PkgConfig::pjproject fmt::fmt ${MSGPACK_LIB})
180else()
181 target_link_libraries(dhtnet PUBLIC
182 ${WIN32_DEP_DIR}/../msvc/lib/libopendht.lib
183 ${WIN32_DEP_DIR}/../msvc/lib/libpjproject.lib
184 ${WIN32_DEP_DIR}/../msvc/lib/libfmt.lib
185 ${WIN32_DEP_DIR}/../msvc/lib/libmsgpackc-cxx.lib)
186endif()
Adrien Béraud06271002023-07-27 15:52:29 -0400187if (APPLE)
Adrien Béraud08548d92023-07-27 16:02:48 -0400188 target_link_libraries(dhtnet PRIVATE "-framework CoreFoundation" "-framework Security" "resolv")
Adrien Béraud06271002023-07-27 15:52:29 -0400189endif()
190
Adrien Béraud665d1112023-06-01 19:03:57 -0400191target_include_directories(dhtnet PUBLIC
192 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
193 $<INSTALL_INTERFACE:include>
194)
Andreas Traczyk24cc01e2023-08-23 18:55:15 -0400195
196target_compile_definitions(dhtnet PRIVATE ${dhtnet_PRIVATE_DEFS})
197target_link_libraries(dhtnet PRIVATE ${dhtnet_PRIVATELIBS})
198if (MSVC)
199 target_compile_definitions(dhtnet PRIVATE
200 _CRT_SECURE_NO_WARNINGS
201 _WINSOCK_DEPRECATED_NO_WARNINGS
202 ASIO_STANDALONE
203 _WIN32_WINNT=0x0601
204 MSGPACK_NO_BOOST
205 MSGPACK_DISABLE_LEGACY_NIL
206 MSGPACK_DISABLE_LEGACY_CONVERT
207 DHTNET_STATIC
208 DHTNET_STATIC_DEFINE
209 DHTNET_EXPORTS
210 DHTNET_BUILDING
211 DHT)
212 target_compile_options(dhtnet PRIVATE
213 /O2; /Oi; ${DEFAULT_CXX_RUNTIME_LIBRARY}; /Gy; /MP; /Oy-; /sdl-; /W0;
214 /FC; /FS; /nologo; /Zi; /wd4996; /wd4503; /wd4180; /wd4244; /wd4267;
215 /Zc:__cplusplus;
216 ${DEFAULT_CXX_EXCEPTION_HANDLING})
217else()
218 target_compile_definitions(dhtnet PUBLIC PJ_AUTOCONF=1)
Adrien Béraud370257c2023-08-15 20:53:09 -0400219endif()
Andreas Traczyk24cc01e2023-08-23 18:55:15 -0400220
221if (BUILD_TESTING AND NOT MSVC)
Adrien Béraud6b6a5d32023-08-15 15:53:33 -0400222 target_compile_definitions(dhtnet PUBLIC DHTNET_TESTABLE)
223endif()
Adrien Bérauda4030cd2023-06-21 09:35:40 -0400224
225configure_file(dhtnet.pc.in dhtnet.pc @ONLY)
226
Adrien Bérauda4030cd2023-06-21 09:35:40 -0400227# Install targets
Adrien Béraud13e33432023-07-18 14:49:35 -0400228install(TARGETS dhtnet)
Adrien Béraud149f29e2023-07-05 14:47:49 -0400229install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/dhtnet)
Adrien Béraud13e33432023-07-18 14:49:35 -0400230install(FILES ${CMAKE_CURRENT_BINARY_DIR}/dhtnet.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
Adrien Bérauda4030cd2023-06-21 09:35:40 -0400231
Andreas Traczyk24cc01e2023-08-23 18:55:15 -0400232if (BUILD_TOOLS AND NOT MSVC)
Amna38768302023-08-21 11:51:56 -0400233 add_executable(dnc
234 tools/dnc/main.cpp
235 tools/dnc/dnc.cpp
236 tools/common.cpp)
237 target_link_libraries(dnc PRIVATE dhtnet fmt::fmt)
238 target_include_directories(dnc PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/tools)
239 install(TARGETS dnc RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
Adrien Béraudb75ab9d2023-08-23 09:26:58 -0400240
Amna4a70f5c2023-09-14 17:32:05 -0400241 add_executable(dsh
242 tools/dsh/main.cpp
243 tools/dsh/dsh.cpp
244 tools/common.cpp)
245 target_link_libraries(dsh PRIVATE dhtnet fmt::fmt)
246 target_include_directories(dnc PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/tools)
247 install(TARGETS dsh RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
248
Adrien Béraudbd09c992023-09-20 11:55:37 -0400249 find_library(READLINE_LIBRARIES readline)
250 find_path(READLINE_INCLUDE_DIR readline/readline.h)
251 add_library(readline STATIC IMPORTED)
252 set_target_properties(readline PROPERTIES
253 IMPORTED_LOCATION "${READLINE_LIBRARIES}"
254 INTERFACE_INCLUDE_DIRECTORIES "${READLINE_INCLUDE_DIR}")
Adrien Béraudb75ab9d2023-08-23 09:26:58 -0400255 add_executable(upnpctrl
256 tools/upnp/upnpctrl.cpp)
257 target_link_libraries(upnpctrl PRIVATE dhtnet fmt::fmt readline)
258 target_include_directories(upnpctrl PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/tools)
259 install(TARGETS upnpctrl RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
Amnab10c6e72023-09-25 11:12:35 -0400260
261 install(FILES
262 tools/dnc/dnc.1
263 tools/dsh/dsh.1
264 DESTINATION ${CMAKE_INSTALL_MANDIR})
Amna38768302023-08-21 11:51:56 -0400265endif()
266
Adrien Béraud6c6a9622023-08-27 12:49:31 -0400267if (BUILD_BENCHMARKS)
268 add_executable(bench
269 tools/benchmark/main.cpp
270 tools/common.cpp)
271 target_link_libraries(bench PRIVATE dhtnet fmt::fmt)
272 target_include_directories(bench PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/tools)
273 install(TARGETS bench RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
274endif()
275
Adrien Béraudefe27372023-05-27 18:56:29 -0400276if (BUILD_TESTING AND NOT MSVC)
277 pkg_search_module(Cppunit REQUIRED IMPORTED_TARGET cppunit)
278 add_executable(tests_certstore tests/certstore.cpp)
279 target_link_libraries(tests_certstore PRIVATE dhtnet fmt::fmt PkgConfig::Cppunit)
280 add_test(NAME tests_certstore COMMAND tests_certstore)
281
282 add_executable(tests_connectionManager tests/connectionManager.cpp)
283 target_link_libraries(tests_connectionManager PRIVATE dhtnet fmt::fmt PkgConfig::Cppunit)
284 add_test(NAME tests_connectionManager COMMAND tests_connectionManager)
285
Adrien Béraud2a4e73d2023-08-27 12:53:55 -0400286 add_executable(tests_fileutils tests/testFileutils.cpp)
287 target_link_libraries(tests_fileutils PRIVATE dhtnet fmt::fmt PkgConfig::Cppunit)
288 add_test(NAME tests_fileutils COMMAND tests_fileutils)
Adrien Béraudefe27372023-05-27 18:56:29 -0400289
290 #add_executable(tests_stringutils tests/testString_utils.cpp)
291 #target_link_libraries(tests_stringutils PRIVATE dhtnet fmt::fmt PkgConfig::Cppunit)
292 #add_test(NAME tests_stringutils COMMAND tests_stringutils)
Adrien Bérauda4030cd2023-06-21 09:35:40 -0400293endif()