blob: 30b6b540f80669e5d391f8f215b5e59a66ca1340 [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)
Andreas Traczyk24cc01e2023-08-23 18:55:15 -040022
23if (NOT MSVC)
24 find_package (PkgConfig REQUIRED)
25
26 find_package(msgpack-cxx CONFIG)
27 if(msgpack-cxx_FOUND)
28 set(MSGPACK_LIB msgpack-cxx)
29 else()
30 find_package(msgpackc-cxx CONFIG REQUIRED NAMES msgpackc-cxx msgpack)
31 set(MSGPACK_LIB msgpackc-cxx)
32 endif()
33
34 find_package(fmt)
35 pkg_check_modules (opendht REQUIRED IMPORTED_TARGET opendht>=2.6.0)
36 pkg_check_modules (pjproject REQUIRED IMPORTED_TARGET libpjproject)
37else()
38 set (WIN32_DEP_DIR ${PROJECT_SOURCE_DIR}/../)
39 include_directories(
40 ${WIN32_DEP_DIR}/../msvc/include
41 ${WIN32_DEP_DIR}/msgpack-c/include
42 ${WIN32_DEP_DIR}/asio/asio/include
43 ${WIN32_DEP_DIR}/fmt/include
44 ${WIN32_DEP_DIR}/pjproject/pjlib/include
45 ${WIN32_DEP_DIR}/pjproject/pjlib-util/include
46 ${WIN32_DEP_DIR}/pjproject/pjnath/include
47 ${WIN32_DEP_DIR}/opendht/include
48 ${WIN32_DEP_DIR}/opendht/src/compat/msvc
49 ${WIN32_DEP_DIR}/openssl/include
50 ${WIN32_DEP_DIR}/restinio/dev
51 ${WIN32_DEP_DIR}/http_parser
52 ${WIN32_DEP_DIR}/pupnp/include
53 ${WIN32_DEP_DIR}/natpmp/include
54 )
55 # windirent.h
56 include_directories(include/compat/msvc)
57endif()
58
59if (NOT MSVC)
60 set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} \
61 -DMSGPACK_NO_BOOST \
62 -DMSGPACK_DISABLE_LEGACY_NIL \
63 -DMSGPACK_DISABLE_LEGACY_CONVERT")
64else()
65 set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} \
66 -DGNUTLS_INTERNAL_BUILD \
67 -D_USE_MATH_DEFINES \
68 -D_SCL_SECURE_NO_WARNINGS \
69 -D_CRT_SECURE_NO_WARNINGS \
70 -D_WINSOCK_DEPRECATED_NO_WARNINGS \
71 -DASIO_STANDALONE \
72 -DWIN32_LEAN_AND_MEAN \
73 -D_WIN32_WINNT=0x0601 \
74 -DNATPMP_STATICLIB \
75 -DMSGPACK_NO_BOOST \
76 -DMSGPACK_DISABLE_LEGACY_NIL \
77 -DMSGPACK_DISABLE_LEGACY_CONVERT \
78 -DUNICODE \
79 -D_UNICODE")
80endif()
Adrien Béraud370257c2023-08-15 20:53:09 -040081
Adrien Béraud612b55b2023-05-29 10:42:04 -040082# Sources
83list (APPEND dhtnet_SOURCES
84 src/connectionmanager.cpp
85 src/ice_transport.cpp
86 src/multiplexed_socket.cpp
87 src/peer_connection.cpp
88 src/string_utils.cpp
89 src/fileutils.cpp
Adrien Béraud80c14e12023-07-18 16:13:15 -040090 src/ip_utils.cpp
Adrien Béraud612b55b2023-05-29 10:42:04 -040091 src/security/tls_session.cpp
92 src/security/certstore.cpp
93 src/security/threadloop.cpp
Adrien Béraud45dfac92023-07-19 00:08:50 -040094 src/security/diffie-hellman.cpp
Adrien Bérauda1d294f2023-07-17 22:42:13 -040095 src/turn/turn_cache.cpp
96 src/turn/turn_transport.cpp
Morteza Namvar5f639522023-07-04 17:08:58 -040097 src/upnp/upnp_context.cpp
98 src/upnp/upnp_control.cpp
99 src/upnp/protocol/mapping.cpp
Adrien Béraud80c14e12023-07-18 16:13:15 -0400100 src/upnp/protocol/igd.cpp
Adrien Béraud612b55b2023-05-29 10:42:04 -0400101)
102
103list (APPEND dhtnet_HEADERS
Adrien Béraud149f29e2023-07-05 14:47:49 -0400104 include/connectionmanager.h
105 include/multiplexed_socket.h
106 include/tls_session.h
107 include/certstore.h
108 include/ice_options.h
Adrien Béraud6de3f882023-07-06 12:56:29 -0400109 include/ice_transport.h
Adrien Béraudcb121f82023-07-08 09:18:39 -0400110 include/ice_transport_factory.h
Adrien Béraudaa8c4422023-07-07 11:40:36 -0400111 include/ice_socket.h
Adrien Béraud149f29e2023-07-05 14:47:49 -0400112 include/fileutils.h
113 include/string_utils.h
114 include/ip_utils.h
115 include/upnp/mapping.h
116 include/upnp/upnp_context.h
117 include/upnp/upnp_control.h
Adrien Béraud612b55b2023-05-29 10:42:04 -0400118)
119
Andreas Traczyk24cc01e2023-08-23 18:55:15 -0400120# Port mapping dependencies - add sources and libraries
121if (DHTNET_PUPNP AND NOT MSVC)
Adrien Béraud370257c2023-08-15 20:53:09 -0400122 pkg_search_module (upnp IMPORTED_TARGET upnp libupnp)
123 if (NOT upnp_FOUND)
124 message("libupnp not found: disabling")
125 set(DHTNET_PUPNP Off)
Adrien Béraud6c6a9622023-08-27 12:49:31 -0400126 else()
127 set(upnp_LIBRARIES PkgConfig::upnp)
Adrien Béraud0e6730e2023-08-29 14:12:52 -0400128 set (requiresprivate "${requiresprivate} libupnp")
Adrien Béraud370257c2023-08-15 20:53:09 -0400129 endif()
130endif()
Andreas Traczyk24cc01e2023-08-23 18:55:15 -0400131if (DHTNET_NATPMP AND NOT MSVC)
Adrien Béraud370257c2023-08-15 20:53:09 -0400132 pkg_search_module (natpmp IMPORTED_TARGET natpmp)
133 if (NOT natpmp_FOUND)
134 find_library(natpmp_LIBRARIES natpmp)
135 if (NOT natpmp_LIBRARIES)
136 message("NAT-PMP not found: disabling")
137 set(DHTNET_NATPMP Off)
138 else()
139 message("NAT-PMP found: ${natpmp_LIBRARIES}")
Adrien Béraud0e6730e2023-08-29 14:12:52 -0400140 set (libsprivate "${libsprivate} -lnatpmp")
Adrien Béraud370257c2023-08-15 20:53:09 -0400141 endif()
142 endif()
Andreas Traczyk24cc01e2023-08-23 18:55:15 -0400143endif()
144
145if (DHTNET_PUPNP)
146 list (APPEND dhtnet_PRIVATE_DEFS HAVE_LIBUPNP)
147 list (APPEND dhtnet_SOURCES
148 src/upnp/protocol/pupnp/pupnp.cpp
149 src/upnp/protocol/pupnp/upnp_igd.cpp
150 )
151 list (APPEND dhtnet_PRIVATELIBS ${upnp_LIBRARIES})
152endif()
153if (DHTNET_NATPMP)
154 list (APPEND dhtnet_PRIVATE_DEFS HAVE_LIBNATPMP)
155 list (APPEND dhtnet_SOURCES
156 src/upnp/protocol/natpmp/nat_pmp.cpp
157 src/upnp/protocol/natpmp/pmp_igd.cpp
158 )
159 list (APPEND dhtnet_PRIVATELIBS ${natpmp_LIBRARIES})
Adrien Béraud370257c2023-08-15 20:53:09 -0400160endif()
161
Adrien Béraud612b55b2023-05-29 10:42:04 -0400162add_library(dhtnet ${dhtnet_SOURCES})
Andreas Traczyk24cc01e2023-08-23 18:55:15 -0400163if (NOT MSVC)
164 target_link_libraries(dhtnet PUBLIC PkgConfig::opendht PkgConfig::pjproject fmt::fmt ${MSGPACK_LIB})
165else()
166 target_link_libraries(dhtnet PUBLIC
167 ${WIN32_DEP_DIR}/../msvc/lib/libopendht.lib
168 ${WIN32_DEP_DIR}/../msvc/lib/libpjproject.lib
169 ${WIN32_DEP_DIR}/../msvc/lib/libfmt.lib
170 ${WIN32_DEP_DIR}/../msvc/lib/libmsgpackc-cxx.lib)
171endif()
Adrien Béraud06271002023-07-27 15:52:29 -0400172if (APPLE)
Adrien Béraud08548d92023-07-27 16:02:48 -0400173 target_link_libraries(dhtnet PRIVATE "-framework CoreFoundation" "-framework Security" "resolv")
Adrien Béraud06271002023-07-27 15:52:29 -0400174endif()
175
Adrien Béraud665d1112023-06-01 19:03:57 -0400176target_include_directories(dhtnet PUBLIC
177 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
178 $<INSTALL_INTERFACE:include>
179)
Andreas Traczyk24cc01e2023-08-23 18:55:15 -0400180
181target_compile_definitions(dhtnet PRIVATE ${dhtnet_PRIVATE_DEFS})
182target_link_libraries(dhtnet PRIVATE ${dhtnet_PRIVATELIBS})
183if (MSVC)
184 target_compile_definitions(dhtnet PRIVATE
185 _CRT_SECURE_NO_WARNINGS
186 _WINSOCK_DEPRECATED_NO_WARNINGS
187 ASIO_STANDALONE
188 _WIN32_WINNT=0x0601
189 MSGPACK_NO_BOOST
190 MSGPACK_DISABLE_LEGACY_NIL
191 MSGPACK_DISABLE_LEGACY_CONVERT
192 DHTNET_STATIC
193 DHTNET_STATIC_DEFINE
194 DHTNET_EXPORTS
195 DHTNET_BUILDING
196 DHT)
197 target_compile_options(dhtnet PRIVATE
198 /O2; /Oi; ${DEFAULT_CXX_RUNTIME_LIBRARY}; /Gy; /MP; /Oy-; /sdl-; /W0;
199 /FC; /FS; /nologo; /Zi; /wd4996; /wd4503; /wd4180; /wd4244; /wd4267;
200 /Zc:__cplusplus;
201 ${DEFAULT_CXX_EXCEPTION_HANDLING})
202else()
203 target_compile_definitions(dhtnet PUBLIC PJ_AUTOCONF=1)
Adrien Béraud370257c2023-08-15 20:53:09 -0400204endif()
Andreas Traczyk24cc01e2023-08-23 18:55:15 -0400205
206if (BUILD_TESTING AND NOT MSVC)
Adrien Béraud6b6a5d32023-08-15 15:53:33 -0400207 target_compile_definitions(dhtnet PUBLIC DHTNET_TESTABLE)
208endif()
Adrien Bérauda4030cd2023-06-21 09:35:40 -0400209
210configure_file(dhtnet.pc.in dhtnet.pc @ONLY)
211
Adrien Bérauda4030cd2023-06-21 09:35:40 -0400212# Install targets
Adrien Béraud13e33432023-07-18 14:49:35 -0400213install(TARGETS dhtnet)
Adrien Béraud149f29e2023-07-05 14:47:49 -0400214install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/dhtnet)
Adrien Béraud13e33432023-07-18 14:49:35 -0400215install(FILES ${CMAKE_CURRENT_BINARY_DIR}/dhtnet.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
Adrien Bérauda4030cd2023-06-21 09:35:40 -0400216
Andreas Traczyk24cc01e2023-08-23 18:55:15 -0400217if (BUILD_TOOLS AND NOT MSVC)
Amna38768302023-08-21 11:51:56 -0400218 add_executable(dnc
219 tools/dnc/main.cpp
220 tools/dnc/dnc.cpp
221 tools/common.cpp)
222 target_link_libraries(dnc PRIVATE dhtnet fmt::fmt)
223 target_include_directories(dnc PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/tools)
224 install(TARGETS dnc RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
Adrien Béraudb75ab9d2023-08-23 09:26:58 -0400225
226 add_executable(upnpctrl
227 tools/upnp/upnpctrl.cpp)
228 target_link_libraries(upnpctrl PRIVATE dhtnet fmt::fmt readline)
229 target_include_directories(upnpctrl PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/tools)
230 install(TARGETS upnpctrl RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
Amna38768302023-08-21 11:51:56 -0400231endif()
232
Adrien Béraud6c6a9622023-08-27 12:49:31 -0400233if (BUILD_BENCHMARKS)
234 add_executable(bench
235 tools/benchmark/main.cpp
236 tools/common.cpp)
237 target_link_libraries(bench PRIVATE dhtnet fmt::fmt)
238 target_include_directories(bench PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/tools)
239 install(TARGETS bench RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
240endif()
241
Adrien Béraudefe27372023-05-27 18:56:29 -0400242if (BUILD_TESTING AND NOT MSVC)
243 pkg_search_module(Cppunit REQUIRED IMPORTED_TARGET cppunit)
244 add_executable(tests_certstore tests/certstore.cpp)
245 target_link_libraries(tests_certstore PRIVATE dhtnet fmt::fmt PkgConfig::Cppunit)
246 add_test(NAME tests_certstore COMMAND tests_certstore)
247
248 add_executable(tests_connectionManager tests/connectionManager.cpp)
249 target_link_libraries(tests_connectionManager PRIVATE dhtnet fmt::fmt PkgConfig::Cppunit)
250 add_test(NAME tests_connectionManager COMMAND tests_connectionManager)
251
Adrien Béraud2a4e73d2023-08-27 12:53:55 -0400252 add_executable(tests_fileutils tests/testFileutils.cpp)
253 target_link_libraries(tests_fileutils PRIVATE dhtnet fmt::fmt PkgConfig::Cppunit)
254 add_test(NAME tests_fileutils COMMAND tests_fileutils)
Adrien Béraudefe27372023-05-27 18:56:29 -0400255
256 #add_executable(tests_stringutils tests/testString_utils.cpp)
257 #target_link_libraries(tests_stringutils PRIVATE dhtnet fmt::fmt PkgConfig::Cppunit)
258 #add_test(NAME tests_stringutils COMMAND tests_stringutils)
Adrien Bérauda4030cd2023-06-21 09:35:40 -0400259endif()