From 285396f9ce4dd368f900f0253fb3f3d0b7b45a53 Mon Sep 17 00:00:00 2001 From: Vladyslav Baranovskyi Date: Sun, 16 Jun 2024 18:46:35 +0300 Subject: [PATCH 1/8] Introduced curl dependency --- 3rdParty/CMakeLists.txt | 1 + 3rdParty/curl/CMakeLists.txt | 17 +++++++++++++++++ CMakeLists.txt | 2 +- 3 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 3rdParty/curl/CMakeLists.txt diff --git a/3rdParty/CMakeLists.txt b/3rdParty/CMakeLists.txt index cc7e174..c439368 100644 --- a/3rdParty/CMakeLists.txt +++ b/3rdParty/CMakeLists.txt @@ -20,3 +20,4 @@ add_subdirectory(libstud-uuid) add_subdirectory(rapidyaml) add_subdirectory(libarchive) add_subdirectory(libjpeg-turbo) +add_subdirectory(curl) diff --git a/3rdParty/curl/CMakeLists.txt b/3rdParty/curl/CMakeLists.txt new file mode 100644 index 0000000..84908ad --- /dev/null +++ b/3rdParty/curl/CMakeLists.txt @@ -0,0 +1,17 @@ +include(FetchContent) + +if(NOT DEFINED CURL_REPO) + set(CURL_REPO https://github.com/curl/curl) +endif() + +FetchContent_Declare( + curl + GIT_REPOSITORY ${CURL_REPO} + GIT_TAG curl-7_79_1 +) + +set(BUILD_CURL_EXE OFF) +set(CURL_USE_OPENSSL OFF) +set(CURL_USE_ZLIB OFF) + +FetchContent_MakeAvailable(curl) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7121b05..e5a92aa 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -94,7 +94,7 @@ 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) +target_link_libraries(openVulkanoCpp PRIVATE magic_enum yaml-cpp fmt spdlog glm pugixml stb eigen utf8cpp imgui_internal TracyClient stud-uuid ryml CURL::libcurl) add_compile_definitions(LIBARCHIVE_STATIC) add_compile_definitions(NOMINMAX) From 48607813a5ea3194e9855c1eec5cabb3e48cc5e0 Mon Sep 17 00:00:00 2001 From: Vladyslav Baranovskyi Date: Sun, 16 Jun 2024 18:48:05 +0300 Subject: [PATCH 2/8] WebResourceLoader class IMPORTANT: The class cannot download from https:// sources because OpenSSL is turned off in curl CMakeLists.txt --- openVulkanoCpp/Host/WebResourceLoader.cpp | 90 +++++++++++++++++++++++ openVulkanoCpp/Host/WebResourceLoader.hpp | 28 +++++++ 2 files changed, 118 insertions(+) create mode 100644 openVulkanoCpp/Host/WebResourceLoader.cpp create mode 100644 openVulkanoCpp/Host/WebResourceLoader.hpp diff --git a/openVulkanoCpp/Host/WebResourceLoader.cpp b/openVulkanoCpp/Host/WebResourceLoader.cpp new file mode 100644 index 0000000..e3bb245 --- /dev/null +++ b/openVulkanoCpp/Host/WebResourceLoader.cpp @@ -0,0 +1,90 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + +#include "WebResourceLoader.hpp" +#include "IO/AppFolders.hpp" +#include "Base/Utils.hpp" + +#include +#include +#include + +namespace OpenVulkano +{ + namespace + { + size_t curlDownloader(void* contents, size_t size, size_t memBlockCount, void* userData) + { + size_t totalSize = size * memBlockCount; + std::vector* buffer = static_cast*>(userData); + buffer->insert(buffer->end(), static_cast(contents), static_cast(contents) + totalSize); + return totalSize; + } + } + + WebResourceLoader::WebResourceLoader() + { + m_cacheDirectory = AppFolders::GetAppCacheDir() / "resources"; + std::filesystem::create_directories(m_cacheDirectory); + curl_global_init(CURL_GLOBAL_DEFAULT); + } + + WebResourceLoader::~WebResourceLoader() { curl_global_cleanup(); } + + std::filesystem::path WebResourceLoader::GetCacheFilePath(const std::string& url) + { + size_t hash = std::hash {}(url); + std::string hashedUrl = std::to_string(hash); + + return m_cacheDirectory / hashedUrl; + } + + Array WebResourceLoader::DownloadResource(const std::string& url) + { + std::vector buffer; + + CURL* curl = curl_easy_init(); + if (curl) + { + curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &curlDownloader); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer); + +#ifdef __APPLE__ + curl_easy_setopt(curl, CURLOPT_SSLENGINE, "DarwinSSL"); +#endif + + CURLcode result = curl_easy_perform(curl); + if (result != CURLE_OK) + { + curl_easy_cleanup(curl); + throw std::runtime_error("Failed to download resource: '" + url + "' - " + curl_easy_strerror(result)); + } + curl_easy_cleanup(curl); + } + + std::filesystem::path cacheFilePath = GetCacheFilePath(url); + std::ofstream file(cacheFilePath, std::ios::binary); + file.write(buffer.data(), buffer.size()); + return Array(buffer); + } + + bool WebResourceLoader::IsUrl(const std::string& str) + { + return str.find("http://") == 0 || str.find("https://") == 0 || str.find("ftp://") == 0; + } + + Array WebResourceLoader::GetResource(const std::string& resourceName) + { + if (IsUrl(resourceName)) + { + std::filesystem::path cacheFilePath = GetCacheFilePath(resourceName); + if (std::filesystem::exists(cacheFilePath)) { return Utils::ReadFile(cacheFilePath.string()); } + else { return DownloadResource(resourceName); } + } + throw std::runtime_error("Resource name is not a valid URL"); + } +} \ No newline at end of file diff --git a/openVulkanoCpp/Host/WebResourceLoader.hpp b/openVulkanoCpp/Host/WebResourceLoader.hpp new file mode 100644 index 0000000..3a267b3 --- /dev/null +++ b/openVulkanoCpp/Host/WebResourceLoader.hpp @@ -0,0 +1,28 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ +#pragma once + +#include "ResourceLoader.hpp" + +#include +#include + +namespace OpenVulkano +{ + class WebResourceLoader : public ResourceLoader + { + std::filesystem::path m_cacheDirectory; + + std::filesystem::path GetCacheFilePath(const std::string& url); + Array DownloadResource(const std::string& url); + bool IsUrl(const std::string& str); + + public: + WebResourceLoader(); + ~WebResourceLoader(); + Array GetResource(const std::string& resourceName) override; + }; +} \ No newline at end of file From 200ca7237a47891d879f9d28f5b15fcc3c73a314 Mon Sep 17 00:00:00 2001 From: Vladyslav Baranovskyi Date: Mon, 17 Jun 2024 12:53:58 +0300 Subject: [PATCH 3/8] Shallow copy of curl repo, WebResourceLoader::IsUrl is now static, returning empty array instead of throwing an exception --- 3rdParty/curl/CMakeLists.txt | 1 + openVulkanoCpp/Host/WebResourceLoader.cpp | 16 ++++++++-------- openVulkanoCpp/Host/WebResourceLoader.hpp | 3 ++- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/3rdParty/curl/CMakeLists.txt b/3rdParty/curl/CMakeLists.txt index 84908ad..92cfc23 100644 --- a/3rdParty/curl/CMakeLists.txt +++ b/3rdParty/curl/CMakeLists.txt @@ -8,6 +8,7 @@ FetchContent_Declare( curl GIT_REPOSITORY ${CURL_REPO} GIT_TAG curl-7_79_1 + GIT_SHALLOW TRUE ) set(BUILD_CURL_EXE OFF) diff --git a/openVulkanoCpp/Host/WebResourceLoader.cpp b/openVulkanoCpp/Host/WebResourceLoader.cpp index e3bb245..151e9ab 100644 --- a/openVulkanoCpp/Host/WebResourceLoader.cpp +++ b/openVulkanoCpp/Host/WebResourceLoader.cpp @@ -16,7 +16,7 @@ namespace OpenVulkano { namespace { - size_t curlDownloader(void* contents, size_t size, size_t memBlockCount, void* userData) + size_t CurlDownloader(void* contents, size_t size, size_t memBlockCount, void* userData) { size_t totalSize = size * memBlockCount; std::vector* buffer = static_cast*>(userData); @@ -25,6 +25,11 @@ namespace OpenVulkano } } + bool WebResourceLoader::IsUrl(const std::string& str) + { + return str.find("http://") == 0 || str.find("https://") == 0 || str.find("ftp://") == 0; + } + WebResourceLoader::WebResourceLoader() { m_cacheDirectory = AppFolders::GetAppCacheDir() / "resources"; @@ -50,7 +55,7 @@ namespace OpenVulkano if (curl) { curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); - curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &curlDownloader); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &CurlDownloader); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer); #ifdef __APPLE__ @@ -72,11 +77,6 @@ namespace OpenVulkano return Array(buffer); } - bool WebResourceLoader::IsUrl(const std::string& str) - { - return str.find("http://") == 0 || str.find("https://") == 0 || str.find("ftp://") == 0; - } - Array WebResourceLoader::GetResource(const std::string& resourceName) { if (IsUrl(resourceName)) @@ -85,6 +85,6 @@ namespace OpenVulkano if (std::filesystem::exists(cacheFilePath)) { return Utils::ReadFile(cacheFilePath.string()); } else { return DownloadResource(resourceName); } } - throw std::runtime_error("Resource name is not a valid URL"); + return Array(); } } \ No newline at end of file diff --git a/openVulkanoCpp/Host/WebResourceLoader.hpp b/openVulkanoCpp/Host/WebResourceLoader.hpp index 3a267b3..5159e85 100644 --- a/openVulkanoCpp/Host/WebResourceLoader.hpp +++ b/openVulkanoCpp/Host/WebResourceLoader.hpp @@ -18,9 +18,10 @@ namespace OpenVulkano std::filesystem::path GetCacheFilePath(const std::string& url); Array DownloadResource(const std::string& url); - bool IsUrl(const std::string& str); public: + static bool IsUrl(const std::string& str); + WebResourceLoader(); ~WebResourceLoader(); Array GetResource(const std::string& resourceName) override; From a75df8960a5f76abc49705760c78aa0fd0f75c5d Mon Sep 17 00:00:00 2001 From: Vladyslav Baranovskyi Date: Thu, 20 Jun 2024 15:05:59 +0300 Subject: [PATCH 4/8] Reporting error instead of throwing an exception if curl has failed --- openVulkanoCpp/Host/WebResourceLoader.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/openVulkanoCpp/Host/WebResourceLoader.cpp b/openVulkanoCpp/Host/WebResourceLoader.cpp index 151e9ab..91f6e94 100644 --- a/openVulkanoCpp/Host/WebResourceLoader.cpp +++ b/openVulkanoCpp/Host/WebResourceLoader.cpp @@ -7,6 +7,7 @@ #include "WebResourceLoader.hpp" #include "IO/AppFolders.hpp" #include "Base/Utils.hpp" +#include "Base/Logger.hpp" #include #include @@ -66,7 +67,8 @@ namespace OpenVulkano if (result != CURLE_OK) { curl_easy_cleanup(curl); - throw std::runtime_error("Failed to download resource: '" + url + "' - " + curl_easy_strerror(result)); + Logger::APP->error("Failed to download resource: '" + url + "' - " + curl_easy_strerror(result)); + return Array(); } curl_easy_cleanup(curl); } From 406efa57e7306e15aa470721f0115f47f6f4b8fa Mon Sep 17 00:00:00 2001 From: Vladyslav Baranovskyi Date: Thu, 20 Jun 2024 15:07:09 +0300 Subject: [PATCH 5/8] 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) From 3020b1a19169924972b991e245a8fa591a951d61 Mon Sep 17 00:00:00 2001 From: Vladyslav Baranovskyi Date: Fri, 21 Jun 2024 00:41:12 +0300 Subject: [PATCH 6/8] CMake changes of building openssl & curl on linux --- 3rdParty/curl/CMakeLists.txt | 14 +++++++------- 3rdParty/curl/ext/CMakeLists.txt | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/3rdParty/curl/CMakeLists.txt b/3rdParty/curl/CMakeLists.txt index f4f8c83..f3966da 100644 --- a/3rdParty/curl/CMakeLists.txt +++ b/3rdParty/curl/CMakeLists.txt @@ -1,8 +1,8 @@ include(../../cmake/Utils.cmake) set(CURL_DEPS_INSTALL ${CMAKE_BINARY_DIR}/deps_curl) -find_package(curl QUIET) -if (NOT DEFINED curl_FOUND) +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 @@ -23,9 +23,9 @@ else () endif () function(LinkCurl TARGET BINARY_DIR) - find_package(curl QUIET) - set(CURL_DEPS_INSTALL ${BINARY_DIR}/deps_curl) - if (NOT DEFINED curl_FOUND) + find_package(CURL QUIET) + if (NOT DEFINED CURL_FOUND) + set(CURL_DEPS_INSTALL ${BINARY_DIR}/deps_curl) target_include_directories(${TARGET} PRIVATE ${CURL_DEPS_INSTALL}/INSTALL/include) target_link_directories(${TARGET} PRIVATE ${CURL_DEPS_INSTALL}/INSTALL/lib) if (MSVC) @@ -34,7 +34,7 @@ function(LinkCurl TARGET BINARY_DIR) 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}) + target_include_directories(${TARGET} PRIVATE ${CURL_INCLUDE_DIR}) + target_link_libraries(${TARGET} PRIVATE CURL::libcurl) endif () endfunction() \ No newline at end of file diff --git a/3rdParty/curl/ext/CMakeLists.txt b/3rdParty/curl/ext/CMakeLists.txt index ab45053..8030a58 100644 --- a/3rdParty/curl/ext/CMakeLists.txt +++ b/3rdParty/curl/ext/CMakeLists.txt @@ -17,7 +17,7 @@ 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_PERL_CONFIGURE_COMMAND ${OPENSSL_SOURCE_DIR}/src/OpenSSL/config --static -static -fPIC) set(OPENSSL_MAKE_COMMAND make) endif () From 179dbca8b4d140d2b99fd89947cadd1bb2859038 Mon Sep 17 00:00:00 2001 From: Vladyslav Baranovskyi Date: Fri, 21 Jun 2024 14:52:07 +0300 Subject: [PATCH 7/8] Fixed build on windows, passing git repos for openssl & curl, building only curl on apple --- 3rdParty/curl/CMakeLists.txt | 8 ++- 3rdParty/curl/ext/CMakeLists.txt | 115 ++++++++++++++++++++----------- 2 files changed, 79 insertions(+), 44 deletions(-) diff --git a/3rdParty/curl/CMakeLists.txt b/3rdParty/curl/CMakeLists.txt index f3966da..48a28ba 100644 --- a/3rdParty/curl/CMakeLists.txt +++ b/3rdParty/curl/CMakeLists.txt @@ -2,10 +2,10 @@ include(../../cmake/Utils.cmake) set(CURL_DEPS_INSTALL ${CMAKE_BINARY_DIR}/deps_curl) find_package(CURL QUIET) -if (NOT DEFINED CURL_FOUND) +if (NOT ${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 + COMMAND ${CMAKE_COMMAND} -G ${CMAKE_GENERATOR} -DTOOLCHAIN_FILE=${TOOLCHAIN_FILE} ${CMAKE_CURRENT_SOURCE_DIR}/ext -DCURL_REPO=${CURL_REPO} -DOPENSSL_REPO=${OPENSSL_REPO} WORKING_DIRECTORY ${CURL_DEPS_INSTALL} ) execute_process( @@ -24,12 +24,14 @@ endif () function(LinkCurl TARGET BINARY_DIR) find_package(CURL QUIET) - if (NOT DEFINED CURL_FOUND) + if (NOT ${CURL_FOUND}) set(CURL_DEPS_INSTALL ${BINARY_DIR}/deps_curl) 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) + elseif (APPLE) + target_link_libraries(${TARGET} PRIVATE curl) else () target_link_libraries(${TARGET} PRIVATE crypto ssl curl) endif () diff --git a/3rdParty/curl/ext/CMakeLists.txt b/3rdParty/curl/ext/CMakeLists.txt index 8030a58..b018e0c 100644 --- a/3rdParty/curl/ext/CMakeLists.txt +++ b/3rdParty/curl/ext/CMakeLists.txt @@ -3,6 +3,13 @@ project(build_curl) include(ExternalProject) include(FetchContent) +if (NOT DEFINED CURL_REPO OR CURL_REPO STREQUAL "") + set(CURL_REPO https://github.com/curl/curl.git) +endif () +if (NOT DEFINED OPENSSL_REPO OR OPENSSL_REPO STREQUAL "") + set(OPENSSL_REPO https://github.com/openssl/openssl.git) +endif () + 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) @@ -21,46 +28,72 @@ else () 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 -) +set(CURL_GIT_TAG curl-8_8_0) -ExternalProject_Get_Property(OpenSSL INSTALL_DIR) -set(OPENSSL_ROOT_DIR ${INSTALL_DIR}) +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=ON + -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 + ) +else () + 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} + 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_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 + ExternalProject_Get_Property(OpenSSL INSTALL_DIR) + set(OPENSSL_ROOT_DIR ${INSTALL_DIR}) + + ExternalProject_Add( + curl + DEPENDS OpenSSL + 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 + ) +endif () \ No newline at end of file From f82d6290abb62511510ff3350a19b05c8f324643 Mon Sep 17 00:00:00 2001 From: Vladyslav Baranovskyi Date: Fri, 21 Jun 2024 22:05:27 +0300 Subject: [PATCH 8/8] Simple ftxui menu for selecting an example program to run --- examples/main.cpp | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/examples/main.cpp b/examples/main.cpp index cd4dc04..e81daae 100644 --- a/examples/main.cpp +++ b/examples/main.cpp @@ -8,12 +8,39 @@ #include "ExampleApps/CubesExampleApp.hpp" #include "ExampleApps/MovingCubeApp.hpp" +#include +#include +#include +#include + +#include +#include + using namespace OpenVulkano; int main(int argc, char** argv) { - std::unique_ptr app = CubesExampleApp::CreateUnique(); - // std::unique_ptr app = MovingCubeApp::CreateUnique(); + std::vector examples = { + "Cubes Example App", + "Moving Cube Example App", + }; + + int selectedExample = 0; + ftxui::MenuOption option; + auto screen = ftxui::ScreenInteractive::TerminalOutput(); + option.on_enter = screen.ExitLoopClosure(); + auto menu = ftxui::Menu(&examples, &selectedExample, option); + + screen.Loop(menu); + + std::unique_ptr app; + switch (selectedExample) + { + case 0: app = CubesExampleApp::CreateUnique(); break; + case 1: app = MovingCubeApp::CreateUnique(); break; + default: throw std::runtime_error("Invalid menu selection!"); break; + } + GraphicsAppManager manager(app.get()); manager.Run(); return 0;