]> git.ipfire.org Git - thirdparty/openvpn.git/blob - CMakeLists.txt
gerrit-send-mail: Make output consistent across systems
[thirdparty/openvpn.git] / CMakeLists.txt
1 cmake_minimum_required(VERSION 3.14)
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 set(MBED_INCLUDE_PATH "" CACHE STRING "Path to mbed TLS include directory")
36 set(MBED_LIBRARY_PATH "" CACHE STRING "Path to mbed library directory")
37 option(WOLFSSL "BUILD with wolfSSL" OFF)
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")
44
45 # Create machine readable compile commands
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 ()
57
58 # AddressSanitize - use CXX=clang++ CC=clang cmake -DCMAKE_BUILD_TYPE=asan to build with ASAN
59 set(CMAKE_C_FLAGS_ASAN
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)
63 set(CMAKE_CXX_FLAGS_ASAN
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)
67
68 if (MSVC)
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(
87 /Brepro
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()
96 else ()
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()
103 # We are not ready for this
104 #add_compile_options(-Wconversion -Wno-sign-conversion -Wsign-compare)
105 if (USE_WERROR)
106 add_compile_options(-Werror)
107 endif ()
108 endif ()
109
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)
116
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})
121
122 set(CMAKE_C_STANDARD 99)
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)
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)
143 elseif (WIN32)
144 set(ENABLE_DCO YES)
145 elseif (APPLE)
146 set(TARGET_DARWIN YES)
147 set(HAVE_NET_IF_UTUN_H YES)
148 else()
149 message(FATAL_ERROR "Unknown system name: \"${CMAKE_SYSTEM_NAME}\"")
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
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)
168 check_symbol_exists(nice unistd.h HAVE_NICE)
169 check_symbol_exists(setgid unistd.h HAVE_SETGID)
170 check_symbol_exists(setuid unistd.h HAVE_SETUID)
171 check_symbol_exists(setsid unistd.h HAVE_SETSID)
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)
179 check_symbol_exists(daemon "unistd.h;stdlib.h" HAVE_DAEMON)
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)
192 check_symbol_exists(getrlimit "sys/time.h;sys/resource.h" HAVE_GETRLIMIT)
193
194 # Some OS (e.g. FreeBSD) need some basic headers to allow
195 # including network headers
196 set(NETEXTRA sys/types.h)
197 check_include_files("${NETEXTRA};netinet/in.h" HAVE_NETINET_IN_H)
198
199 if (HAVE_NETINET_IN_H)
200 list(APPEND NETEXTRA netinet/in.h)
201 endif ()
202
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)
240
241 find_program(IFCONFIG_PATH ifconfig)
242 find_program(IPROUTE_PATH ip)
243 find_program(ROUTE_PATH route)
244
245 if (${ENABLE_LZ4})
246 pkg_search_module(liblz4 liblz4 REQUIRED IMPORTED_TARGET)
247 endif ()
248
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)
255 endif ()
256
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
274 function(add_library_deps target)
275 if (${MBED})
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)
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)
288 else ()
289 set(ENABLE_X509ALTUSERNAME YES)
290
291 find_package(OpenSSL REQUIRED)
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 ()
298
299 endif ()
300
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
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 )
314
315 if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
316 pkg_search_module(libcapng REQUIRED libcap-ng IMPORTED_TARGET)
317 pkg_search_module(libnl REQUIRED libnl-genl-3.0 IMPORTED_TARGET)
318
319 target_link_libraries(${target} PUBLIC PkgConfig::libcapng PkgConfig::libnl)
320 endif ()
321
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
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)
342
343 configure_file(config.h.cmake.in config.h)
344 configure_file(include/openvpn-plugin.h.in openvpn-plugin.h)
345 # TODO we should remove the need for this, and always include config.h
346 add_definitions(-DHAVE_CONFIG_H)
347
348 include_directories(${CMAKE_CURRENT_BINARY_DIR})
349
350 add_subdirectory(doc)
351 add_subdirectory(src/openvpnmsica)
352 add_subdirectory(src/openvpnserv)
353 add_subdirectory(src/tapctl)
354
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
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 )
558
559 add_executable(openvpn ${SOURCE_FILES})
560
561 add_library_deps(openvpn)
562
563 if(MINGW)
564 target_compile_options(openvpn PRIVATE -municode -UUNICODE)
565 target_link_options(openvpn PRIVATE -municode)
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)
575 endif ()
576
577 if (NOT WIN32)
578 target_compile_options(openvpn PRIVATE -DPLUGIN_LIBDIR=\"${PLUGIN_DIR}\")
579
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
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 ()
596
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"
606 "test_ssl"
607 "test_user_pass"
608 )
609
610 if (WIN32)
611 list(APPEND unit_tests
612 "test_cryptoapi"
613 )
614 endif ()
615
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})
624 list(APPEND unit_tests
625 "test_argv"
626 "test_tls_crypt"
627 )
628 endif ()
629
630 # These tests work on only on Linux since they depend on special Linux features
631 if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
632 list(APPEND unit_tests
633 "test_networking"
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 ()
653
654 if (_HAVE_SOFTHSM2)
655 message(VERBOSE "pkcs11 UT enabled")
656 list(APPEND unit_tests
657 "test_pkcs11"
658 )
659 endif ()
660 endif ()
661
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})
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}")
670 endif ()
671 add_executable(${test_name}
672 tests/unit_tests/openvpn/${test_name}.c
673 tests/unit_tests/openvpn/mock_msg.c
674 tests/unit_tests/openvpn/mock_msg.h
675 src/openvpn/platform.c
676 src/openvpn/win32-util.c
677 src/compat/compat-gettimeofday.c
678 )
679
680 add_library_deps(${test_name})
681 target_link_libraries(${test_name} PUBLIC ${CMOCKA_LIBRARIES})
682
683 target_include_directories(${test_name} PRIVATE src/openvpn)
684
685 if (NOT ${test_name} STREQUAL "test_buffer")
686 target_sources(${test_name} PRIVATE
687 src/openvpn/buffer.c
688 )
689 endif ()
690
691 endforeach()
692
693 target_sources(test_auth_token PRIVATE
694 src/openvpn/base64.c
695 src/openvpn/crypto_mbedtls.c
696 src/openvpn/crypto_openssl.c
697 src/openvpn/crypto.c
698 src/openvpn/otime.c
699 src/openvpn/packet_id.c
700 )
701
702 target_sources(test_buffer PRIVATE
703 tests/unit_tests/openvpn/mock_get_random.c
704 )
705
706 target_sources(test_crypto PRIVATE
707 src/openvpn/crypto_mbedtls.c
708 src/openvpn/crypto_openssl.c
709 src/openvpn/crypto.c
710 src/openvpn/otime.c
711 src/openvpn/packet_id.c
712 src/openvpn/mtu.c
713 src/openvpn/mss.c
714 )
715
716 target_sources(test_ssl PRIVATE
717 tests/unit_tests/openvpn/mock_management.c
718 tests/unit_tests/openvpn/mock_ssl_dependencies.c
719 tests/unit_tests/openvpn/mock_win32_execve.c
720 src/openvpn/argv.c
721 src/openvpn/base64.c
722 src/openvpn/crypto.c
723 src/openvpn/crypto_mbedtls.c
724 src/openvpn/crypto_openssl.c
725 src/openvpn/cryptoapi.c
726 src/openvpn/env_set.c
727 src/openvpn/mss.c
728 src/openvpn/mtu.c
729 src/openvpn/options_util.c
730 src/openvpn/otime.c
731 src/openvpn/packet_id.c
732 src/openvpn/run_command.c
733 src/openvpn/ssl_mbedtls.c
734 src/openvpn/ssl_openssl.c
735 src/openvpn/ssl_util.c
736 src/openvpn/ssl_verify_mbedtls.c
737 src/openvpn/ssl_verify_openssl.c
738 src/openvpn/xkey_helper.c
739 src/openvpn/xkey_provider.c
740 )
741
742 target_sources(test_misc PRIVATE
743 tests/unit_tests/openvpn/mock_get_random.c
744 src/openvpn/options_util.c
745 src/openvpn/ssl_util.c
746 )
747
748 target_sources(test_ncp PRIVATE
749 src/openvpn/crypto_mbedtls.c
750 src/openvpn/crypto_openssl.c
751 src/openvpn/crypto.c
752 src/openvpn/otime.c
753 src/openvpn/packet_id.c
754 src/openvpn/ssl_util.c
755 src/compat/compat-strsep.c
756 )
757
758 target_sources(test_packet_id PRIVATE
759 tests/unit_tests/openvpn/mock_get_random.c
760 src/openvpn/otime.c
761 src/openvpn/packet_id.c
762 src/openvpn/reliable.c
763 src/openvpn/session_id.c
764 )
765
766 target_sources(test_pkt PRIVATE
767 tests/unit_tests/openvpn/mock_win32_execve.c
768 src/openvpn/argv.c
769 src/openvpn/base64.c
770 src/openvpn/crypto_mbedtls.c
771 src/openvpn/crypto_openssl.c
772 src/openvpn/crypto.c
773 src/openvpn/env_set.c
774 src/openvpn/otime.c
775 src/openvpn/packet_id.c
776 src/openvpn/reliable.c
777 src/openvpn/run_command.c
778 src/openvpn/session_id.c
779 src/openvpn/ssl_pkt.c
780 src/openvpn/tls_crypt.c
781 )
782
783 target_sources(test_provider PRIVATE
784 tests/unit_tests/openvpn/mock_get_random.c
785 src/openvpn/xkey_provider.c
786 src/openvpn/xkey_helper.c
787 src/openvpn/base64.c
788 )
789
790 target_sources(test_user_pass PRIVATE
791 tests/unit_tests/openvpn/mock_get_random.c
792 tests/unit_tests/openvpn/mock_win32_execve.c
793 src/openvpn/base64.c
794 src/openvpn/console.c
795 src/openvpn/env_set.c
796 src/openvpn/run_command.c
797 )
798
799 if (TARGET test_argv)
800 target_link_options(test_argv PRIVATE -Wl,--wrap=parse_line)
801 target_sources(test_argv PRIVATE
802 tests/unit_tests/openvpn/mock_get_random.c
803 src/openvpn/argv.c
804 )
805 endif ()
806
807 if (TARGET test_cryptoapi)
808 target_sources(test_cryptoapi PRIVATE
809 tests/unit_tests/openvpn/mock_get_random.c
810 tests/unit_tests/openvpn/cert_data.h
811 tests/unit_tests/openvpn/pkey_test_utils.c
812 src/openvpn/xkey_provider.c
813 src/openvpn/xkey_helper.c
814 src/openvpn/base64.c
815 )
816 endif ()
817
818 if (TARGET test_networking)
819 target_link_options(test_networking PRIVATE -Wl,--wrap=parse_line)
820 target_compile_options(test_networking PRIVATE -UNDEBUG)
821 target_sources(test_networking PRIVATE
822 src/openvpn/networking_sitnl.c
823 src/openvpn/crypto_mbedtls.c
824 src/openvpn/crypto_openssl.c
825 src/openvpn/crypto.c
826 src/openvpn/otime.c
827 src/openvpn/packet_id.c
828 )
829 endif ()
830
831 if (TARGET test_tls_crypt)
832 target_link_options(test_tls_crypt PRIVATE -Wl,--wrap=parse_line)
833 target_link_options(test_tls_crypt PRIVATE
834 -Wl,--wrap=buffer_read_from_file
835 -Wl,--wrap=buffer_write_file
836 -Wl,--wrap=rand_bytes)
837 target_sources(test_tls_crypt PRIVATE
838 tests/unit_tests/openvpn/mock_win32_execve.c
839 src/openvpn/argv.c
840 src/openvpn/base64.c
841 src/openvpn/crypto_mbedtls.c
842 src/openvpn/crypto_openssl.c
843 src/openvpn/crypto.c
844 src/openvpn/env_set.c
845 src/openvpn/otime.c
846 src/openvpn/packet_id.c
847 src/openvpn/run_command.c
848 )
849 endif ()
850
851 if (TARGET test_pkcs11)
852 target_compile_options(test_pkcs11 PRIVATE
853 -DP11TOOL_PATH=\"${P11TOOL}\"
854 -DSOFTHSM2_MODULE_PATH=\"${SOFTHSM2_MODULE}\"
855 -DSOFTHSM2_UTIL_PATH=\"${SOFTHSM2_UTIL}\"
856 )
857 target_sources(test_pkcs11 PRIVATE
858 tests/unit_tests/openvpn/mock_get_random.c
859 tests/unit_tests/openvpn/pkey_test_utils.c
860 src/openvpn/argv.c
861 src/openvpn/base64.c
862 src/openvpn/env_set.c
863 src/openvpn/otime.c
864 src/openvpn/pkcs11.c
865 src/openvpn/pkcs11_openssl.c
866 src/openvpn/run_command.c
867 src/openvpn/xkey_helper.c
868 src/openvpn/xkey_provider.c
869 )
870 endif ()
871
872 endif (BUILD_TESTING)