1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
|
cmake_minimum_required(VERSION 3.13...3.28)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CORE_DIR ${CMAKE_CURRENT_LIST_DIR}/..)
set(DEP_DIR ${CORE_DIR}/../deps CACHE PATH "Dependencies")
option(USE_MBEDTLS "Use mbed TLS instead of OpenSSL")
option(USE_WERROR "Treat compiler warnings as errors (-Werror)")
option(USE_WCONVERSION "Enable -Wconversion")
if (DEFINED ENV{DEP_DIR})
message("Overriding DEP_DIR setting with environment variable $ENV{DEP_DIR}")
set(DEP_DIR $ENV{DEP_DIR})
endif ()
# Include our DEP_DIR in path used to find libraries
if (APPLE)
set(OPENVPN_PLAT osx)
elseif (WIN32)
set(OPENVPN_PLAT amd64)
else ()
set(OPENVPN_PLAT linux)
endif ()
function(add_ssl_library target)
if (${USE_MBEDTLS})
find_package(mbedTLS REQUIRED)
set(SSL_LIBRARY mbedTLS::mbedTLS)
target_compile_definitions(${target} PRIVATE -DUSE_MBEDTLS)
else ()
find_package(OpenSSL REQUIRED)
SET(SSL_LIBRARY OpenSSL::SSL)
target_compile_definitions(${target} PRIVATE -DUSE_OPENSSL)
endif ()
target_link_libraries(${target} ${SSL_LIBRARY})
endfunction()
function(add_core_dependencies target)
set(PLAT ${OPENVPN_PLAT})
target_include_directories(${target} PRIVATE ${CORE_DIR})
target_compile_definitions(${target} PRIVATE
-DASIO_STANDALONE
-DUSE_ASIO
-DHAVE_LZ4
#-DMBEDTLS_DEPRECATED_REMOVED # with mbed TLS 3.0 we currently still need the deprecated APIs
)
if (WIN32)
target_compile_definitions(${target} PRIVATE
-D_WIN32_WINNT=0x0600
-DTAP_WIN_COMPONENT_ID=tap0901
-D_CRT_SECURE_NO_WARNINGS
-DASIO_DISABLE_LOCAL_SOCKETS
)
set(EXTRA_LIBS fwpuclnt.lib iphlpapi.lib wininet.lib setupapi.lib rpcrt4.lib wtsapi32.lib)
if ("${CMAKE_GENERATOR_PLATFORM}" STREQUAL "ARM64")
# by some reasons CMake doesn't add those for ARM64
list(APPEND EXTRA_LIBS advapi32.lib Ole32.lib Shell32.lib)
endif ()
if (MSVC)
target_compile_options(${target} PRIVATE "/bigobj")
else ()
find_package(Threads REQUIRED)
target_compile_options(${target} PRIVATE "-Wa,-mbig-obj")
list(APPEND EXTRA_LIBS ws2_32 wsock32 ${CMAKE_THREAD_LIBS_INIT})
list(APPEND CMAKE_PREFIX_PATH
${DEP_DIR}/asio/asio
${DEP_DIR}
)
endif ()
else ()
list(APPEND CMAKE_PREFIX_PATH
${DEP_DIR}/asio/asio
${DEP_DIR}/lz4/lz4-${PLAT}
${DEP_DIR}/mbedtls/mbedtls-${PLAT}
)
list(APPEND CMAKE_LIBRARY_PATH
${DEP_DIR}/mbedtls/mbedtls-${PLAT}/library
)
endif ()
# asio should go first since some of our code requires
# a patched version. So we want to prefer its include
# directories.
find_package(asio REQUIRED)
target_link_libraries(${target} asio::asio)
find_package(lz4 REQUIRED)
target_link_libraries(${target} lz4::lz4)
add_ssl_library(${target})
if (APPLE)
find_library(coreFoundation CoreFoundation)
find_library(iokit IOKit)
find_library(coreServices CoreServices)
find_library(systemConfiguration SystemConfiguration)
target_link_libraries(${target} ${coreFoundation} ${iokit} ${coreServices} ${systemConfiguration} ${lz4})
endif()
if(UNIX)
target_link_libraries(${target} pthread)
endif()
target_link_libraries(${target} ${EXTRA_LIBS})
if (USE_WERROR)
if (MSVC)
target_compile_options(${target} PRIVATE /WX)
else ()
target_compile_options(${target} PRIVATE -Werror)
endif ()
endif ()
if (MSVC)
# C4200: nonstandard extension used : zero-sized array in struct/union
# C4146: unary minus operator applied to unsigned type, result still unsigned
target_compile_options(${target} PRIVATE /W3 /wd4200 /wd4146)
else()
target_compile_options(${target} PRIVATE -Wall -Wsign-compare)
if (USE_WCONVERSION)
target_compile_options(${target} PRIVATE -Wconversion -Wno-sign-conversion)
endif()
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
# disable noisy warnings
target_compile_options(${target} PRIVATE -Wno-maybe-uninitialized)
endif()
if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
# display all warnings
target_compile_options(${target} PRIVATE -ferror-limit=0 -Wno-enum-enum-conversion)
endif()
endif()
endfunction()
function (add_json_library target)
find_package(jsoncpp CONFIG)
if (jsoncpp_FOUND AND TARGET JsonCpp::JsonCpp)
target_link_libraries(${target} JsonCpp::JsonCpp)
target_compile_definitions(${target} PRIVATE -DHAVE_JSONCPP)
else()
find_package(PkgConfig REQUIRED)
if (MINGW)
# due to cmake bug, APPEND doesn't work for mingw
# https://github.com/Kitware/CMake/commit/f92a4b23994fa7516f16fbb5b3c02caa07534b3f
set(CMAKE_PREFIX_PATH ${DEP_DIR})
endif ()
pkg_check_modules(JSONCPP REQUIRED IMPORTED_TARGET jsoncpp)
target_link_libraries(${target} PkgConfig::JSONCPP)
target_compile_definitions(${target} PRIVATE -DHAVE_JSONCPP)
endif ()
endfunction ()
|