From dd5f3fff39bd755d815c45a3cbbfdfbf4efdb69a Mon Sep 17 00:00:00 2001 From: Viktor Szakats Date: Thu, 9 Jul 2026 11:49:35 +0200 Subject: [PATCH] cmake: fix building with `CMAKE_FIND_PACKAGE_PREFER_CONFIG=ON` By forcing local Find module invocations into `MODULE` mode. To avoid accidentally picking up such a dependency via CMake Config-based detection, which does not provide the expected imported target and make the build fail. It also prepares the scripts to alllow CMake Config support in local Find modules. Also: - add reproducer in CI. - allow custom options in CMake integration test script. Refs: https://github.com/curl/curl/commit/91e06fde1b520bc29c7996749734451e03cd549f https://github.com/curl/curl/pull/20784 https://github.com/curl/curl/issues/20729 Closes #2262 --- .github/workflows/ci.yml | 7 +++++++ CMakeLists.txt | 6 +++--- cmake/libssh2-config.in.cmake | 6 +++--- tests/cmake/test.sh | 4 ++-- 4 files changed, 15 insertions(+), 8 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cbd50d3c..4b26df08 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -192,6 +192,13 @@ jobs: if: ${{ !contains(matrix.image, 'windows') }} # MSYS2 wolfSSL package not built with the OpenSSL compatibility option run: ./tests/cmake/test.sh find_package -DCRYPTO_BACKEND=wolfSSL + - name: 'via find_package (PREFER_CONFIG=ON)' + if: ${{ contains(matrix.image, 'windows') }} + run: | + export TEST_CMAKE_FLAGS_PROVIDER='-DCMAKE_FIND_PACKAGE_PREFER_CONFIG=ON' + export TEST_CMAKE_FLAGS_CONSUMER="${TEST_CMAKE_FLAGS_PROVIDER}" + ./tests/cmake/test.sh find_package -DCRYPTO_BACKEND=mbedTLS + - name: 'via ExternalProject (old cmake)' if: ${{ contains(matrix.image, 'ubuntu') }} run: | diff --git a/CMakeLists.txt b/CMakeLists.txt index ed0725ad..2ce8bad1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -439,7 +439,7 @@ if(CRYPTO_BACKEND STREQUAL "OpenSSL" OR NOT CRYPTO_BACKEND) endif() if(CRYPTO_BACKEND STREQUAL "wolfSSL" OR NOT CRYPTO_BACKEND) - find_package(WolfSSL ${_specific_crypto_requirement}) + find_package(WolfSSL MODULE ${_specific_crypto_requirement}) if(WOLFSSL_FOUND) if(WOLFSSL_VERSION VERSION_LESS 5.4.0) message(FATAL_ERROR "wolfSSL 5.4.0 or greater required") @@ -456,7 +456,7 @@ if(CRYPTO_BACKEND STREQUAL "wolfSSL" OR NOT CRYPTO_BACKEND) endif() if(CRYPTO_BACKEND STREQUAL "Libgcrypt" OR NOT CRYPTO_BACKEND) - find_package(Libgcrypt ${_specific_crypto_requirement}) + find_package(Libgcrypt MODULE ${_specific_crypto_requirement}) if(LIBGCRYPT_FOUND) set(CRYPTO_BACKEND "Libgcrypt") set(CRYPTO_BACKEND_DEFINE "LIBSSH2_LIBGCRYPT") @@ -465,7 +465,7 @@ if(CRYPTO_BACKEND STREQUAL "Libgcrypt" OR NOT CRYPTO_BACKEND) endif() if(CRYPTO_BACKEND STREQUAL "mbedTLS" OR NOT CRYPTO_BACKEND) - find_package(MbedTLS ${_specific_crypto_requirement}) + find_package(MbedTLS MODULE ${_specific_crypto_requirement}) if(MBEDTLS_FOUND) if(MBEDTLS_VERSION VERSION_LESS 3.1.0) message(FATAL_ERROR "mbedTLS 3.1.0 or greater required") diff --git a/cmake/libssh2-config.in.cmake b/cmake/libssh2-config.in.cmake index ecc15a95..6dd43c0e 100644 --- a/cmake/libssh2-config.in.cmake +++ b/cmake/libssh2-config.in.cmake @@ -18,13 +18,13 @@ set(_libssh2_libs "") if("@CRYPTO_BACKEND@" STREQUAL "OpenSSL") find_dependency(OpenSSL) elseif("@CRYPTO_BACKEND@" STREQUAL "wolfSSL") - find_dependency(WolfSSL) + find_dependency(WolfSSL MODULE) list(APPEND _libssh2_libs libssh2::wolfssl) elseif("@CRYPTO_BACKEND@" STREQUAL "Libgcrypt") - find_dependency(Libgcrypt) + find_dependency(Libgcrypt MODULE) list(APPEND _libssh2_libs libssh2::libgcrypt) elseif("@CRYPTO_BACKEND@" STREQUAL "mbedTLS") - find_dependency(MbedTLS) + find_dependency(MbedTLS MODULE) list(APPEND _libssh2_libs libssh2::mbedcrypto) endif() diff --git a/tests/cmake/test.sh b/tests/cmake/test.sh index d47fe3e9..3ef9f088 100755 --- a/tests/cmake/test.sh +++ b/tests/cmake/test.sh @@ -74,13 +74,13 @@ if [ "${mode}" = 'all' ] || [ "${mode}" = 'find_package' ]; then bldp='bld-libssh2' prefix="${PWD}/${bldp}/_pkg" rm -rf "${bldp}" - "${cmake_provider}" -B "${bldp}" -S "${src}" -G "${gen}" ${cmake_opts} -DCMAKE_UNITY_BUILD=ON ${TEST_CMAKE_FLAGS:-} "$@" \ + "${cmake_provider}" -B "${bldp}" -S "${src}" -G "${gen}" ${cmake_opts} -DCMAKE_UNITY_BUILD=ON ${TEST_CMAKE_FLAGS:-} ${TEST_CMAKE_FLAGS_PROVIDER:-} "$@" \ -DCMAKE_INSTALL_PREFIX="${prefix}" "${cmake_provider}" --build "${bldp}" --verbose "${cmake_provider}" --install "${bldp}" bldc='bld-find_package' rm -rf "${bldc}" - "${cmake_consumer}" -B "${bldc}" -G "${gen}" ${TEST_CMAKE_FLAGS:-} \ + "${cmake_consumer}" -B "${bldc}" -G "${gen}" ${TEST_CMAKE_FLAGS:-} ${TEST_CMAKE_FLAGS_CONSUMER:-} \ -DTEST_INTEGRATION_MODE=find_package \ -DCMAKE_PREFIX_PATH="${prefix}/lib/cmake/libssh2" "${cmake_consumer}" --build "${bldc}" --verbose