From 0a7530f78dec59ccb154a383eee2a29db1bd503b Mon Sep 17 00:00:00 2001 From: Vladyslav Baranovskyi Date: Fri, 19 Jul 2024 17:43:45 +0300 Subject: [PATCH] using curl's ext_windows subdirectory to build curl with libressl on windows --- 3rdParty/curl/CMakeLists.txt | 7 +- 3rdParty/curl/ext/CMakeLists.txt | 152 ++++++++++++++++++----- 3rdParty/curl/ext_windows/CMakeLists.txt | 29 +++++ 3 files changed, 157 insertions(+), 31 deletions(-) create mode 100644 3rdParty/curl/ext_windows/CMakeLists.txt diff --git a/3rdParty/curl/CMakeLists.txt b/3rdParty/curl/CMakeLists.txt index 0eef61f..0c9367d 100644 --- a/3rdParty/curl/CMakeLists.txt +++ b/3rdParty/curl/CMakeLists.txt @@ -5,8 +5,13 @@ set(CURL_DEPS_INSTALL ${CMAKE_BINARY_DIR}/deps_curl) set(CURL_FOUND 0) if (NOT ${CURL_FOUND}) file(MAKE_DIRECTORY ${CURL_DEPS_INSTALL}) + if (WIN32) + set(EXT_DIR ext_windows) + else () + set(EXT_DIR ext) + endif () execute_process( - COMMAND ${CMAKE_COMMAND} -G ${CMAKE_GENERATOR} -DTOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} ${CMAKE_CURRENT_SOURCE_DIR}/ext -DCURL_REPO=${CURL_REPO} -DOPENSSL_REPO=${OPENSSL_REPO} -DPLATFORM=${PLATFORM} + COMMAND ${CMAKE_COMMAND} -G ${CMAKE_GENERATOR} -DTOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} ${CMAKE_CURRENT_SOURCE_DIR}/${EXT_DIR} -DCURL_REPO=${CURL_REPO} -DOPENSSL_REPO=${OPENSSL_REPO} -DPLATFORM=${PLATFORM} WORKING_DIRECTORY ${CURL_DEPS_INSTALL} ) execute_process( diff --git a/3rdParty/curl/ext/CMakeLists.txt b/3rdParty/curl/ext/CMakeLists.txt index 9895ea2..e69f1aa 100644 --- a/3rdParty/curl/ext/CMakeLists.txt +++ b/3rdParty/curl/ext/CMakeLists.txt @@ -1,41 +1,133 @@ cmake_minimum_required(VERSION 3.16) project(build_curl) +include(ExternalProject) include(FetchContent) -if (NOT DEFINED CURL_MIRROR_LINK) - set(CURL_MIRROR_LINK https://curl.se/download/curl-8.8.0.tar.gz) +if (NOT DEFINED CURL_REPO OR CURL_REPO STREQUAL "") + set(CURL_REPO https://github.com/curl/curl.git) endif () -if (NOT DEFINED LIBRESSL_MIRROR_LINK) - set(LIBRESSL_MIRROR_LINK https://ftp.openbsd.org/pub/OpenBSD/LibreSSL/libressl-3.9.2.tar.gz) +if (NOT DEFINED OPENSSL_REPO OR OPENSSL_REPO STREQUAL "") + set(OPENSSL_REPO https://github.com/openssl/openssl.git) endif () -set(LIBRESSL_TESTS OFF CACHE BOOL "" FORCE) -FetchContent_Declare( - libressl - URL ${LIBRESSL_MIRROR_LINK} -) -FetchContent_MakeAvailable(libressl) +set(OPENSSL_SOURCE_DIR ${CMAKE_BINARY_DIR}/deps_curl/openssl-src) +set(OPENSSL_INSTALL_DIR ${CMAKE_BINARY_DIR}/INSTALL) +set(OPENSSL_INCLUDE_DIR ${OPENSSL_INSTALL_DIR}/include) +set(OPENSSL_TAG OpenSSL_1_1_1n) +set(OPENSSL_USE_STATIC_LIBS TRUE) -# add_library(OpenSSL::SSL STATIC IMPORTED) -# set_target_properties(OpenSSL::SSL PROPERTIES - # IMPORTED_LOCATION "${libressl_BINARY_DIR}/crypto/libcrypto.a" - # INTERFACE_INCLUDE_DIRECTORIES "${libressl_SOURCE_DIR}/include" -# ) +find_program(PERL_EXECUTABLE perl) +if (NOT PERL_EXECUTABLE) + message(FATAL_ERROR "Perl not found. Please install Perl to configure OpenSSL.") +endif() -# add_library(OpenSSL::Crypto STATIC IMPORTED) -# set_target_properties(OpenSSL::Crypto PROPERTIES - # IMPORTED_LOCATION "${libressl_BINARY_DIR}/ssl/libssl.a" - # INTERFACE_INCLUDE_DIRECTORIES "${libressl_SOURCE_DIR}/include" -# ) +if (MSVC) + set(OPENSSL_PERL_CONFIGURE_COMMAND ${OPENSSL_SOURCE_DIR}/src/openssl/Configure VC-WIN64A) + set(OPENSSL_MAKE_COMMAND nmake) +else () + set(OPENSSL_PERL_CONFIGURE_COMMAND ${OPENSSL_SOURCE_DIR}/src/OpenSSL/config --static -static -fPIC) + set(OPENSSL_MAKE_COMMAND make) +endif () -set(CURL_USE_LIBRESSL ON CACHE BOOL "Use LibreSSL instead of OpenSSL" FORCE) -set(OPENSSL_ROOT_DIR ${libressl_SOURCE_DIR} CACHE PATH "Path to LibreSSL root directory" FORCE) -set(OPENSSL_CRYPTO_LIBRARY ${libressl_BINARY_DIR}/crypto/libcrypto.a CACHE FILEPATH "Path to LibreSSL crypto library" FORCE) -set(OPENSSL_SSL_LIBRARY ${libressl_BINARY_DIR}/ssl/libssl.a CACHE FILEPATH "Path to LibreSSL SSL library" FORCE) -set(OPENSSL_INCLUDE_DIR ${libressl_SOURCE_DIR}/include CACHE PATH "Path to LibreSSL include directory" FORCE) +set(CURL_GIT_TAG curl-8_8_0) -FetchContent_Declare( - curl - URL ${CURL_MIRROR_LINK} -) -FetchContent_MakeAvailable(curl) \ No newline at end of file +function(InstallOpenSSL) + ExternalProject_Add( + OpenSSL + PREFIX ${OPENSSL_SOURCE_DIR} + GIT_REPOSITORY ${OPENSSL_REPO} + GIT_TAG ${OPENSSL_TAG} + GIT_SHALLOW TRUE + CONFIGURE_COMMAND ${PERL_EXECUTABLE} ${OPENSSL_PERL_CONFIGURE_COMMAND} --prefix=${OPENSSL_INSTALL_DIR} --openssldir=${OPENSSL_INSTALL_DIR} no-shared no-tests + BUILD_COMMAND ${OPENSSL_MAKE_COMMAND} + INSTALL_COMMAND ${OPENSSL_MAKE_COMMAND} install + INSTALL_DIR ${OPENSSL_INSTALL_DIR} + USES_TERMINAL_DOWNLOAD TRUE + USES_TERMINAL_CONFIGURE TRUE + USES_TERMINAL_BUILD TRUE + USES_TERMINAL_INSTALL TRUE + ) +endfunction() + +function(InstallCurl DEPENDENCY_TARGETS OPENSSL_ROOT_DIR) + ExternalProject_Add( + curl + DEPENDS ${DEPENDENCY_TARGETS} + GIT_REPOSITORY ${CURL_REPO} + GIT_TAG ${CURL_GIT_TAG} + GIT_SHALLOW TRUE + SOURCE_DIR ${CMAKE_BINARY_DIR}/curl + BINARY_DIR ${CMAKE_BINARY_DIR}/curl-build + CMAKE_GENERATOR ${CMAKE_GENERATOR} + CMAKE_ARGS + -DCMAKE_TOOLCHAIN_FILE:FILEPATH=${TOOLCHAIN_FILE} + -DCMAKE_BUILD_TYPE:STRING=Release + -DCURL_USE_OPENSSL:BOOL=ON + -DOPENSSL_ROOT_DIR=${OPENSSL_ROOT_DIR} + -DOPENSSL_INCLUDE_DIR=${OPENSSL_INCLUDE_DIR} + -DCMAKE_PREFIX_PATH=${CMAKE_BINARY_DIR}/INSTALL + -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_BINARY_DIR}/INSTALL + BUILD_COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR}/curl-build --config Release + INSTALL_COMMAND ${CMAKE_COMMAND} --install ${CMAKE_BINARY_DIR}/curl-build --config Release + USES_TERMINAL_DOWNLOAD TRUE + USES_TERMINAL_CONFIGURE TRUE + USES_TERMINAL_BUILD TRUE + USES_TERMINAL_INSTALL TRUE + ) +endfunction() + +if (APPLE) + ExternalProject_Add( + curl + GIT_REPOSITORY ${CURL_REPO} + GIT_TAG ${CURL_GIT_TAG} + GIT_SHALLOW TRUE + SOURCE_DIR ${CMAKE_BINARY_DIR}/curl + BINARY_DIR ${CMAKE_BINARY_DIR}/curl-build + CMAKE_GENERATOR ${CMAKE_GENERATOR} + CMAKE_ARGS + -DCMAKE_TOOLCHAIN_FILE:FILEPATH=${TOOLCHAIN_FILE} + -DCMAKE_BUILD_TYPE:STRING=Release + -DCURL_USE_OPENSSL:BOOL=OFF + -DBUILD_SHARED_LIBS:BOOL=OFF + -DBUILD_STATIC_LIBS:BOOL=OFF + -DBUILD_CURL_EXE:BOOL=OFF + -DCMAKE_PREFIX_PATH=${CMAKE_BINARY_DIR}/INSTALL + -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_BINARY_DIR}/INSTALL + BUILD_COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR}/curl-build --config Release + INSTALL_COMMAND ${CMAKE_COMMAND} --install ${CMAKE_BINARY_DIR}/curl-build --config Release + USES_TERMINAL_DOWNLOAD TRUE + USES_TERMINAL_CONFIGURE TRUE + USES_TERMINAL_BUILD TRUE + USES_TERMINAL_INSTALL TRUE + ) +elseif (WIN32) + + set(CURL_DEPDENDENCY_TARGETS "") + set(OPENSSL_ROOT_DIR ${OPENSSL_INSTALL_DIR}) + list(APPEND CMAKE_PREFIX_PATH ${OPENSSL_INSTALL_DIR}) + + find_package(OpenSSL QUIET) + if(NOT OpenSSL_FOUND) + message("OpenSSL not found. Building OpenSSL from sources...") + set(CURL_DEPDENDENCY_TARGETS OpenSSL) + InstallOpenSSL() + else () + set(CURL_DEPDENDENCY_TARGETS OpenSSL::SSL OpenSSL::Crypto) + message("OpenSSL is already built. Root directory is ${OPENSSL_ROOT_DIR}, include directory is ${OPENSSL_INCLUDE_DIR}") + endif() + + find_package(CURL QUIET) + if (NOT CURL_FOUND) + message("CURL not found. Building CURL from sources...") + # set(BUILD_SHARED_LIBS OFF) set(BUILD_STATIC_LIBS ON) + InstallCurl(${CURL_DEPDENDENCY_TARGETS} ${OPENSSL_ROOT_DIR}) + else () + message("CURL is already built") + endif () +else () + InstallOpenSSL() + ExternalProject_Get_Property(OpenSSL INSTALL_DIR) + set(OPENSSL_ROOT_DIR ${INSTALL_DIR}) + InstallCurl(OpenSSL ${OPENSSL_ROOT_DIR}) +endif () diff --git a/3rdParty/curl/ext_windows/CMakeLists.txt b/3rdParty/curl/ext_windows/CMakeLists.txt new file mode 100644 index 0000000..3d3efde --- /dev/null +++ b/3rdParty/curl/ext_windows/CMakeLists.txt @@ -0,0 +1,29 @@ +cmake_minimum_required(VERSION 3.16) +project(build_curl) +include(FetchContent) + +if (NOT DEFINED CURL_MIRROR_LINK) + set(CURL_MIRROR_LINK https://curl.se/download/curl-8.8.0.tar.gz) +endif () +if (NOT DEFINED LIBRESSL_MIRROR_LINK) + set(LIBRESSL_MIRROR_LINK https://ftp.openbsd.org/pub/OpenBSD/LibreSSL/libressl-3.9.2.tar.gz) +endif () + +set(LIBRESSL_TESTS OFF CACHE BOOL "" FORCE) +FetchContent_Declare( + libressl + URL ${LIBRESSL_MIRROR_LINK} +) +FetchContent_MakeAvailable(libressl) + +set(CURL_USE_LIBRESSL ON CACHE BOOL "Use LibreSSL instead of OpenSSL" FORCE) +set(OPENSSL_ROOT_DIR ${libressl_SOURCE_DIR} CACHE PATH "Path to LibreSSL root directory" FORCE) +set(OPENSSL_CRYPTO_LIBRARY ${libressl_BINARY_DIR}/crypto/libcrypto.a CACHE FILEPATH "Path to LibreSSL crypto library" FORCE) +set(OPENSSL_SSL_LIBRARY ${libressl_BINARY_DIR}/ssl/libssl.a CACHE FILEPATH "Path to LibreSSL SSL library" FORCE) +set(OPENSSL_INCLUDE_DIR ${libressl_SOURCE_DIR}/include CACHE PATH "Path to LibreSSL include directory" FORCE) + +FetchContent_Declare( + curl + URL ${CURL_MIRROR_LINK} +) +FetchContent_MakeAvailable(curl) \ No newline at end of file