]>
Commit | Line | Data |
---|---|---|
855030f3 | 1 | cmake_minimum_required(VERSION 3.14) |
e8881ec6 | 2 | set(CMAKE_CONFIGURATION_TYPES "Release;Debug;ASAN") |
01341840 AS |
3 | project(openvpn) |
4 | ||
5 | # This CMake file implements building OpenVPN with CMAKE | |
6 | # | |
7 | # Note that this is *NOT* the official way to build openvpn on anything | |
8 | # other than Windows/mingw despite working on other platforms too. You will need | |
9 | # to add -DUNSUPPORTED_BUILDS=true to build on non Windows platforms. | |
10 | # | |
11 | # This cmake also makes a few assertions like lzo, lz4 being used | |
12 | # and OpenSSL having version 1.1.1+ and generally does not offer the same | |
13 | # configurability like autoconf | |
14 | ||
eb3cd5ea AS |
15 | find_package(PkgConfig REQUIRED) |
16 | include(CheckSymbolExists) | |
17 | include(CheckIncludeFiles) | |
18 | include(CheckCCompilerFlag) | |
4ef76f0e | 19 | include(CheckLinkerFlag OPTIONAL) |
eb3cd5ea AS |
20 | include(CheckTypeSize) |
21 | include(CheckStructHasMember) | |
22 | include(CTest) | |
23 | ||
01341840 AS |
24 | option(UNSUPPORTED_BUILDS "Allow unsupported builds" OFF) |
25 | ||
26 | if (NOT WIN32 AND NOT ${UNSUPPORTED_BUILDS}) | |
27 | message(FATAL_ERROR "Note: on Unix platform the official and supported build method is using autoconfig. CMake based build should be only used for Windows and internal testing/development.") | |
28 | endif() | |
29 | ||
0652ae84 FL |
30 | if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/config.h") |
31 | message(FATAL_ERROR "The top level source directory has a config.h file. Note that you can't mix in-tree autoconfig builds with out-of-tree cmake builds.") | |
32 | endif () | |
33 | ||
01341840 | 34 | option(MBED "BUILD with mbed" OFF) |
8656b85c AS |
35 | set(MBED_INCLUDE_PATH "" CACHE STRING "Path to mbed TLS include directory") |
36 | set(MBED_LIBRARY_PATH "" CACHE STRING "Path to mbed library directory") | |
01341840 | 37 | option(WOLFSSL "BUILD with wolfSSL" OFF) |
e8881ec6 FL |
38 | option(ENABLE_LZ4 "BUILD with lz4" ON) |
39 | option(ENABLE_LZO "BUILD with lzo" ON) | |
40 | option(ENABLE_PKCS11 "BUILD with pkcs11-helper" ON) | |
41 | option(USE_WERROR "Treat compiler warnings as errors (-Werror)" ON) | |
42 | ||
43 | set(PLUGIN_DIR /usr/local/lib/openvpn/plugins CACHE FILEPATH "Location of the plugin directory") | |
01341840 | 44 | |
855030f3 | 45 | # Create machine readable compile commands |
4bcb38c4 HH |
46 | option(ENABLE_COMPILE_COMMANDS "Generate compile_commands.json and a symlink for clangd to find it" OFF) |
47 | if (ENABLE_COMPILE_COMMANDS) | |
48 | if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/build AND NOT IS_SYMLINK ${CMAKE_CURRENT_SOURCE_DIR}/build) | |
49 | message(FATAL_ERROR "The top level source directory contains a 'build' file or directory. Please remove or rename it. CMake creates a symlink with that name during build.") | |
50 | endif() | |
51 | set(CMAKE_EXPORT_COMPILE_COMMANDS 1) | |
52 | add_custom_target( | |
53 | symlink-build-dir ALL | |
54 | ${CMAKE_COMMAND} -E create_symlink ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/build | |
55 | ) | |
56 | endif () | |
855030f3 | 57 | |
01341840 AS |
58 | # AddressSanitize - use CXX=clang++ CC=clang cmake -DCMAKE_BUILD_TYPE=asan to build with ASAN |
59 | set(CMAKE_C_FLAGS_ASAN | |
e8881ec6 FL |
60 | "-fsanitize=address,undefined -fno-sanitize-recover=all -fno-optimize-sibling-calls -fsanitize-address-use-after-scope -fno-omit-frame-pointer -g -O1" |
61 | CACHE STRING "Flags used by the C compiler during AddressSanitizer builds." | |
62 | FORCE) | |
01341840 | 63 | set(CMAKE_CXX_FLAGS_ASAN |
e8881ec6 FL |
64 | "-fsanitize=address,undefined -fno-sanitize-recover=all -fno-optimize-sibling-calls -fsanitize-address-use-after-scope -fno-omit-frame-pointer -g -O1" |
65 | CACHE STRING "Flags used by the C++ compiler during AddressSanitizer builds." | |
66 | FORCE) | |
01341840 AS |
67 | |
68 | if (MSVC) | |
e8881ec6 FL |
69 | add_definitions(-D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE -D_WINSOCK_DEPRECATED_NO_WARNINGS) |
70 | if (USE_WERROR) | |
71 | add_compile_options(/WX) | |
72 | endif () | |
73 | add_compile_options( | |
74 | /MP | |
75 | /W2 | |
76 | /sdl | |
77 | /Qspectre | |
78 | /guard:cf | |
79 | /FC | |
80 | /ZH:SHA_256 | |
81 | "$<$<CONFIG:Release>:/GL>" | |
82 | "$<$<CONFIG:Release>:/Oi>" | |
83 | "$<$<CONFIG:Release>:/Gy>" | |
84 | "$<$<CONFIG:Release>:/Zi>" | |
85 | ) | |
86 | add_link_options( | |
5e94e8de | 87 | /Brepro |
e8881ec6 FL |
88 | "$<$<CONFIG:Release>:/LTCG:incremental>" |
89 | "$<$<CONFIG:Release>:/DEBUG:FULL>" | |
90 | "$<$<CONFIG:Release>:/OPT:REF>" | |
91 | "$<$<CONFIG:Release>:/OPT:ICF>" | |
92 | ) | |
93 | if (${CMAKE_GENERATOR_PLATFORM} STREQUAL "x64" OR ${CMAKE_GENERATOR_PLATFORM} STREQUAL "x86") | |
94 | add_link_options("$<$<CONFIG:Release>:/CETCOMPAT>") | |
95 | endif() | |
01341840 | 96 | else () |
eb3cd5ea AS |
97 | add_compile_options(-Wall -Wuninitialized) |
98 | check_c_compiler_flag(-Wno-stringop-truncation NoStringOpTruncation) | |
99 | ||
100 | if (${NoStringOpTruncation}) | |
101 | add_compile_options(-Wno-stringop-truncation) | |
102 | endif() | |
01341840 | 103 | # We are not ready for this |
e8881ec6 FL |
104 | #add_compile_options(-Wconversion -Wno-sign-conversion -Wsign-compare) |
105 | if (USE_WERROR) | |
106 | add_compile_options(-Werror) | |
107 | endif () | |
01341840 AS |
108 | endif () |
109 | ||
e8881ec6 FL |
110 | find_program(PYTHON NAMES python3 python) |
111 | execute_process( | |
112 | COMMAND ${PYTHON} ${CMAKE_CURRENT_SOURCE_DIR}/contrib/cmake/parse-version.m4.py ${CMAKE_CURRENT_SOURCE_DIR}/version.m4 | |
113 | WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} | |
114 | ) | |
115 | include(${CMAKE_CURRENT_BINARY_DIR}/version.cmake) | |
01341840 | 116 | |
e8881ec6 FL |
117 | set(OPENVPN_VERSION_MAJOR ${PRODUCT_VERSION_MAJOR}) |
118 | set(OPENVPN_VERSION_MINOR ${PRODUCT_VERSION_MINOR}) | |
119 | set(OPENVPN_VERSION_PATCH ${PRODUCT_VERSION_PATCH}) | |
120 | set(OPENVPN_VERSION_RESOURCE ${PRODUCT_VERSION_RESOURCE}) | |
01341840 | 121 | |
e8881ec6 | 122 | set(CMAKE_C_STANDARD 99) |
01341840 AS |
123 | |
124 | # Set the various defines for config.h.cmake.in | |
125 | if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux") | |
126 | set(TARGET_LINUX YES) | |
127 | set(ENABLE_ASYNC_PUSH YES) | |
128 | set(ENABLE_LINUXDCO YES) | |
129 | set(ENABLE_SITNL YES) | |
130 | set(HAVE_DECL_SO_MARK YES) | |
131 | set(ENABLE_FEATURE_TUN_PERSIST 1) | |
132 | set(HAVE_LINUX_TYPES_H 1) | |
133 | set(ENABLE_DCO YES) | |
134 | set(HAVE_CMSGHDR YES) | |
135 | elseif (${CMAKE_SYSTEM_NAME} STREQUAL "FreeBSD") | |
136 | set(TARGET_FREEBSD YES) | |
137 | set(ENABLE_DCO YES) | |
138 | link_libraries(-lnv) | |
efbedf21 AS |
139 | elseif (${CMAKE_SYSTEM_NAME} STREQUAL "SunOS") |
140 | set(TARGET_SOLARIS YES) | |
141 | set(HAVE_SYS_SOCKIO_H 1) | |
142 | link_libraries(-lnsl -lsocket -lresolv) | |
01341840 AS |
143 | elseif (WIN32) |
144 | set(ENABLE_DCO YES) | |
145 | elseif (APPLE) | |
146 | set(TARGET_DARWIN YES) | |
147 | set(HAVE_NET_IF_UTUN_H YES) | |
efbedf21 AS |
148 | else() |
149 | message(FATAL_ERROR "Unknown system name: \"${CMAKE_SYSTEM_NAME}\"") | |
01341840 AS |
150 | endif () |
151 | ||
152 | if (UNIX) | |
153 | set(PATH_SEPARATOR /) | |
154 | set(ENABLE_PORT_SHARE YES) | |
155 | set(HAVE_SA_FAMILY_T YES) | |
156 | elseif (WIN32) | |
157 | set(PATH_SEPARATOR \\\\) | |
158 | set(TARGET_WIN32 YES) | |
159 | endif () | |
160 | ||
e8881ec6 FL |
161 | check_symbol_exists(chroot unistd.h HAVE_CHROOT) |
162 | check_symbol_exists(chdir unistd.h HAVE_CHDIR) | |
163 | check_symbol_exists(dup unistd.h HAVE_DUP) | |
164 | check_symbol_exists(dup2 unistd.h HAVE_DUP2) | |
165 | check_symbol_exists(fork unistd.h HAVE_FORK) | |
166 | check_symbol_exists(execve unistd.h HAVE_EXECVE) | |
167 | check_symbol_exists(ftruncate unistd.h HAVE_FTRUNCATE) | |
4d8ee61c | 168 | check_symbol_exists(nice unistd.h HAVE_NICE) |
e8881ec6 FL |
169 | check_symbol_exists(setgid unistd.h HAVE_SETGID) |
170 | check_symbol_exists(setuid unistd.h HAVE_SETUID) | |
8ae6c48d | 171 | check_symbol_exists(setsid unistd.h HAVE_SETSID) |
e8881ec6 FL |
172 | check_symbol_exists(getpeereid unistd.h HAVE_GETPEEREID) |
173 | ||
174 | check_symbol_exists(epoll_create sys/epoll.h HAVE_EPOLL_CREATE) | |
175 | ||
176 | check_symbol_exists(gettimeofday sys/time.h HAVE_GETTIMEOFDAY) | |
177 | check_symbol_exists(basename libgen.h HAVE_BASENAME) | |
178 | check_symbol_exists(chsize io.h HAVE_CHSIZE) | |
e363b393 | 179 | check_symbol_exists(daemon "unistd.h;stdlib.h" HAVE_DAEMON) |
e8881ec6 FL |
180 | check_symbol_exists(dirname libgen.h HAVE_DIRNAME) |
181 | check_symbol_exists(getrlimit sys/resource.h HAVE_GETRLIMIT) | |
182 | check_symbol_exists(mlockall sys/mman.h HAVE_MLOCKALL) | |
183 | ||
184 | check_symbol_exists(sendmsg sys/socket.h HAVE_SENDMSG) | |
185 | check_symbol_exists(recvmsg sys/socket.h HAVE_RECVMSG) | |
186 | check_symbol_exists(cmsghdr sys/socket.h HAVE_CMSGHDR) | |
187 | check_symbol_exists(openlog syslog.h HAVE_OPENLOG) | |
188 | check_symbol_exists(syslog syslog.h HAVE_SYSLOG) | |
189 | check_symbol_exists(getgrnam grp.h HAVE_GETGRNAM) | |
190 | check_symbol_exists(getpwnam pwd.h HAVE_GETPWNAM) | |
191 | check_symbol_exists(getsockname sys/socket.h HAVE_GETSOCKNAME) | |
28871fec | 192 | check_symbol_exists(getrlimit "sys/time.h;sys/resource.h" HAVE_GETRLIMIT) |
01341840 AS |
193 | |
194 | # Some OS (e.g. FreeBSD) need some basic headers to allow | |
195 | # including network headers | |
e8881ec6 FL |
196 | set(NETEXTRA sys/types.h) |
197 | check_include_files("${NETEXTRA};netinet/in.h" HAVE_NETINET_IN_H) | |
01341840 AS |
198 | |
199 | if (HAVE_NETINET_IN_H) | |
e8881ec6 | 200 | list(APPEND NETEXTRA netinet/in.h) |
01341840 AS |
201 | endif () |
202 | ||
e8881ec6 FL |
203 | check_include_files("${NETEXTRA};netinet/in6.h" HAVE_NETINET_IN_H) |
204 | check_include_files(linux/if_tun.h HAVE_LINUX_IF_TUN_H) | |
205 | check_include_files(linux/sockios.h HAVE_LINUX_SOCKIOS_H) | |
206 | check_include_files(dlfcn.h HAVE_DLFCN_H) | |
207 | check_include_files(fcntl.h HAVE_FCNTL_H) | |
208 | check_include_files(dmalloc.h HAVE_DMALLOC_H) | |
209 | check_include_files(err.h HAVE_ERR_H) | |
210 | check_include_files(sys/epoll.h HAVE_SYS_EPOLL_H) | |
211 | check_include_files(poll.h HAVE_POLL_H) | |
212 | check_include_files(sys/socket.h HAVE_SYS_SOCKET_H) | |
213 | check_include_files(sys/time.h HAVE_SYS_TIME_H) | |
214 | check_include_files(netdb.h HAVE_NETDB_H) | |
215 | check_include_files(unistd.h HAVE_UNISTD_H) | |
216 | check_include_files(sys/un.h HAVE_SYS_UN_H) | |
217 | check_include_files(libgen.h HAVE_LIBGEN_H) | |
218 | check_include_files(net/if.h HAVE_NET_IF_H) | |
219 | check_include_files("${NETEXTRA};netinet/ip.h" HAVE_NETINET_IP_H) | |
220 | check_include_files(arpa/inet.h HAVE_ARPA_INET_H) | |
221 | check_include_files(net/if_utun.h HAVE_NET_UTUN_H) | |
222 | check_include_files(sys/ioctl.h HAVE_SYS_IOCTL_H) | |
223 | check_include_files(sys/inotify.h HAVE_SYS_INOTIFY_H) | |
224 | check_include_files("${NETEXTRA};sys/uio.h" HAVE_SYS_UIO_H) | |
225 | check_include_files(syslog.h HAVE_SYSLOG_H) | |
226 | check_include_files(sys/wait.h HAVE_SYS_WAIT_H) | |
227 | check_include_files(grp.h HAVE_GRP_H) | |
228 | check_include_files(pwd.h HAVE_PWD_H) | |
229 | check_include_files(sys/mman.h HAVE_SYS_MMAN_H) | |
230 | ||
231 | ||
232 | check_include_files("${NETEXTRA};resolv.h" HAVE_RESOLV_H) | |
233 | check_include_files("${NETEXTRA};net/if_tun.h" HAVE_NET_IF_TUN_H) | |
234 | ||
235 | set(CMAKE_EXTRA_INCLUDE_FILES netinet/ip.h) | |
236 | check_type_size("struct in_pktinfo" IN_PKTINFO) | |
237 | check_struct_has_member("struct in_pktinfo" ipi_spec_dst netinet/ip.h HAVE_IPI_SPEC_DST) | |
238 | check_type_size("struct msghdr" MSGHDR) | |
239 | set(CMAKE_EXTRA_INCLUDE_FILES) | |
01341840 AS |
240 | |
241 | find_program(IFCONFIG_PATH ifconfig) | |
242 | find_program(IPROUTE_PATH ip) | |
243 | find_program(ROUTE_PATH route) | |
244 | ||
e8881ec6 FL |
245 | if (${ENABLE_LZ4}) |
246 | pkg_search_module(liblz4 liblz4 REQUIRED IMPORTED_TARGET) | |
247 | endif () | |
01341840 | 248 | |
e8881ec6 FL |
249 | if (${ENABLE_LZO}) |
250 | pkg_search_module(lzo2 lzo2 REQUIRED IMPORTED_TARGET) | |
251 | endif () | |
252 | ||
253 | if (${ENABLE_PKCS11}) | |
254 | pkg_search_module(pkcs11-helper libpkcs11-helper-1 REQUIRED IMPORTED_TARGET) | |
01341840 AS |
255 | endif () |
256 | ||
8656b85c AS |
257 | function(check_mbed_configuration) |
258 | if (NOT (MBED_INCLUDE_PATH STREQUAL "") ) | |
259 | set(CMAKE_REQUIRED_INCLUDES ${MBED_INCLUDE_PATH}) | |
260 | endif () | |
261 | if (NOT (MBED_LIBRARY_PATH STREQUAL "")) | |
262 | set(CMAKE_REQUIRED_LINK_OPTIONS "-L${MBED_LIBRARY_PATH}") | |
263 | endif () | |
264 | set(CMAKE_REQUIRED_LIBRARIES "mbedtls;mbedx509;mbedcrypto") | |
265 | check_symbol_exists(mbedtls_ctr_drbg_update_ret mbedtls/ctr_drbg.h HAVE_MBEDTLS_CTR_DRBG_UPDATE_RET) | |
266 | check_symbol_exists(mbedtls_ssl_conf_export_keys_ext_cb mbedtls/ssl.h HAVE_MBEDTLS_SSL_CONF_EXPORT_KEYS_EXT_CB) | |
267 | check_include_files(psa/crypto.h HAVE_MBEDTLS_PSA_CRYPTO_H) | |
268 | endfunction() | |
269 | ||
270 | if (${MBED}) | |
271 | check_mbed_configuration() | |
272 | endif() | |
273 | ||
01341840 AS |
274 | function(add_library_deps target) |
275 | if (${MBED}) | |
8656b85c AS |
276 | if (NOT (MBED_INCLUDE_PATH STREQUAL "") ) |
277 | target_include_directories(${target} PRIVATE ${MBED_INCLUDE_PATH}) | |
278 | endif () | |
279 | if(NOT (MBED_LIBRARY_PATH STREQUAL "")) | |
280 | target_link_directories(${target} PRIVATE ${MBED_LIBRARY_PATH}) | |
281 | endif () | |
282 | ||
283 | target_link_libraries(${target} PRIVATE -lmbedtls -lmbedx509 -lmbedcrypto) | |
01341840 AS |
284 | elseif (${WOLFSSL}) |
285 | pkg_search_module(wolfssl wolfssl REQUIRED) | |
286 | target_link_libraries(${target} PUBLIC ${wolfssl_LINK_LIBRARIES}) | |
287 | target_include_directories(${target} PRIVATE ${wolfssl_INCLUDE_DIRS}/wolfssl) | |
01341840 AS |
288 | else () |
289 | set(ENABLE_X509ALTUSERNAME YES) | |
290 | ||
291 | find_package(OpenSSL REQUIRED) | |
e8881ec6 FL |
292 | target_link_libraries(${target} PUBLIC OpenSSL::SSL OpenSSL::Crypto) |
293 | if (WIN32) | |
294 | target_link_libraries(${target} PUBLIC | |
295 | ws2_32.lib crypt32.lib fwpuclnt.lib iphlpapi.lib | |
296 | wininet.lib setupapi.lib rpcrt4.lib wtsapi32.lib ncrypt.lib bcrypt.lib) | |
297 | endif () | |
01341840 | 298 | |
01341840 AS |
299 | endif () |
300 | ||
0ce06893 AS |
301 | if (MINGW) |
302 | target_compile_definitions(${target} PRIVATE | |
303 | -DWIN32_LEAN_AND_MEAN | |
304 | -DNTDDI_VERSION=NTDDI_VISTA -D_WIN32_WINNT=_WIN32_WINNT_VISTA | |
305 | ) | |
306 | endif() | |
307 | ||
e8881ec6 FL |
308 | # optional dependencies |
309 | target_link_libraries(${target} PUBLIC | |
310 | $<TARGET_NAME_IF_EXISTS:PkgConfig::liblz4> | |
311 | $<TARGET_NAME_IF_EXISTS:PkgConfig::lzo2> | |
312 | $<TARGET_NAME_IF_EXISTS:PkgConfig::pkcs11-helper> | |
313 | ) | |
01341840 AS |
314 | |
315 | if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux") | |
e8881ec6 FL |
316 | pkg_search_module(libcapng REQUIRED libcap-ng IMPORTED_TARGET) |
317 | pkg_search_module(libnl REQUIRED libnl-genl-3.0 IMPORTED_TARGET) | |
01341840 | 318 | |
e8881ec6 | 319 | target_link_libraries(${target} PUBLIC PkgConfig::libcapng PkgConfig::libnl) |
01341840 | 320 | endif () |
e8881ec6 | 321 | |
01341840 AS |
322 | endfunction() |
323 | ||
324 | if (${MBED}) | |
325 | set(ENABLE_CRYPTO_MBEDTLS YES) | |
326 | elseif (${WOLFSSL}) | |
327 | set(ENABLE_CRYPTO_OPENSSL YES) | |
328 | set(ENABLE_CRYPTO_WOLFSSL YES) | |
329 | set(ENABLE_X509ALTUSERNAME YES) | |
330 | else () | |
331 | set(ENABLE_CRYPTO_OPENSSL YES) | |
332 | set(ENABLE_X509ALTUSERNAME YES) | |
333 | endif () | |
334 | ||
335 | include_directories(${CMAKE_CURRENT_SOURCE_DIR} src/compat include) | |
336 | ||
e8881ec6 FL |
337 | add_custom_command( |
338 | OUTPUT always_rebuild config-version.h | |
339 | COMMAND ${PYTHON} ${CMAKE_CURRENT_SOURCE_DIR}/contrib/cmake/git-version.py | |
340 | ) | |
341 | set(HAVE_CONFIG_VERSION_H YES) | |
01341840 AS |
342 | |
343 | configure_file(config.h.cmake.in config.h) | |
344 | configure_file(include/openvpn-plugin.h.in openvpn-plugin.h) | |
95cc5faa | 345 | # TODO we should remove the need for this, and always include config.h |
e8881ec6 | 346 | add_definitions(-DHAVE_CONFIG_H) |
01341840 AS |
347 | |
348 | include_directories(${CMAKE_CURRENT_BINARY_DIR}) | |
349 | ||
e8881ec6 FL |
350 | add_subdirectory(doc) |
351 | add_subdirectory(src/openvpnmsica) | |
352 | add_subdirectory(src/openvpnserv) | |
353 | add_subdirectory(src/tapctl) | |
01341840 | 354 | |
e8881ec6 FL |
355 | set(SOURCE_FILES |
356 | ${CMAKE_CURRENT_BINARY_DIR}/config.h | |
357 | ${CMAKE_CURRENT_BINARY_DIR}/config-version.h | |
358 | ${CMAKE_CURRENT_BINARY_DIR}/openvpn-plugin.h | |
359 | ||
360 | src/compat/compat-basename.c | |
361 | src/compat/compat-daemon.c | |
362 | src/compat/compat-dirname.c | |
363 | src/compat/compat-gettimeofday.c | |
364 | src/compat/compat-strsep.c | |
e8881ec6 FL |
365 | src/openvpn/argv.c |
366 | src/openvpn/argv.h | |
367 | src/openvpn/base64.c | |
368 | src/openvpn/base64.h | |
369 | src/openvpn/basic.h | |
370 | src/openvpn/block_dns.h | |
371 | src/openvpn/block_dns.c | |
372 | src/openvpn/buffer.c | |
373 | src/openvpn/buffer.h | |
374 | src/openvpn/circ_list.h | |
375 | src/openvpn/clinat.c | |
376 | src/openvpn/clinat.h | |
377 | src/openvpn/common.h | |
378 | src/openvpn/comp-lz4.c | |
379 | src/openvpn/comp-lz4.h | |
380 | src/openvpn/comp.c | |
381 | src/openvpn/comp.h | |
382 | src/openvpn/compstub.c | |
383 | src/openvpn/console.c | |
384 | src/openvpn/console_builtin.c | |
385 | src/openvpn/console.h | |
386 | src/openvpn/crypto.c | |
387 | src/openvpn/crypto.h | |
388 | src/openvpn/crypto_backend.h | |
389 | src/openvpn/crypto_openssl.c | |
390 | src/openvpn/crypto_openssl.h | |
391 | src/openvpn/crypto_mbedtls.c | |
392 | src/openvpn/crypto_mbedtls.h | |
393 | src/openvpn/cryptoapi.c | |
394 | src/openvpn/cryptoapi.h | |
395 | src/openvpn/dco.c | |
396 | src/openvpn/dco.h | |
397 | src/openvpn/dco_win.c | |
398 | src/openvpn/dco_win.h | |
399 | src/openvpn/dco_linux.c | |
400 | src/openvpn/dco_linux.h | |
401 | src/openvpn/dco_freebsd.c | |
402 | src/openvpn/dco_freebsd.h | |
403 | src/openvpn/dhcp.c | |
404 | src/openvpn/dhcp.h | |
405 | src/openvpn/dns.c | |
406 | src/openvpn/dns.h | |
407 | src/openvpn/errlevel.h | |
408 | src/openvpn/env_set.c | |
409 | src/openvpn/env_set.h | |
410 | src/openvpn/error.c | |
411 | src/openvpn/error.h | |
412 | src/openvpn/event.c | |
413 | src/openvpn/event.h | |
414 | src/openvpn/fdmisc.c | |
415 | src/openvpn/fdmisc.h | |
416 | src/openvpn/forward.c | |
417 | src/openvpn/forward.h | |
418 | src/openvpn/fragment.c | |
419 | src/openvpn/fragment.h | |
420 | src/openvpn/gremlin.c | |
421 | src/openvpn/gremlin.h | |
422 | src/openvpn/helper.c | |
423 | src/openvpn/helper.h | |
424 | src/openvpn/httpdigest.c | |
425 | src/openvpn/httpdigest.h | |
426 | src/openvpn/init.c | |
427 | src/openvpn/init.h | |
428 | src/openvpn/integer.h | |
429 | src/openvpn/interval.c | |
430 | src/openvpn/interval.h | |
431 | src/openvpn/list.c | |
432 | src/openvpn/list.h | |
433 | src/openvpn/lladdr.c | |
434 | src/openvpn/lladdr.h | |
435 | src/openvpn/lzo.c | |
436 | src/openvpn/lzo.h | |
437 | src/openvpn/manage.c | |
438 | src/openvpn/manage.h | |
439 | src/openvpn/mbuf.c | |
440 | src/openvpn/mbuf.h | |
441 | src/openvpn/memdbg.h | |
442 | src/openvpn/misc.c | |
443 | src/openvpn/misc.h | |
444 | src/openvpn/mroute.c | |
445 | src/openvpn/mroute.h | |
446 | src/openvpn/mss.c | |
447 | src/openvpn/mss.h | |
448 | src/openvpn/mstats.c | |
449 | src/openvpn/mstats.h | |
450 | src/openvpn/mtcp.c | |
451 | src/openvpn/mtcp.h | |
452 | src/openvpn/mtu.c | |
453 | src/openvpn/mtu.h | |
454 | src/openvpn/mudp.c | |
455 | src/openvpn/mudp.h | |
456 | src/openvpn/multi.c | |
457 | src/openvpn/multi.h | |
458 | src/openvpn/ntlm.c | |
459 | src/openvpn/ntlm.h | |
460 | src/openvpn/occ.c | |
461 | src/openvpn/occ.h | |
462 | src/openvpn/openvpn.c | |
463 | src/openvpn/openvpn.h | |
464 | src/openvpn/openvpn_win32_resources.rc | |
465 | src/openvpn/options.c | |
466 | src/openvpn/options.h | |
467 | src/openvpn/options_util.c | |
468 | src/openvpn/options_util.h | |
469 | src/openvpn/otime.c | |
470 | src/openvpn/otime.h | |
471 | src/openvpn/ovpn_dco_win.h | |
472 | src/openvpn/packet_id.c | |
473 | src/openvpn/packet_id.h | |
474 | src/openvpn/perf.c | |
475 | src/openvpn/perf.h | |
476 | src/openvpn/ping.c | |
477 | src/openvpn/ping.h | |
478 | src/openvpn/pkcs11.c | |
479 | src/openvpn/pkcs11.h | |
480 | src/openvpn/pkcs11_backend.h | |
481 | src/openvpn/pkcs11_openssl.c | |
482 | src/openvpn/pkcs11_mbedtls.c | |
483 | src/openvpn/platform.c | |
484 | src/openvpn/platform.h | |
485 | src/openvpn/plugin.c | |
486 | src/openvpn/plugin.h | |
487 | src/openvpn/pool.c | |
488 | src/openvpn/pool.h | |
489 | src/openvpn/proto.c | |
490 | src/openvpn/proto.h | |
491 | src/openvpn/proxy.c | |
492 | src/openvpn/proxy.h | |
493 | src/openvpn/ps.c | |
494 | src/openvpn/ps.h | |
495 | src/openvpn/push.c | |
496 | src/openvpn/push.h | |
497 | src/openvpn/pushlist.h | |
498 | src/openvpn/reflect_filter.c | |
499 | src/openvpn/reflect_filter.h | |
500 | src/openvpn/reliable.c | |
501 | src/openvpn/reliable.h | |
502 | src/openvpn/route.c | |
503 | src/openvpn/route.h | |
504 | src/openvpn/run_command.c | |
505 | src/openvpn/run_command.h | |
506 | src/openvpn/schedule.c | |
507 | src/openvpn/schedule.h | |
508 | src/openvpn/session_id.c | |
509 | src/openvpn/session_id.h | |
510 | src/openvpn/shaper.c | |
511 | src/openvpn/shaper.h | |
512 | src/openvpn/sig.c | |
513 | src/openvpn/sig.h | |
514 | src/openvpn/socket.c | |
515 | src/openvpn/socket.h | |
516 | src/openvpn/socks.c | |
517 | src/openvpn/socks.h | |
518 | src/openvpn/ssl.c | |
519 | src/openvpn/ssl.h | |
520 | src/openvpn/ssl_backend.h | |
521 | src/openvpn/ssl_common.h | |
522 | src/openvpn/ssl_openssl.c | |
523 | src/openvpn/ssl_openssl.h | |
524 | src/openvpn/ssl_mbedtls.c | |
525 | src/openvpn/ssl_mbedtls.h | |
526 | src/openvpn/ssl_verify.c | |
527 | src/openvpn/ssl_verify.h | |
528 | src/openvpn/ssl_verify_backend.h | |
529 | src/openvpn/ssl_verify_openssl.c | |
530 | src/openvpn/ssl_verify_openssl.h | |
531 | src/openvpn/ssl_verify_mbedtls.c | |
532 | src/openvpn/ssl_verify_mbedtls.h | |
533 | src/openvpn/status.c | |
534 | src/openvpn/status.h | |
535 | src/openvpn/syshead.h | |
536 | src/openvpn/tls_crypt.c | |
537 | src/openvpn/tun.c | |
538 | src/openvpn/tun.h | |
539 | src/openvpn/networking_sitnl.c | |
540 | src/openvpn/networking_freebsd.c | |
541 | src/openvpn/auth_token.c | |
542 | src/openvpn/auth_token.h | |
543 | src/openvpn/ssl_ncp.c | |
544 | src/openvpn/ssl_ncp.h | |
545 | src/openvpn/ssl_pkt.c | |
546 | src/openvpn/ssl_pkt.h | |
547 | src/openvpn/ssl_util.c | |
548 | src/openvpn/ssl_util.h | |
549 | src/openvpn/vlan.c | |
550 | src/openvpn/vlan.h | |
551 | src/openvpn/win32.c | |
552 | src/openvpn/win32-util.c | |
553 | src/openvpn/win32.h | |
554 | src/openvpn/win32-util.h | |
555 | src/openvpn/xkey_helper.c | |
556 | src/openvpn/xkey_provider.c | |
557 | ) | |
01341840 AS |
558 | |
559 | add_executable(openvpn ${SOURCE_FILES}) | |
560 | ||
561 | add_library_deps(openvpn) | |
562 | ||
0ce06893 | 563 | if(MINGW) |
e8881ec6 | 564 | target_compile_options(openvpn PRIVATE -municode -UUNICODE) |
01341840 | 565 | target_link_options(openvpn PRIVATE -municode) |
e8881ec6 FL |
566 | endif() |
567 | ||
568 | if (MSVC) | |
569 | # we have our own manifest | |
570 | target_link_options(openvpn PRIVATE /MANIFEST:NO) | |
571 | endif() | |
572 | ||
573 | if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux") | |
574 | target_link_libraries(openvpn PUBLIC -ldl) | |
01341840 AS |
575 | endif () |
576 | ||
577 | if (NOT WIN32) | |
e8881ec6 FL |
578 | target_compile_options(openvpn PRIVATE -DPLUGIN_LIBDIR=\"${PLUGIN_DIR}\") |
579 | ||
01341840 AS |
580 | find_library(resolv resolv) |
581 | # some platform like BSDs already include resolver functionality in the libc and not have an extra resolv library | |
582 | if (${resolv} OR APPLE) | |
583 | target_link_libraries(openvpn PUBLIC -lresolv) | |
584 | endif () | |
585 | endif () | |
586 | ||
587 | ||
e8881ec6 FL |
588 | if (BUILD_TESTING) |
589 | find_package(cmocka CONFIG) | |
590 | if (TARGET cmocka::cmocka) | |
591 | set(CMOCKA_LIBRARIES cmocka::cmocka) | |
592 | else () | |
593 | pkg_search_module(cmocka cmocka REQUIRED IMPORTED_TARGET) | |
594 | set(CMOCKA_LIBRARIES PkgConfig::cmocka) | |
595 | endif () | |
01341840 | 596 | |
e8881ec6 FL |
597 | set(unit_tests |
598 | "test_auth_token" | |
599 | "test_buffer" | |
600 | "test_crypto" | |
601 | "test_misc" | |
602 | "test_ncp" | |
603 | "test_packet_id" | |
604 | "test_pkt" | |
605 | "test_provider" | |
cedbac71 | 606 | "test_ssl" |
b9696ff3 | 607 | "test_user_pass" |
e8881ec6 | 608 | ) |
01341840 | 609 | |
e8881ec6 FL |
610 | if (WIN32) |
611 | list(APPEND unit_tests | |
612 | "test_cryptoapi" | |
613 | ) | |
614 | endif () | |
615 | ||
4ef76f0e AS |
616 | # MSVC and Apple's LLVM ld do not support --wrap |
617 | # This test requires cmake >= 3.18, so check if check_linker_flag is | |
618 | # available | |
619 | if (COMMAND check_linker_flag) | |
620 | check_linker_flag(C -Wl,--wrap=parse_line LD_SUPPORTS_WRAP) | |
621 | endif() | |
622 | ||
623 | if (${LD_SUPPORTS_WRAP}) | |
e8881ec6 FL |
624 | list(APPEND unit_tests |
625 | "test_argv" | |
4ef76f0e | 626 | "test_tls_crypt" |
e8881ec6 FL |
627 | ) |
628 | endif () | |
629 | ||
4ef76f0e | 630 | # These tests work on only on Linux since they depend on special Linux features |
e8881ec6 FL |
631 | if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux") |
632 | list(APPEND unit_tests | |
633 | "test_networking" | |
e8881ec6 FL |
634 | ) |
635 | endif () | |
636 | ||
637 | if (NOT WIN32 AND ${ENABLE_PKCS11}) | |
638 | set(_HAVE_SOFTHSM2 YES) | |
639 | find_program(P11TOOL p11tool) | |
640 | find_program(SOFTHSM2_UTIL softhsm2-util) | |
641 | find_library(SOFTHSM2_MODULE softhsm2 PATH_SUFFIXES softhsm) | |
642 | ||
643 | if (P11TOOL STREQUAL "P11TOOL-NOTFOUND") | |
644 | message(STATUS "p11tool not found, pkcs11 UT disabled") | |
645 | set(_HAVE_SOFTHSM2 NO) | |
646 | elseif (SOFTHSM2_UTIL STREQUAL "SOFTHSM2_UTIL-NOTFOUND") | |
647 | message(STATUS "softhsm2-util not found, pkcs11 UT disabled") | |
648 | set(_HAVE_SOFTHSM2 NO) | |
649 | elseif (SOFTHSM2_MODULE STREQUAL "SOFTHSM2_MODULE-NOTFOUND") | |
650 | message(STATUS "softhsm2 module not found, pkcs11 UT disabled") | |
651 | set(_HAVE_SOFTHSM2 NO) | |
652 | endif () | |
01341840 | 653 | |
e8881ec6 FL |
654 | if (_HAVE_SOFTHSM2) |
655 | message(VERBOSE "pkcs11 UT enabled") | |
656 | list(APPEND unit_tests | |
657 | "test_pkcs11" | |
658 | ) | |
659 | endif () | |
660 | endif () | |
01341840 | 661 | |
e8881ec6 FL |
662 | foreach (test_name ${unit_tests}) |
663 | # test_networking needs special environment | |
664 | if (NOT ${test_name} STREQUAL "test_networking") | |
665 | add_test(${test_name} ${test_name}) | |
b9696ff3 FL |
666 | # for compat with autotools make check |
667 | set(_UT_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/tests/unit_tests/openvpn) | |
668 | set_tests_properties(${test_name} PROPERTIES | |
669 | ENVIRONMENT "srcdir=${_UT_SOURCE_DIR}") | |
e8881ec6 FL |
670 | endif () |
671 | add_executable(${test_name} | |
01341840 AS |
672 | tests/unit_tests/openvpn/${test_name}.c |
673 | tests/unit_tests/openvpn/mock_msg.c | |
e8881ec6 | 674 | tests/unit_tests/openvpn/mock_msg.h |
01341840 | 675 | src/openvpn/platform.c |
01341840 | 676 | src/openvpn/win32-util.c |
01341840 | 677 | src/compat/compat-gettimeofday.c |
01341840 AS |
678 | ) |
679 | ||
e8881ec6 FL |
680 | add_library_deps(${test_name}) |
681 | target_link_libraries(${test_name} PUBLIC ${CMOCKA_LIBRARIES}) | |
01341840 | 682 | |
e8881ec6 | 683 | target_include_directories(${test_name} PRIVATE src/openvpn) |
01341840 | 684 | |
bb0849db AS |
685 | # for compat with IDEs like Clion that ignore the tests properties |
686 | # for the environment variable srcdir when running tests as fallback | |
687 | target_compile_definitions(${test_name} PRIVATE "-DUNIT_TEST_SOURCEDIR=\"${CMAKE_SOURCE_DIR}/tests/unit_tests/openvpn\"") | |
688 | ||
e8881ec6 FL |
689 | if (NOT ${test_name} STREQUAL "test_buffer") |
690 | target_sources(${test_name} PRIVATE | |
01341840 AS |
691 | src/openvpn/buffer.c |
692 | ) | |
e8881ec6 FL |
693 | endif () |
694 | ||
695 | endforeach() | |
01341840 | 696 | |
e8881ec6 FL |
697 | target_sources(test_auth_token PRIVATE |
698 | src/openvpn/base64.c | |
699 | src/openvpn/crypto_mbedtls.c | |
700 | src/openvpn/crypto_openssl.c | |
701 | src/openvpn/crypto.c | |
702 | src/openvpn/otime.c | |
703 | src/openvpn/packet_id.c | |
704 | ) | |
705 | ||
706 | target_sources(test_buffer PRIVATE | |
707 | tests/unit_tests/openvpn/mock_get_random.c | |
708 | ) | |
709 | ||
710 | target_sources(test_crypto PRIVATE | |
711 | src/openvpn/crypto_mbedtls.c | |
712 | src/openvpn/crypto_openssl.c | |
713 | src/openvpn/crypto.c | |
714 | src/openvpn/otime.c | |
715 | src/openvpn/packet_id.c | |
716 | src/openvpn/mtu.c | |
717 | src/openvpn/mss.c | |
718 | ) | |
719 | ||
cedbac71 AS |
720 | target_sources(test_ssl PRIVATE |
721 | tests/unit_tests/openvpn/mock_management.c | |
722 | tests/unit_tests/openvpn/mock_ssl_dependencies.c | |
723 | tests/unit_tests/openvpn/mock_win32_execve.c | |
724 | src/openvpn/argv.c | |
725 | src/openvpn/base64.c | |
726 | src/openvpn/crypto.c | |
727 | src/openvpn/crypto_mbedtls.c | |
728 | src/openvpn/crypto_openssl.c | |
729 | src/openvpn/cryptoapi.c | |
730 | src/openvpn/env_set.c | |
731 | src/openvpn/mss.c | |
732 | src/openvpn/mtu.c | |
733 | src/openvpn/options_util.c | |
734 | src/openvpn/otime.c | |
735 | src/openvpn/packet_id.c | |
736 | src/openvpn/run_command.c | |
737 | src/openvpn/ssl_mbedtls.c | |
738 | src/openvpn/ssl_openssl.c | |
739 | src/openvpn/ssl_util.c | |
740 | src/openvpn/ssl_verify_mbedtls.c | |
741 | src/openvpn/ssl_verify_openssl.c | |
742 | src/openvpn/xkey_helper.c | |
743 | src/openvpn/xkey_provider.c | |
744 | ) | |
745 | ||
e8881ec6 FL |
746 | target_sources(test_misc PRIVATE |
747 | tests/unit_tests/openvpn/mock_get_random.c | |
748 | src/openvpn/options_util.c | |
749 | src/openvpn/ssl_util.c | |
91b057a2 | 750 | src/openvpn/list.c |
e8881ec6 FL |
751 | ) |
752 | ||
753 | target_sources(test_ncp PRIVATE | |
754 | src/openvpn/crypto_mbedtls.c | |
755 | src/openvpn/crypto_openssl.c | |
756 | src/openvpn/crypto.c | |
757 | src/openvpn/otime.c | |
758 | src/openvpn/packet_id.c | |
759 | src/openvpn/ssl_util.c | |
760 | src/compat/compat-strsep.c | |
761 | ) | |
762 | ||
763 | target_sources(test_packet_id PRIVATE | |
764 | tests/unit_tests/openvpn/mock_get_random.c | |
765 | src/openvpn/otime.c | |
766 | src/openvpn/packet_id.c | |
767 | src/openvpn/reliable.c | |
768 | src/openvpn/session_id.c | |
769 | ) | |
770 | ||
771 | target_sources(test_pkt PRIVATE | |
ede590e5 | 772 | tests/unit_tests/openvpn/mock_win32_execve.c |
01341840 | 773 | src/openvpn/argv.c |
e8881ec6 FL |
774 | src/openvpn/base64.c |
775 | src/openvpn/crypto_mbedtls.c | |
776 | src/openvpn/crypto_openssl.c | |
777 | src/openvpn/crypto.c | |
01341840 | 778 | src/openvpn/env_set.c |
e8881ec6 FL |
779 | src/openvpn/otime.c |
780 | src/openvpn/packet_id.c | |
01341840 AS |
781 | src/openvpn/reliable.c |
782 | src/openvpn/run_command.c | |
783 | src/openvpn/session_id.c | |
784 | src/openvpn/ssl_pkt.c | |
785 | src/openvpn/tls_crypt.c | |
786 | ) | |
787 | ||
e8881ec6 FL |
788 | target_sources(test_provider PRIVATE |
789 | tests/unit_tests/openvpn/mock_get_random.c | |
01341840 AS |
790 | src/openvpn/xkey_provider.c |
791 | src/openvpn/xkey_helper.c | |
e8881ec6 | 792 | src/openvpn/base64.c |
01341840 AS |
793 | ) |
794 | ||
b9696ff3 FL |
795 | target_sources(test_user_pass PRIVATE |
796 | tests/unit_tests/openvpn/mock_get_random.c | |
797 | tests/unit_tests/openvpn/mock_win32_execve.c | |
798 | src/openvpn/base64.c | |
799 | src/openvpn/console.c | |
800 | src/openvpn/env_set.c | |
801 | src/openvpn/run_command.c | |
802 | ) | |
803 | ||
e8881ec6 FL |
804 | if (TARGET test_argv) |
805 | target_link_options(test_argv PRIVATE -Wl,--wrap=parse_line) | |
806 | target_sources(test_argv PRIVATE | |
807 | tests/unit_tests/openvpn/mock_get_random.c | |
01341840 | 808 | src/openvpn/argv.c |
e8881ec6 FL |
809 | ) |
810 | endif () | |
01341840 | 811 | |
e8881ec6 FL |
812 | if (TARGET test_cryptoapi) |
813 | target_sources(test_cryptoapi PRIVATE | |
814 | tests/unit_tests/openvpn/mock_get_random.c | |
815 | tests/unit_tests/openvpn/cert_data.h | |
816 | tests/unit_tests/openvpn/pkey_test_utils.c | |
817 | src/openvpn/xkey_provider.c | |
818 | src/openvpn/xkey_helper.c | |
819 | src/openvpn/base64.c | |
820 | ) | |
821 | endif () | |
01341840 | 822 | |
e8881ec6 FL |
823 | if (TARGET test_networking) |
824 | target_link_options(test_networking PRIVATE -Wl,--wrap=parse_line) | |
825 | target_compile_options(test_networking PRIVATE -UNDEBUG) | |
826 | target_sources(test_networking PRIVATE | |
827 | src/openvpn/networking_sitnl.c | |
828 | src/openvpn/crypto_mbedtls.c | |
829 | src/openvpn/crypto_openssl.c | |
830 | src/openvpn/crypto.c | |
831 | src/openvpn/otime.c | |
832 | src/openvpn/packet_id.c | |
833 | ) | |
01341840 | 834 | endif () |
01341840 | 835 | |
e8881ec6 FL |
836 | if (TARGET test_tls_crypt) |
837 | target_link_options(test_tls_crypt PRIVATE -Wl,--wrap=parse_line) | |
838 | target_link_options(test_tls_crypt PRIVATE | |
01341840 AS |
839 | -Wl,--wrap=buffer_read_from_file |
840 | -Wl,--wrap=buffer_write_file | |
841 | -Wl,--wrap=rand_bytes) | |
e8881ec6 | 842 | target_sources(test_tls_crypt PRIVATE |
ede590e5 | 843 | tests/unit_tests/openvpn/mock_win32_execve.c |
e8881ec6 FL |
844 | src/openvpn/argv.c |
845 | src/openvpn/base64.c | |
846 | src/openvpn/crypto_mbedtls.c | |
847 | src/openvpn/crypto_openssl.c | |
848 | src/openvpn/crypto.c | |
849 | src/openvpn/env_set.c | |
850 | src/openvpn/otime.c | |
851 | src/openvpn/packet_id.c | |
852 | src/openvpn/run_command.c | |
853 | ) | |
854 | endif () | |
855 | ||
856 | if (TARGET test_pkcs11) | |
857 | target_compile_options(test_pkcs11 PRIVATE | |
858 | -DP11TOOL_PATH=\"${P11TOOL}\" | |
859 | -DSOFTHSM2_MODULE_PATH=\"${SOFTHSM2_MODULE}\" | |
860 | -DSOFTHSM2_UTIL_PATH=\"${SOFTHSM2_UTIL}\" | |
861 | ) | |
862 | target_sources(test_pkcs11 PRIVATE | |
863 | tests/unit_tests/openvpn/mock_get_random.c | |
864 | tests/unit_tests/openvpn/pkey_test_utils.c | |
865 | src/openvpn/argv.c | |
866 | src/openvpn/base64.c | |
867 | src/openvpn/env_set.c | |
868 | src/openvpn/otime.c | |
869 | src/openvpn/pkcs11.c | |
870 | src/openvpn/pkcs11_openssl.c | |
871 | src/openvpn/run_command.c | |
872 | src/openvpn/xkey_helper.c | |
873 | src/openvpn/xkey_provider.c | |
874 | ) | |
875 | endif () | |
876 | ||
877 | endif (BUILD_TESTING) |