From f20d9362ed835e5b2bc7666e40af940e3a769cb6 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 29 Jun 2025 18:41:45 +1200 Subject: [PATCH] docs: Update 3 files --- README.md | 37 ++++++++++----- build-base/Dockerfile.dropshell-build-base | 53 +++++++++++++++++----- tests/cprdemo/CMakeLists.txt | 25 +++++----- 3 files changed, 81 insertions(+), 34 deletions(-) diff --git a/README.md b/README.md index 8a572a0..1c29d4e 100644 --- a/README.md +++ b/README.md @@ -49,20 +49,35 @@ Two HTTP client approaches are available: ``` To use CPR in your CMakeLists.txt with proper static linking: + + **Simple approach (recommended for new base images):** + ```cmake + find_package(nlohmann_json REQUIRED) + find_package(CPRStatic REQUIRED) + + target_link_libraries(${PROJECT_NAME} PRIVATE + nlohmann_json::nlohmann_json + cpr::cpr_static) + ``` + + **Backwards-compatible approach (works with all base image versions):** ```cmake find_package(nlohmann_json REQUIRED) - # Find OpenSSL libraries (path varies by architecture) - find_library(OPENSSL_SSL_LIB NAMES ssl PATHS /usr/local/lib64 /usr/local/lib NO_DEFAULT_PATH) - find_library(OPENSSL_CRYPTO_LIB NAMES crypto PATHS /usr/local/lib64 /usr/local/lib NO_DEFAULT_PATH) - - # CPR static linking setup - add_library(cpr::cpr_static STATIC IMPORTED) - set_target_properties(cpr::cpr_static PROPERTIES - IMPORTED_LOCATION "/usr/local/lib/libcpr.a" - INTERFACE_INCLUDE_DIRECTORIES "/usr/local/include" - INTERFACE_LINK_LIBRARIES "/usr/local/lib/libcurl.a;${OPENSSL_SSL_LIB};${OPENSSL_CRYPTO_LIB};/usr/lib/libz.a;/usr/lib/libzstd.a;lzma;dl" - ) + # Try the new CPRStatic module first, fall back to manual setup + find_package(CPRStatic QUIET) + if(NOT CPRStatic_FOUND) + # Fallback for older base images + find_library(OPENSSL_SSL_LIB NAMES ssl PATHS /usr/local/lib64 /usr/local/lib NO_DEFAULT_PATH) + find_library(OPENSSL_CRYPTO_LIB NAMES crypto PATHS /usr/local/lib64 /usr/local/lib NO_DEFAULT_PATH) + + add_library(cpr::cpr_static STATIC IMPORTED) + set_target_properties(cpr::cpr_static PROPERTIES + IMPORTED_LOCATION "/usr/local/lib/libcpr.a" + INTERFACE_INCLUDE_DIRECTORIES "/usr/local/include" + INTERFACE_LINK_LIBRARIES "/usr/local/lib/libcurl.a;${OPENSSL_SSL_LIB};${OPENSSL_CRYPTO_LIB};/usr/lib/libz.a;/usr/lib/libzstd.a;lzma;dl" + ) + endif() target_link_libraries(${PROJECT_NAME} PRIVATE nlohmann_json::nlohmann_json diff --git a/build-base/Dockerfile.dropshell-build-base b/build-base/Dockerfile.dropshell-build-base index 55fd89d..a1aa2eb 100644 --- a/build-base/Dockerfile.dropshell-build-base +++ b/build-base/Dockerfile.dropshell-build-base @@ -183,20 +183,49 @@ RUN curl -LO https://github.com/libcpr/cpr/archive/refs/tags/${CPR_VERSION}.tar. make install && \ cd / && rm -rf /tmp/cpr-${CPR_VERSION} /tmp/${CPR_VERSION}.tar.gz -# Fix CPR CMake config to provide a static-only target -RUN cat > /usr/local/lib/cmake/cpr/cprConfig-static.cmake << 'EOF' -# Static-only CPR configuration that avoids CURL dependency issues +# Create a CMake module for easy CPR static linking +RUN mkdir -p /usr/local/share/cmake/Modules +RUN cat > /usr/local/share/cmake/Modules/FindCPRStatic.cmake << 'EOF' +# FindCPRStatic.cmake - Easy CPR static linking for dropshell-build projects +# +# This module provides cpr::cpr_static target with all dependencies handled automatically. +# It works across all architectures by dynamically finding OpenSSL library paths. +# +# Usage in CMakeLists.txt: +# find_package(CPRStatic REQUIRED) +# target_link_libraries(${PROJECT_NAME} PRIVATE cpr::cpr_static) -# Create the static CPR target -add_library(cpr::cpr_static STATIC IMPORTED) -set_target_properties(cpr::cpr_static PROPERTIES - IMPORTED_LOCATION "${CMAKE_CURRENT_LIST_DIR}/../../../lib/libcpr.a" - INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_LIST_DIR}/../../../include" - INTERFACE_LINK_LIBRARIES "/usr/local/lib/libcurl.a;/usr/local/lib64/libssl.a;/usr/local/lib64/libcrypto.a;/usr/lib/libz.a;/usr/lib/libzstd.a;lzma;dl" -) +# Find OpenSSL libraries (path varies by architecture) +find_library(OPENSSL_SSL_LIB NAMES ssl PATHS /usr/local/lib64 /usr/local/lib NO_DEFAULT_PATH) +find_library(OPENSSL_CRYPTO_LIB NAMES crypto PATHS /usr/local/lib64 /usr/local/lib NO_DEFAULT_PATH) -# Provide an alias for convenience -add_library(cpr::static ALIAS cpr::cpr_static) +if(NOT OPENSSL_SSL_LIB OR NOT OPENSSL_CRYPTO_LIB) + message(FATAL_ERROR "OpenSSL libraries not found. Expected in /usr/local/lib64 or /usr/local/lib") +endif() + +# Create the CPR static target +if(NOT TARGET cpr::cpr_static) + add_library(cpr::cpr_static STATIC IMPORTED) + set_target_properties(cpr::cpr_static PROPERTIES + IMPORTED_LOCATION "/usr/local/lib/libcpr.a" + INTERFACE_INCLUDE_DIRECTORIES "/usr/local/include" + INTERFACE_LINK_LIBRARIES "/usr/local/lib/libcurl.a;${OPENSSL_SSL_LIB};${OPENSSL_CRYPTO_LIB};/usr/lib/libz.a;/usr/lib/libzstd.a;lzma;dl" + ) + + # Provide an alias for convenience + add_library(cpr::static ALIAS cpr::cpr_static) +endif() + +# Mark as found +set(CPRStatic_FOUND TRUE) + +# Provide some useful variables +set(CPRStatic_LIBRARY "/usr/local/lib/libcpr.a") +set(CPRStatic_INCLUDE_DIR "/usr/local/include") +set(CPRStatic_SSL_LIBRARY "${OPENSSL_SSL_LIB}") +set(CPRStatic_CRYPTO_LIBRARY "${OPENSSL_CRYPTO_LIB}") + +mark_as_advanced(CPRStatic_LIBRARY CPRStatic_INCLUDE_DIR CPRStatic_SSL_LIBRARY CPRStatic_CRYPTO_LIBRARY) EOF diff --git a/tests/cprdemo/CMakeLists.txt b/tests/cprdemo/CMakeLists.txt index 9672d39..1aefea2 100644 --- a/tests/cprdemo/CMakeLists.txt +++ b/tests/cprdemo/CMakeLists.txt @@ -37,17 +37,20 @@ target_include_directories(${PROJECT_NAME} PRIVATE # Find packages find_package(nlohmann_json REQUIRED) -# Find OpenSSL libraries (path varies by architecture) -find_library(OPENSSL_SSL_LIB NAMES ssl PATHS /usr/local/lib64 /usr/local/lib NO_DEFAULT_PATH) -find_library(OPENSSL_CRYPTO_LIB NAMES crypto PATHS /usr/local/lib64 /usr/local/lib NO_DEFAULT_PATH) - -# CPR static linking setup -add_library(cpr::cpr_static STATIC IMPORTED) -set_target_properties(cpr::cpr_static PROPERTIES - IMPORTED_LOCATION "/usr/local/lib/libcpr.a" - INTERFACE_INCLUDE_DIRECTORIES "/usr/local/include" - INTERFACE_LINK_LIBRARIES "/usr/local/lib/libcurl.a;${OPENSSL_SSL_LIB};${OPENSSL_CRYPTO_LIB};/usr/lib/libz.a;/usr/lib/libzstd.a;lzma;dl" -) +# Try the new CPRStatic module first, fall back to manual setup +find_package(CPRStatic QUIET) +if(NOT CPRStatic_FOUND) + # Fallback for older base images + find_library(OPENSSL_SSL_LIB NAMES ssl PATHS /usr/local/lib64 /usr/local/lib NO_DEFAULT_PATH) + find_library(OPENSSL_CRYPTO_LIB NAMES crypto PATHS /usr/local/lib64 /usr/local/lib NO_DEFAULT_PATH) + + add_library(cpr::cpr_static STATIC IMPORTED) + set_target_properties(cpr::cpr_static PROPERTIES + IMPORTED_LOCATION "/usr/local/lib/libcpr.a" + INTERFACE_INCLUDE_DIRECTORIES "/usr/local/include" + INTERFACE_LINK_LIBRARIES "/usr/local/lib/libcurl.a;${OPENSSL_SSL_LIB};${OPENSSL_CRYPTO_LIB};/usr/lib/libz.a;/usr/lib/libzstd.a;lzma;dl" + ) +endif() # Link libraries target_link_libraries(${PROJECT_NAME} PRIVATE