From b9fa82b08bad7f122946a34f2d2b2fdbe1acd22f Mon Sep 17 00:00:00 2001 From: Joerg-Christian Boehme Date: Mon, 2 Sep 2019 11:48:01 +0200 Subject: [PATCH] CMake merge from devel to 1.10 to use embedded OpenSSL for Windows (#2767) * Add embedded openssl for windows * Add windows fix for OpenSSL #2708 * Fix CppUnit lib prefix with Poco --- CMakeLists.txt | 70 +++++++++++++++++------------- CppUnit/CMakeLists.txt | 20 ++++++--- Crypto/CMakeLists.txt | 10 +++-- NetSSL_OpenSSL/CMakeLists.txt | 6 ++- cmake/UseEmbeddedOpenSSL.cmake | 79 ++++++++++++++++++++++++++++++++++ 5 files changed, 145 insertions(+), 40 deletions(-) create mode 100644 cmake/UseEmbeddedOpenSSL.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 16bf8de7d..b4cc506d6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -69,6 +69,36 @@ endif() # Include some common macros to simpilfy the Poco CMake files include(PocoMacros) +option(POCO_STATIC + "Set to OFF|ON (default is OFF) to control build of POCO as STATIC library" OFF) +if(POCO_STATIC) + option(BUILD_SHARED_LIBS "Build shared libraries" OFF) +else() + option(BUILD_SHARED_LIBS "Build shared libraries" ON) +endif() + +if(MSVC) + option(POCO_MT + "Set to OFF|ON (default is OFF) to control build of POCO as /MT instead of /MD" OFF) + + option(ENABLE_MSVC_MP + "Set to OFF|ON (default is OFF) to control parallel build of POCO with MSVC" OFF) + + + # allow disabling of internally built OpenSSL# (see below for details) + # if POCO pre-built OpenSSL directory is found, and POCO_DISABLE_INTERNAL_OPENSSL=OFF, + # the internal OpenSSL build will be used + option(POCO_DISABLE_INTERNAL_OPENSSL "Disable internal OpensSSL binaries use" OFF) + + + if((NOT POCO_DISABLE_INTERNAL_OPENSSL) AND (ENABLE_NETSSL OR ENABLE_CRYPTO OR (ENABLE_DATA_MYSQL AND MINGW))) + include(UseEmbeddedOpenSSL) + endif() +endif() + +option(ENABLE_NETSSL_WIN "Enable NetSSL Windows" OFF) +option(FORCE_OPENSSL "Force usage of OpenSSL even under windows" OFF) + if(ENABLE_CRYPTO OR ENABLE_NETSSL OR ENABLE_JWT) find_package(OpenSSL REQUIRED) else() @@ -155,7 +185,7 @@ option(ENABLE_REDIS "Enable Redis" ON) option(ENABLE_PDF "Enable PDF" OFF) option(ENABLE_UTIL "Enable Util" ON) option(ENABLE_NET "Enable Net" ON) -option(ENABLE_NETSSL_WIN "Enable NetSSL Windows" OFF) + option(ENABLE_SEVENZIP "Enable SevenZip" OFF) option(ENABLE_ZIP "Enable Zip" ON) option(ENABLE_CPPPARSER "Enable C++ parser" OFF) @@ -163,31 +193,12 @@ option(ENABLE_POCODOC "Enable Poco Documentation Generator" OFF) option(ENABLE_PAGECOMPILER "Enable PageCompiler" ON) option(ENABLE_PAGECOMPILER_FILE2PAGE "Enable File2Page" ON) -option(FORCE_OPENSSL "Force usage of OpenSSL even under windows" OFF) - option(ENABLE_TESTS "Set to OFF|ON (default is OFF) to control build of POCO tests & samples" OFF) -option(POCO_STATIC - "Set to OFF|ON (default is OFF) to control build of POCO as STATIC library" OFF) -if(POCO_STATIC) - option(BUILD_SHARED_LIBS "Build shared libraries" OFF) -else() - option(BUILD_SHARED_LIBS "Build shared libraries" ON) -endif() - option(POCO_UNBUNDLED "Set to OFF|ON (default is OFF) to control linking dependencies as external" OFF) -if(MSVC) - option(POCO_MT - "Set to OFF|ON (default is OFF) to control build of POCO as /MT instead of /MD" OFF) - - option(ENABLE_MSVC_MP - "Set to OFF|ON (default is OFF) to control parallel build of POCO with MSVC" OFF) -endif() - - if(ENABLE_TESTS) option(ENABLE_LONG_RUNNING_TESTS "Enable long running test" ON) include(CTest) @@ -271,11 +282,6 @@ if(ENABLE_NET AND ENABLE_TESTS) set(ENABLE_UTIL ON CACHE BOOL "Enable Util" FORCE) endif() -if(ENABLE_JWT) - set(ENABLE_CRYPTO ON CACHE BOOL "Enable Crypto" FORCE) - set(ENABLE_JSON ON CACHE BOOL "Enable JSON" FORCE) -endif() - if(ENABLE_PDF) set(ENABLE_UTIL ON CACHE BOOL "Enable Util" FORCE) set(ENABLE_XML ON CACHE BOOL "Enable XML" FORCE) @@ -297,6 +303,11 @@ if(ENABLE_UTIL AND ENABLE_TESTS) set(ENABLE_XML ON CACHE BOOL "Enable XML" FORCE) endif() +if(ENABLE_JWT) + set(ENABLE_CRYPTO ON CACHE BOOL "Enable Crypto" FORCE) + set(ENABLE_JSON ON CACHE BOOL "Enable JSON" FORCE) +endif() + add_subdirectory(Foundation) if(ENABLE_ENCODINGS) add_subdirectory(Encodings) @@ -323,11 +334,6 @@ if(ENABLE_NET) list(APPEND Poco_COMPONENTS "Net") endif() -if(EXISTS ${PROJECT_SOURCE_DIR}/JWT AND ENABLE_JWT) - add_subdirectory(JWT) - list(APPEND Poco_COMPONENTS "JWT") -endif() - if(EXISTS ${PROJECT_SOURCE_DIR}/MongoDB AND ENABLE_MONGODB) add_subdirectory(MongoDB) list(APPEND Poco_COMPONENTS "MongoDB") @@ -343,6 +349,10 @@ if(EXISTS ${PROJECT_SOURCE_DIR}/PDF AND ENABLE_PDF) list(APPEND Poco_COMPONENTS "PDF") endif() +if(EXISTS ${PROJECT_SOURCE_DIR}/JWT AND ENABLE_JWT) + add_subdirectory(JWT) + list(APPEND Poco_COMPONENTS "JWT") +endif() #NetSSL diff --git a/CppUnit/CMakeLists.txt b/CppUnit/CMakeLists.txt index cfdffefda..9f960754b 100644 --- a/CppUnit/CMakeLists.txt +++ b/CppUnit/CMakeLists.txt @@ -7,16 +7,20 @@ file(GLOB_RECURSE HDRS_G "include/*.h" ) POCO_HEADERS_AUTO( SRCS ${HDRS_G}) add_library(CppUnit ${SRCS}) +add_library(Poco::CppUnit ALIAS CppUnit) set_target_properties(CppUnit PROPERTIES VERSION "1" SOVERSION "1" - DEFINE_SYMBOL CppUnit_EXPORTS) -target_link_libraries(CppUnit Poco::Foundation) + OUTPUT_NAME PocoCppUnit + DEFINE_SYMBOL CppUnit_EXPORTS + ) +target_link_libraries(CppUnit PUBLIC Poco::Foundation) target_include_directories(CppUnit PUBLIC $ $ - PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/src ) if(NOT BUILD_SHARED_LIBS) @@ -24,7 +28,11 @@ if(NOT BUILD_SHARED_LIBS) PUBLIC POCO_STATIC ) +elseif(MINGW) + target_compile_definitions(CppUnit + PUBLIC + _DLL) endif() -if (WIN32) - target_compile_definitions(CppUnit PRIVATE _CRT_SECURE_NO_WARNINGS) -endif (WIN32) + +POCO_INSTALL(CppUnit) + diff --git a/Crypto/CMakeLists.txt b/Crypto/CMakeLists.txt index 3b46cf799..8ebb6c0e1 100644 --- a/Crypto/CMakeLists.txt +++ b/Crypto/CMakeLists.txt @@ -26,11 +26,15 @@ target_include_directories(Crypto PUBLIC $ $ - PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/src ) -if(MSVC AND OPENSSL_USE_STATIC_LIBS) - target_link_libraries(Crypto PUBLIC ws2_32.lib Crypt32.lib) +if(MSVC AND POCO_DISABLE_INTERNAL_OPENSSL) + target_compile_definitions(Crypto PUBLIC POCO_EXTERNAL_OPENSSL) + if(OPENSSL_USE_STATIC_LIBS) + target_link_libraries(Crypto PUBLIC ws2_32.lib Crypt32.lib) + endif() endif() POCO_INSTALL(Crypto) diff --git a/NetSSL_OpenSSL/CMakeLists.txt b/NetSSL_OpenSSL/CMakeLists.txt index 0929c6849..040e227de 100644 --- a/NetSSL_OpenSSL/CMakeLists.txt +++ b/NetSSL_OpenSSL/CMakeLists.txt @@ -21,7 +21,7 @@ set_target_properties( NetSSL DEFINE_SYMBOL NetSSL_EXPORTS ) -target_link_libraries(NetSSL PUBLIC Poco::Crypto Poco::Net Poco::Util) +target_link_libraries(NetSSL PUBLIC Poco::Crypto Poco::Util Poco::Net) target_include_directories(NetSSL PUBLIC $ @@ -29,6 +29,10 @@ target_include_directories(NetSSL PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src ) +if(MSVC AND POCO_DISABLE_INTERNAL_OPENSSL AND OPENSSL_USE_STATIC_LIBS) + target_link_libraries(NetSSL PUBLIC ws2_32.lib Crypt32.lib) +endif() + POCO_INSTALL(NetSSL) POCO_GENERATE_PACKAGE(NetSSL) diff --git a/cmake/UseEmbeddedOpenSSL.cmake b/cmake/UseEmbeddedOpenSSL.cmake new file mode 100644 index 000000000..a35eeaf6a --- /dev/null +++ b/cmake/UseEmbeddedOpenSSL.cmake @@ -0,0 +1,79 @@ + +macro(copy_shared_ossl_lib path) + if(NOT EXISTS "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}") + execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) + endif() + file(GLOB OSSL_LIB_LIST LIST_DIRECTORIES false "${path}/*") + foreach(OSSL_LIB_FILE ${OSSL_LIB_LIST}) + execute_process(COMMAND ${CMAKE_COMMAND} -E copy ${OSSL_LIB_FILE} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) + if(POCO_VERBOSE_MESSAGES) + message(STATUS "Copying embedded OpenSSL library from ${OSSL_LIB_FILE} to ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}") + endif() + endforeach() +endmacro() + +macro(copy_static_ossl_lib path) + if(NOT EXISTS "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}") + execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}) + endif() + file(GLOB OSSL_LIB_LIST LIST_DIRECTORIES false "${path}/*") + foreach(OSSL_LIB_FILE ${OSSL_LIB_LIST}) + execute_process(COMMAND ${CMAKE_COMMAND} -E copy ${OSSL_LIB_FILE} ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}) + if(POCO_VERBOSE_MESSAGES) + message(STATUS "Copying embedded OpenSSL library from ${OSSL_LIB_FILE} to ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}") + endif() + endforeach() +endmacro() + +if(NOT EXISTS "${PROJECT_SOURCE_DIR}/openssl/build") + message(STATUS "Use internal OpenSSL binaries but ${PROJECT_SOURCE_DIR}/openssl/build doesn't exists. Try to checkout ...") + find_package(Git REQUIRED) + execute_process( + COMMAND ${GIT_EXECUTABLE} submodule update --init --recursive --remote openssl + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + RESULT_VARIABLE EXITCODE) + if(NOT "${EXITCODE}" STREQUAL "0") + message(FATAL_ERROR "Checkout ${PROJECT_SOURCE_DIR}/openssl FAILED!") + endif() +endif() + +if( "${CMAKE_SIZEOF_VOID_P}" STREQUAL "8" ) + set(_OPENSSL_MSVC_ARCH_SUFFIX "64") +else() + set(_OPENSSL_MSVC_ARCH_SUFFIX "32") +endif() + +if(BUILD_SHARED_LIBS) + option(OPENSSL_MSVC_STATIC_RT "Set ON to choose the MT version of the openssl lib" OFF) + option(OPENSSL_USE_STATIC_LIBS "Set ON to look for static openssl libraries" OFF) +else() + option(OPENSSL_MSVC_STATIC_RT "Set ON to choose the MT version of the openssl lib" ON) + option(OPENSSL_USE_STATIC_LIBS "Set ON to look for static openssl libraries" ON) +endif() + +set(OPENSSL_ROOT_DIR "${PROJECT_SOURCE_DIR}/openssl/build") + +if(OPENSSL_USE_STATIC_LIBS) + if(POCO_VERBOSE_MESSAGES) + message(STATUS "Use internal OpenSSL static binaries from ${OPENSSL_ROOT_DIR}/win${_OPENSSL_MSVC_ARCH_SUFFIX}/lib") + endif() + list(APPEND CMAKE_LIBRARY_PATH + "${OPENSSL_ROOT_DIR}/win${_OPENSSL_MSVC_ARCH_SUFFIX}/lib/debug" + "${OPENSSL_ROOT_DIR}/win${_OPENSSL_MSVC_ARCH_SUFFIX}/lib/release") + copy_static_ossl_lib("${OPENSSL_ROOT_DIR}/win${_OPENSSL_MSVC_ARCH_SUFFIX}/lib/debug") + copy_static_ossl_lib("${OPENSSL_ROOT_DIR}/win${_OPENSSL_MSVC_ARCH_SUFFIX}/lib/release") +else() + if(POCO_VERBOSE_MESSAGES) + message(STATUS "Use internal OpenSSL shared binaries from ${OPENSSL_ROOT_DIR}/win${_OPENSSL_MSVC_ARCH_SUFFIX}/bin") + endif() + list(APPEND CMAKE_LIBRARY_PATH + "${OPENSSL_ROOT_DIR}/win${_OPENSSL_MSVC_ARCH_SUFFIX}/bin/debug" + "${OPENSSL_ROOT_DIR}/win${_OPENSSL_MSVC_ARCH_SUFFIX}/bin/release") + copy_shared_ossl_lib("${OPENSSL_ROOT_DIR}/win${_OPENSSL_MSVC_ARCH_SUFFIX}/bin/debug") + copy_shared_ossl_lib("${OPENSSL_ROOT_DIR}/win${_OPENSSL_MSVC_ARCH_SUFFIX}/bin/release") + foreach(_OSSL_PATH "${OPENSSL_ROOT_DIR}/win${_OPENSSL_MSVC_ARCH_SUFFIX}/bin/debug" "${OPENSSL_ROOT_DIR}/win${_OPENSSL_MSVC_ARCH_SUFFIX}/bin/release") + string(REPLACE "/" "\\" _OSSL_WIN_PATH ${_OSSL_PATH}) + string(APPEND OPENSSL_PATH ${_OSSL_WIN_PATH} "\;") + endforeach() + set(INTERNAL_OPENSSL_PATH "PATH=%PATH%\;${OPENSSL_PATH}") +endif()