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