From: Viktor Szakats Date: Wed, 29 Jan 2025 13:18:35 +0000 (+0100) Subject: cmake: add integration tests, run them in CI X-Git-Tag: curl-8_12_1~59 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fb70812437ad28b74dbdc1031e46c1d86bc9db3c;p=thirdparty%2Fcurl.git cmake: add integration tests, run them in CI Add CMake test project consuming curl via these methods: `FetchContent`, `add_subdirectory()`, `find_package()`. Also: - GHA/distcheck: run these tests in CI. - cmakelint: exclude a warning for calling "wonky-cased" built-in CMake functions, such as `FetchContent_Declare()`. Closes #16126 --- diff --git a/.github/labeler.yml b/.github/labeler.yml index ccc29843bc..8515afe805 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -78,7 +78,8 @@ build: plan9/**,\ projects/**,\ winbuild/**,\ - lib/libcurl.def\ + lib/libcurl.def,\ + tests/cmake/**\ }" CI: @@ -100,7 +101,8 @@ cmake: **/CMakeLists.txt,\ CMake/**,\ docs/INSTALL-CMAKE.md,\ - lib/curl_config.h.cmake\ + lib/curl_config.h.cmake,\ + tests/cmake/**\ }" cmdline tool: diff --git a/.github/workflows/configure-vs-cmake.yml b/.github/workflows/configure-vs-cmake.yml index 724fff96f2..dfe2ed622f 100644 --- a/.github/workflows/configure-vs-cmake.yml +++ b/.github/workflows/configure-vs-cmake.yml @@ -13,6 +13,7 @@ name: configure-vs-cmake - '**/CMakeLists.txt' - 'CMake/**' - 'lib/curl_config.h.cmake' + - 'tests/cmake/**' - '.github/scripts/cmp-config.pl' - '.github/workflows/configure-vs-cmake.yml' @@ -25,6 +26,7 @@ name: configure-vs-cmake - '**/CMakeLists.txt' - 'CMake/**' - 'lib/curl_config.h.cmake' + - 'tests/cmake/**' - '.github/scripts/cmp-config.pl' - '.github/workflows/configure-vs-cmake.yml' diff --git a/.github/workflows/distcheck.yml b/.github/workflows/distcheck.yml index 58465f2756..5186c27158 100644 --- a/.github/workflows/distcheck.yml +++ b/.github/workflows/distcheck.yml @@ -159,3 +159,33 @@ jobs: mv curl-9.10.11.tar.gz _verify cd _verify ../scripts/verify-release curl-9.10.11.tar.gz + + cmake-integration: + name: 'cmake-integration-on-${{ matrix.image }}' + runs-on: ${{ matrix.image }} + timeout-minutes: 10 + env: + CC: clang + CMAKE_GENERATOR: Ninja + strategy: + fail-fast: false + matrix: + image: [ubuntu-latest, macos-latest] + steps: + - name: 'install prereqs' + run: | + if [[ '${{ matrix.image }}' = *'ubuntu'* ]]; then + sudo apt-get -o Dpkg::Use-Pty=0 install ninja-build libpsl-dev libssl-dev + else + brew install ninja libpsl openssl + fi + + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + with: + persist-credentials: false + - name: 'via FetchContent' + run: ./tests/cmake/test.sh FetchContent + - name: 'via add_subdirectory' + run: ./tests/cmake/test.sh add_subdirectory + - name: 'via find_package' + run: ./tests/cmake/test.sh find_package diff --git a/CMake/Utilities.cmake b/CMake/Utilities.cmake index 869d5915b7..ff2173fc08 100644 --- a/CMake/Utilities.cmake +++ b/CMake/Utilities.cmake @@ -47,7 +47,7 @@ function(curl_dumpvars) if(_var_advanced) set(_var_advanced " [adv]") endif() - message("${_var}${_var_type}${_var_advanced} = ${${_var}}") + message("${_var}${_var_type}${_var_advanced} = '${${_var}}'") endforeach() message("::endgroup::") endfunction() diff --git a/Makefile.am b/Makefile.am index 2a130a7e4e..f69f073610 100644 --- a/Makefile.am +++ b/Makefile.am @@ -61,7 +61,10 @@ CMAKE_DIST = \ CMake/PickyWarnings.cmake \ CMake/Utilities.cmake \ CMake/win32-cache.cmake \ - CMakeLists.txt + CMakeLists.txt \ + tests/cmake/CMakeLists.txt \ + tests/cmake/test.c \ + tests/cmake/test.sh VC_DIST = projects/README.md \ projects/build-openssl.bat \ diff --git a/scripts/cmakelint.sh b/scripts/cmakelint.sh index 0700796569..4d28fd45e9 100755 --- a/scripts/cmakelint.sh +++ b/scripts/cmakelint.sh @@ -47,4 +47,4 @@ | xargs \ cmakelint \ --spaces=2 --linelength=132 \ - --filter=-whitespace/indent,-convention/filename,-package/stdargs + --filter=-whitespace/indent,-convention/filename,-package/stdargs,-readability/wonkycase diff --git a/tests/cmake/CMakeLists.txt b/tests/cmake/CMakeLists.txt new file mode 100644 index 0000000000..1b0b6693f9 --- /dev/null +++ b/tests/cmake/CMakeLists.txt @@ -0,0 +1,85 @@ +#*************************************************************************** +# _ _ ____ _ +# Project ___| | | | _ \| | +# / __| | | | |_) | | +# | (__| |_| | _ <| |___ +# \___|\___/|_| \_\_____| +# +# Copyright (C) Daniel Stenberg, , et al. +# +# This software is licensed as described in the file COPYING, which +# you should have received as part of this distribution. The terms +# are also available at https://curl.se/docs/copyright.html. +# +# You may opt to use, copy, modify, merge, publish, distribute and/or sell +# copies of the Software, and permit persons to whom the Software is +# furnished to do so, under the terms of the COPYING file. +# +# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +# KIND, either express or implied. +# +# SPDX-License-Identifier: curl +# +########################################################################### + +cmake_minimum_required(VERSION 3.7...3.16 FATAL_ERROR) +message(STATUS "Using CMake version ${CMAKE_VERSION}") + +project(test-dependent C) + +option(TEST_INTEGRATION_MODE "Integration mode" "find_package") + +message(STATUS "TEST_INTEGRATION_MODE: ${TEST_INTEGRATION_MODE}") + +if(TEST_INTEGRATION_MODE STREQUAL "FetchContent" AND CMAKE_VERSION VERSION_LESS 3.14) + message(FATAL_ERROR "This test requires CMake 3.14 or upper") +endif() + +if(TEST_INTEGRATION_MODE STREQUAL "find_package") + find_package(CURL REQUIRED CONFIG) + find_package(CURL REQUIRED CONFIG) # Double-inclusion test + foreach(result_var IN ITEMS + CURL_FOUND + CURL_SUPPORTS_HTTPS + CURL_SUPPORTS_Largefile + CURL_VERSION + CURL_VERSION_STRING + ) + if(NOT ${result_var}) + message(FATAL_ERROR "'${result_var}' variable expected, but not set by the CURL package.") + endif() + endforeach() + # Show variables set by find_package() + get_cmake_property(_vars VARIABLES) + foreach(_var IN ITEMS ${_vars}) + string(TOUPPER "${_var}" _var_upper) + if(_var_upper MATCHES "CURL") + get_property(_var_type CACHE ${_var} PROPERTY TYPE) + if(_var_type) + set(_var_type ":${_var_type}") + endif() + message("find_package() sets: ${_var}${_var_type} = '${${_var}}'") + endif() + endforeach() +elseif(TEST_INTEGRATION_MODE STREQUAL "add_subdirectory") + add_subdirectory(curl) +elseif(TEST_INTEGRATION_MODE STREQUAL "FetchContent") + include(FetchContent) + option(FROM_GIT_REPO "Git URL" "https://github.com/curl/curl.git") + option(FROM_GIT_TAG "Git tag" "master") + FetchContent_Declare(curl + GIT_REPOSITORY "${FROM_GIT_REPO}" + GIT_TAG "${FROM_GIT_TAG}" + GIT_SHALLOW) + FetchContent_MakeAvailable(curl) # Requires CMake 3.14 +endif() + +# Alias for either shared or static library +add_executable(test-dependent-selected-ns "test.c") +target_link_libraries(test-dependent-selected-ns PRIVATE "CURL::libcurl") + +if(TEST_INTEGRATION_MODE STREQUAL "add_subdirectory" OR + TEST_INTEGRATION_MODE STREQUAL "FetchContent") + add_executable(test-dependent-selected-bare "test.c") + target_link_libraries(test-dependent-selected-bare PRIVATE "libcurl") +endif() diff --git a/tests/cmake/test.c b/tests/cmake/test.c new file mode 100644 index 0000000000..1ffeb09991 --- /dev/null +++ b/tests/cmake/test.c @@ -0,0 +1,31 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + * SPDX-License-Identifier: curl + * + ***************************************************************************/ +#include "curl/curl.h" +#include + +int main(void) +{ + printf("curl_version(): |%s|\n", curl_version()); + return 0; +} diff --git a/tests/cmake/test.sh b/tests/cmake/test.sh new file mode 100755 index 0000000000..88786917d9 --- /dev/null +++ b/tests/cmake/test.sh @@ -0,0 +1,39 @@ +#!/bin/sh +# Copyright (C) Viktor Szakats +# +# SPDX-License-Identifier: curl + +set -eu + +cd "$(dirname "$0")" + +mode="${1:-all}" + +if [ "${mode}" = 'all' ] || [ "${mode}" = 'FetchContent' ]; then + rm -rf bld-fetchcontent + cmake -B bld-fetchcontent \ + -DTEST_INTEGRATION_MODE=FetchContent \ + -DFROM_GIT_REPO="${PWD}/../.." \ + -DFROM_GIT_TAG="$(git rev-parse HEAD)" + cmake --build bld-fetchcontent +fi + +if [ "${mode}" = 'all' ] || [ "${mode}" = 'add_subdirectory' ]; then + rm -rf curl; ln -s ../.. curl + rm -rf bld-add_subdirectory + cmake -B bld-add_subdirectory \ + -DTEST_INTEGRATION_MODE=add_subdirectory + cmake --build bld-add_subdirectory +fi + +if [ "${mode}" = 'all' ] || [ "${mode}" = 'find_package' ]; then + rm -rf bld-curl + cmake ../.. -B bld-curl + cmake --build bld-curl + cmake --install bld-curl --prefix bld-curl/_pkg + rm -rf bld-find_package + cmake -B bld-find_package \ + -DTEST_INTEGRATION_MODE=find_package \ + -DCMAKE_PREFIX_PATH="${PWD}/bld-curl/_pkg/lib/cmake/CURL" + cmake --build bld-find_package +fi