option(CLI_OVPN3 "Build ${PROJECT_NAME} with OpenVPN3 support" OFF) cmake_minimum_required(VERSION 3.10) if(NOT VCPKG_MANIFEST_DIR) set(VCPKG_MANIFEST_DIR ${CMAKE_SOURCE_DIR}/vcpkg_manifests/openssl_3) endif() project(openvpn-gui C) add_executable(${PROJECT_NAME} WIN32 access.c echo.c env_set.c localization.c main.c manage.c misc.c openvpn.c openvpn_config.c options.c passphrase.c proxy.c registry.c save_pass.c scripts.c service.c tray.c viewlog.c as.c pkcs11.c config_parser.c res/openvpn-gui-res.rc) find_package(OpenSSL REQUIRED) set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DDEBUG") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /guard:cf") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /guard:cf /DYNAMICBASE") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Qspectre") if(NOT (${CMAKE_C_COMPILER_ARCHITECTURE_ID} STREQUAL "ARM64")) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /CETCOMPAT") endif() target_link_libraries(${PROJECT_NAME} PRIVATE OpenSSL::SSL Wtsapi32.lib Netapi32.lib ws2_32.lib Winhttp.lib Secur32.lib Comctl32.lib Crypt32.lib Shlwapi.lib Advapi32.lib Shell32.lib Gdi32.lib Comdlg32.lib Ole32.lib Cryptui.lib Wininet.lib) target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_BINARY_DIR}) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /MANIFEST:NO") set(CMAKE_RC_FLAGS "/D \"HAVE_CONFIG_H\" /D \"_MSC_VER\"") function(get_version_from_configure regex_arg ret) file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/configure.ac" VERSION_STR REGEX ${regex_arg}) string(REGEX MATCH ${regex_arg} VERSION_STR "${VERSION_STR}") set("${ret}" ${CMAKE_MATCH_1} PARENT_SCOPE) endfunction() get_version_from_configure("_GUI_VERSION_MAJOR\\], \\[([0-9]+)\\]" GUI_VERSION_MAJOR) get_version_from_configure("_GUI_VERSION_MINOR\\], \\[([0-9]+)\\]" GUI_VERSION_MINOR) configure_file(config-msvc.h.in config.h) target_compile_definitions(${PROJECT_NAME} PRIVATE _UNICODE UNICODE WIN32_LEAN_AND_MEAN HAVE_CONFIG_H) if (${CLI_OVPN3}) find_package(json-c REQUIRED) target_link_libraries(${PROJECT_NAME} PRIVATE json-c::json-c) target_compile_definitions(${PROJECT_NAME} PRIVATE ENABLE_OVPN3) endif () if(MSVC) # work around msvc generator Debug/Release directory ugliness, doesn't apply for Ninja set_target_properties(${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/$<0:> LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/$<0:> ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/$<0:>) endif(MSVC)