blob: 682501b68bb24ecabe808f6efda5cf9b5e07cf4e [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)
21
22if (NOT MSVC)
23 find_package (PkgConfig REQUIRED)
24
25 find_package(msgpack-cxx CONFIG)
26 if(msgpack-cxx_FOUND)
27 set(MSGPACK_LIB msgpack-cxx)
28 else()
29 find_package(msgpackc-cxx CONFIG REQUIRED NAMES msgpackc-cxx msgpack)
30 set(MSGPACK_LIB msgpackc-cxx)
31 endif()
32
33 find_package(fmt)
34 pkg_check_modules (opendht REQUIRED IMPORTED_TARGET opendht>=2.6.0)
35 pkg_check_modules (pjproject REQUIRED IMPORTED_TARGET libpjproject)
36else()
37 set (WIN32_DEP_DIR ${PROJECT_SOURCE_DIR}/../)
38 include_directories(
39 ${WIN32_DEP_DIR}/../msvc/include
40 ${WIN32_DEP_DIR}/msgpack-c/include
41 ${WIN32_DEP_DIR}/asio/asio/include
42 ${WIN32_DEP_DIR}/fmt/include
43 ${WIN32_DEP_DIR}/pjproject/pjlib/include
44 ${WIN32_DEP_DIR}/pjproject/pjlib-util/include
45 ${WIN32_DEP_DIR}/pjproject/pjnath/include
46 ${WIN32_DEP_DIR}/opendht/include
47 ${WIN32_DEP_DIR}/opendht/src/compat/msvc
48 ${WIN32_DEP_DIR}/openssl/include
49 ${WIN32_DEP_DIR}/restinio/dev
50 ${WIN32_DEP_DIR}/http_parser
51 ${WIN32_DEP_DIR}/pupnp/include
52 ${WIN32_DEP_DIR}/natpmp/include
53 )
54 # windirent.h
55 include_directories(include/compat/msvc)
56endif()
57
58if (NOT MSVC)
59 set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} \
60 -DMSGPACK_NO_BOOST \
61 -DMSGPACK_DISABLE_LEGACY_NIL \
62 -DMSGPACK_DISABLE_LEGACY_CONVERT")
63else()
64 set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} \
65 -DGNUTLS_INTERNAL_BUILD \
66 -D_USE_MATH_DEFINES \
67 -D_SCL_SECURE_NO_WARNINGS \
68 -D_CRT_SECURE_NO_WARNINGS \
69 -D_WINSOCK_DEPRECATED_NO_WARNINGS \
70 -DASIO_STANDALONE \
71 -DWIN32_LEAN_AND_MEAN \
72 -D_WIN32_WINNT=0x0601 \
73 -DNATPMP_STATICLIB \
74 -DMSGPACK_NO_BOOST \
75 -DMSGPACK_DISABLE_LEGACY_NIL \
76 -DMSGPACK_DISABLE_LEGACY_CONVERT \
77 -DUNICODE \
78 -D_UNICODE")
79endif()
Adrien Béraud370257c2023-08-15 20:53:09 -040080
Adrien Béraud612b55b2023-05-29 10:42:04 -040081# Sources
82list (APPEND dhtnet_SOURCES
83 src/connectionmanager.cpp
84 src/ice_transport.cpp
85 src/multiplexed_socket.cpp
86 src/peer_connection.cpp
87 src/string_utils.cpp
88 src/fileutils.cpp
Adrien Béraud80c14e12023-07-18 16:13:15 -040089 src/ip_utils.cpp
Adrien Béraud612b55b2023-05-29 10:42:04 -040090 src/security/tls_session.cpp
91 src/security/certstore.cpp
92 src/security/threadloop.cpp
Adrien Béraud45dfac92023-07-19 00:08:50 -040093 src/security/diffie-hellman.cpp
Adrien Bérauda1d294f2023-07-17 22:42:13 -040094 src/turn/turn_cache.cpp
95 src/turn/turn_transport.cpp
Morteza Namvar5f639522023-07-04 17:08:58 -040096 src/upnp/upnp_context.cpp
97 src/upnp/upnp_control.cpp
98 src/upnp/protocol/mapping.cpp
Adrien Béraud80c14e12023-07-18 16:13:15 -040099 src/upnp/protocol/igd.cpp
Adrien Béraud612b55b2023-05-29 10:42:04 -0400100)
101
102list (APPEND dhtnet_HEADERS
Adrien Béraud149f29e2023-07-05 14:47:49 -0400103 include/connectionmanager.h
104 include/multiplexed_socket.h
105 include/tls_session.h
106 include/certstore.h
107 include/ice_options.h
Adrien Béraud6de3f882023-07-06 12:56:29 -0400108 include/ice_transport.h
Adrien Béraudcb121f82023-07-08 09:18:39 -0400109 include/ice_transport_factory.h
Adrien Béraudaa8c4422023-07-07 11:40:36 -0400110 include/ice_socket.h
Adrien Béraud149f29e2023-07-05 14:47:49 -0400111 include/fileutils.h
112 include/string_utils.h
113 include/ip_utils.h
114 include/upnp/mapping.h
115 include/upnp/upnp_context.h
116 include/upnp/upnp_control.h
Adrien Béraud612b55b2023-05-29 10:42:04 -0400117)
118
Andreas Traczyk24cc01e2023-08-23 18:55:15 -0400119# Port mapping dependencies - add sources and libraries
120if (DHTNET_PUPNP AND NOT MSVC)
Adrien Béraud370257c2023-08-15 20:53:09 -0400121 pkg_search_module (upnp IMPORTED_TARGET upnp libupnp)
122 if (NOT upnp_FOUND)
123 message("libupnp not found: disabling")
124 set(DHTNET_PUPNP Off)
Adrien Béraud370257c2023-08-15 20:53:09 -0400125 endif()
126endif()
Andreas Traczyk24cc01e2023-08-23 18:55:15 -0400127if (DHTNET_NATPMP AND NOT MSVC)
Adrien Béraud370257c2023-08-15 20:53:09 -0400128 pkg_search_module (natpmp IMPORTED_TARGET natpmp)
129 if (NOT natpmp_FOUND)
130 find_library(natpmp_LIBRARIES natpmp)
131 if (NOT natpmp_LIBRARIES)
132 message("NAT-PMP not found: disabling")
133 set(DHTNET_NATPMP Off)
134 else()
135 message("NAT-PMP found: ${natpmp_LIBRARIES}")
136 endif()
137 endif()
Andreas Traczyk24cc01e2023-08-23 18:55:15 -0400138endif()
139
140if (DHTNET_PUPNP)
141 list (APPEND dhtnet_PRIVATE_DEFS HAVE_LIBUPNP)
142 list (APPEND dhtnet_SOURCES
143 src/upnp/protocol/pupnp/pupnp.cpp
144 src/upnp/protocol/pupnp/upnp_igd.cpp
145 )
146 list (APPEND dhtnet_PRIVATELIBS ${upnp_LIBRARIES})
147endif()
148if (DHTNET_NATPMP)
149 list (APPEND dhtnet_PRIVATE_DEFS HAVE_LIBNATPMP)
150 list (APPEND dhtnet_SOURCES
151 src/upnp/protocol/natpmp/nat_pmp.cpp
152 src/upnp/protocol/natpmp/pmp_igd.cpp
153 )
154 list (APPEND dhtnet_PRIVATELIBS ${natpmp_LIBRARIES})
Adrien Béraud370257c2023-08-15 20:53:09 -0400155endif()
156
Adrien Béraud612b55b2023-05-29 10:42:04 -0400157add_library(dhtnet ${dhtnet_SOURCES})
Andreas Traczyk24cc01e2023-08-23 18:55:15 -0400158if (NOT MSVC)
159 target_link_libraries(dhtnet PUBLIC PkgConfig::opendht PkgConfig::pjproject fmt::fmt ${MSGPACK_LIB})
160else()
161 target_link_libraries(dhtnet PUBLIC
162 ${WIN32_DEP_DIR}/../msvc/lib/libopendht.lib
163 ${WIN32_DEP_DIR}/../msvc/lib/libpjproject.lib
164 ${WIN32_DEP_DIR}/../msvc/lib/libfmt.lib
165 ${WIN32_DEP_DIR}/../msvc/lib/libmsgpackc-cxx.lib)
166endif()
Adrien Béraud06271002023-07-27 15:52:29 -0400167if (APPLE)
Adrien Béraud08548d92023-07-27 16:02:48 -0400168 target_link_libraries(dhtnet PRIVATE "-framework CoreFoundation" "-framework Security" "resolv")
Adrien Béraud06271002023-07-27 15:52:29 -0400169endif()
170
Adrien Béraud665d1112023-06-01 19:03:57 -0400171target_include_directories(dhtnet PUBLIC
172 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
173 $<INSTALL_INTERFACE:include>
174)
Andreas Traczyk24cc01e2023-08-23 18:55:15 -0400175
176target_compile_definitions(dhtnet PRIVATE ${dhtnet_PRIVATE_DEFS})
177target_link_libraries(dhtnet PRIVATE ${dhtnet_PRIVATELIBS})
178if (MSVC)
179 target_compile_definitions(dhtnet PRIVATE
180 _CRT_SECURE_NO_WARNINGS
181 _WINSOCK_DEPRECATED_NO_WARNINGS
182 ASIO_STANDALONE
183 _WIN32_WINNT=0x0601
184 MSGPACK_NO_BOOST
185 MSGPACK_DISABLE_LEGACY_NIL
186 MSGPACK_DISABLE_LEGACY_CONVERT
187 DHTNET_STATIC
188 DHTNET_STATIC_DEFINE
189 DHTNET_EXPORTS
190 DHTNET_BUILDING
191 DHT)
192 target_compile_options(dhtnet PRIVATE
193 /O2; /Oi; ${DEFAULT_CXX_RUNTIME_LIBRARY}; /Gy; /MP; /Oy-; /sdl-; /W0;
194 /FC; /FS; /nologo; /Zi; /wd4996; /wd4503; /wd4180; /wd4244; /wd4267;
195 /Zc:__cplusplus;
196 ${DEFAULT_CXX_EXCEPTION_HANDLING})
197else()
198 target_compile_definitions(dhtnet PUBLIC PJ_AUTOCONF=1)
Adrien Béraud370257c2023-08-15 20:53:09 -0400199endif()
Andreas Traczyk24cc01e2023-08-23 18:55:15 -0400200
201if (BUILD_TESTING AND NOT MSVC)
Adrien Béraud6b6a5d32023-08-15 15:53:33 -0400202 target_compile_definitions(dhtnet PUBLIC DHTNET_TESTABLE)
203endif()
Adrien Bérauda4030cd2023-06-21 09:35:40 -0400204
205configure_file(dhtnet.pc.in dhtnet.pc @ONLY)
206
Adrien Bérauda4030cd2023-06-21 09:35:40 -0400207# Install targets
Adrien Béraud13e33432023-07-18 14:49:35 -0400208install(TARGETS dhtnet)
Adrien Béraud149f29e2023-07-05 14:47:49 -0400209install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/dhtnet)
Adrien Béraud13e33432023-07-18 14:49:35 -0400210install(FILES ${CMAKE_CURRENT_BINARY_DIR}/dhtnet.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
Adrien Bérauda4030cd2023-06-21 09:35:40 -0400211
Andreas Traczyk24cc01e2023-08-23 18:55:15 -0400212if (BUILD_TOOLS AND NOT MSVC)
Amna38768302023-08-21 11:51:56 -0400213 add_executable(dnc
214 tools/dnc/main.cpp
215 tools/dnc/dnc.cpp
216 tools/common.cpp)
217 target_link_libraries(dnc PRIVATE dhtnet fmt::fmt)
218 target_include_directories(dnc PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/tools)
219 install(TARGETS dnc RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
Adrien Béraudb75ab9d2023-08-23 09:26:58 -0400220
221 add_executable(upnpctrl
222 tools/upnp/upnpctrl.cpp)
223 target_link_libraries(upnpctrl PRIVATE dhtnet fmt::fmt readline)
224 target_include_directories(upnpctrl PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/tools)
225 install(TARGETS upnpctrl RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
Amna38768302023-08-21 11:51:56 -0400226endif()
227
Adrien Béraudefe27372023-05-27 18:56:29 -0400228if (BUILD_TESTING AND NOT MSVC)
229 pkg_search_module(Cppunit REQUIRED IMPORTED_TARGET cppunit)
230 add_executable(tests_certstore tests/certstore.cpp)
231 target_link_libraries(tests_certstore PRIVATE dhtnet fmt::fmt PkgConfig::Cppunit)
232 add_test(NAME tests_certstore COMMAND tests_certstore)
233
234 add_executable(tests_connectionManager tests/connectionManager.cpp)
235 target_link_libraries(tests_connectionManager PRIVATE dhtnet fmt::fmt PkgConfig::Cppunit)
236 add_test(NAME tests_connectionManager COMMAND tests_connectionManager)
237
238 #add_executable(tests_fileutils tests/testFileutils.cpp)
239 #target_link_libraries(tests_fileutils PRIVATE dhtnet fmt::fmt PkgConfig::Cppunit)
240 #add_test(NAME tests_fileutils COMMAND tests_fileutils)
241
242 #add_executable(tests_stringutils tests/testString_utils.cpp)
243 #target_link_libraries(tests_stringutils PRIVATE dhtnet fmt::fmt PkgConfig::Cppunit)
244 #add_test(NAME tests_stringutils COMMAND tests_stringutils)
Adrien Bérauda4030cd2023-06-21 09:35:40 -0400245endif()