From 406efa57e7306e15aa470721f0115f47f6f4b8fa Mon Sep 17 00:00:00 2001 From: Vladyslav Baranovskyi Date: Thu, 20 Jun 2024 15:07:09 +0300 Subject: [PATCH] Building curl and openssl --- 3rdParty/curl/CMakeLists.txt | 52 +++++++++++++++++-------- 3rdParty/curl/ext/CMakeLists.txt | 66 ++++++++++++++++++++++++++++++++ CMakeLists.txt | 3 +- 3 files changed, 105 insertions(+), 16 deletions(-) create mode 100644 3rdParty/curl/ext/CMakeLists.txt diff --git a/3rdParty/curl/CMakeLists.txt b/3rdParty/curl/CMakeLists.txt index 92cfc23..f4f8c83 100644 --- a/3rdParty/curl/CMakeLists.txt +++ b/3rdParty/curl/CMakeLists.txt @@ -1,18 +1,40 @@ -include(FetchContent) +include(../../cmake/Utils.cmake) -if(NOT DEFINED CURL_REPO) - set(CURL_REPO https://github.com/curl/curl) -endif() +set(CURL_DEPS_INSTALL ${CMAKE_BINARY_DIR}/deps_curl) +find_package(curl QUIET) +if (NOT DEFINED curl_FOUND) + file(MAKE_DIRECTORY ${CURL_DEPS_INSTALL}) + execute_process( + COMMAND ${CMAKE_COMMAND} -G ${CMAKE_GENERATOR} -DTOOLCHAIN_FILE=${TOOLCHAIN_FILE} ${CMAKE_CURRENT_SOURCE_DIR}/ext + WORKING_DIRECTORY ${CURL_DEPS_INSTALL} + ) + execute_process( + COMMAND ${CMAKE_COMMAND} --build ${CURL_DEPS_INSTALL} + RESULT_VARIABLE build_result + ) + if (NOT ${build_result} EQUAL "0") + message(FATAL_ERROR "Failed to build curl!") + endif() -FetchContent_Declare( - curl - GIT_REPOSITORY ${CURL_REPO} - GIT_TAG curl-7_79_1 - GIT_SHALLOW TRUE -) + list(APPEND CMAKE_PREFIX_PATH ${CURL_DEPS_INSTALL}/INSTALL) +else () + message("Using system curl") + set(USING_SYSTEM_CURL ON PARENT_SCOPE) +endif () -set(BUILD_CURL_EXE OFF) -set(CURL_USE_OPENSSL OFF) -set(CURL_USE_ZLIB OFF) - -FetchContent_MakeAvailable(curl) +function(LinkCurl TARGET BINARY_DIR) + find_package(curl QUIET) + set(CURL_DEPS_INSTALL ${BINARY_DIR}/deps_curl) + if (NOT DEFINED curl_FOUND) + target_include_directories(${TARGET} PRIVATE ${CURL_DEPS_INSTALL}/INSTALL/include) + target_link_directories(${TARGET} PRIVATE ${CURL_DEPS_INSTALL}/INSTALL/lib) + if (MSVC) + target_link_libraries(${TARGET} PRIVATE libcrypto.lib libssl.lib libcurl_imp.lib) + else () + target_link_libraries(${TARGET} PRIVATE crypto ssl curl) + endif () + else () + target_include_directories(${TARGET} PRIVATE ${curl_INCLUDE_DIR}) + target_link_libraries(${TARGET} PRIVATE ${curl_LIBRARIES}) + endif () +endfunction() \ No newline at end of file diff --git a/3rdParty/curl/ext/CMakeLists.txt b/3rdParty/curl/ext/CMakeLists.txt new file mode 100644 index 0000000..ab45053 --- /dev/null +++ b/3rdParty/curl/ext/CMakeLists.txt @@ -0,0 +1,66 @@ +cmake_minimum_required(VERSION 3.16) +project(build_curl) +include(ExternalProject) +include(FetchContent) + +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) + +find_program(PERL_EXECUTABLE perl) +if (NOT PERL_EXECUTABLE) + message(FATAL_ERROR "Perl not found. Please install Perl to configure OpenSSL.") +endif() + +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) + set(OPENSSL_MAKE_COMMAND make) +endif () + +ExternalProject_Add( + OpenSSL + PREFIX ${OPENSSL_SOURCE_DIR} + GIT_REPOSITORY https://github.com/openssl/openssl.git + GIT_TAG ${OPENSSL_TAG} + GIT_SHALLOW TRUE + CONFIGURE_COMMAND ${PERL_EXECUTABLE} ${OPENSSL_PERL_CONFIGURE_COMMAND} --prefix=${OPENSSL_INSTALL_DIR} --openssldir=${OPENSSL_INSTALL_DIR} + 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 +) + +ExternalProject_Get_Property(OpenSSL INSTALL_DIR) +set(OPENSSL_ROOT_DIR ${INSTALL_DIR}) + +ExternalProject_Add( + curl + DEPENDS OpenSSL + GIT_REPOSITORY https://github.com/curl/curl.git + GIT_TAG curl-8_8_0 + 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 +) \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index e5a92aa..1b2d0ca 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -94,7 +94,8 @@ endif() list(APPEND CMAKE_PREFIX_PATH ${CMAKE_BINARY_DIR}/deps/INSTALL) -target_link_libraries(openVulkanoCpp PRIVATE magic_enum yaml-cpp fmt spdlog glm pugixml stb eigen utf8cpp imgui_internal TracyClient stud-uuid ryml CURL::libcurl) +target_link_libraries(openVulkanoCpp PRIVATE magic_enum yaml-cpp fmt spdlog glm pugixml stb eigen utf8cpp imgui_internal TracyClient stud-uuid ryml) +LinkCurl(openVulkanoCpp ${CMAKE_BINARY_DIR}) add_compile_definitions(LIBARCHIVE_STATIC) add_compile_definitions(NOMINMAX)