]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
cmake: add integration tests, run them in CI
authorViktor Szakats <commit@vsz.me>
Wed, 29 Jan 2025 13:18:35 +0000 (14:18 +0100)
committerViktor Szakats <commit@vsz.me>
Thu, 6 Feb 2025 23:15:48 +0000 (00:15 +0100)
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

.github/labeler.yml
.github/workflows/configure-vs-cmake.yml
.github/workflows/distcheck.yml
CMake/Utilities.cmake
Makefile.am
scripts/cmakelint.sh
tests/cmake/CMakeLists.txt [new file with mode: 0644]
tests/cmake/test.c [new file with mode: 0644]
tests/cmake/test.sh [new file with mode: 0755]

index ccc29843bc96ac648b096d4f41c51397577b0e35..8515afe80526b8594b7728aa078721b96c6d3077 100644 (file)
@@ -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:
index 724fff96f2b467764c7d48a638081175f863cbfc..dfe2ed622f506e05b2b13f6a989cc15e94dc0c91 100644 (file)
@@ -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'
 
index 58465f275640a0efdeb0abb9b0915ad1e63f0bb8..5186c271584d0fc33c4847b961e8ab41585a120d 100644 (file)
@@ -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
index 869d5915b700d163261be1a73443cbdc777346e0..ff2173fc08b8d7d13cf3c99aa9de43d9a0f8b6cc 100644 (file)
@@ -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()
index 2a130a7e4eee5f4fada0dcfe872c204261efc8e5..f69f0736105f7fa7a89e55b4e1845580ca96d014 100644 (file)
@@ -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                            \
index 070079656972b1b552510df8536fdad8c51316e6..4d28fd45e9070485dbd65515b6e965ea8b1b40c0 100755 (executable)
@@ -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 (file)
index 0000000..1b0b669
--- /dev/null
@@ -0,0 +1,85 @@
+#***************************************************************************
+#                                  _   _ ____  _
+#  Project                     ___| | | |  _ \| |
+#                             / __| | | | |_) | |
+#                            | (__| |_| |  _ <| |___
+#                             \___|\___/|_| \_\_____|
+#
+# Copyright (C) Daniel Stenberg, <daniel@haxx.se>, 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 (file)
index 0000000..1ffeb09
--- /dev/null
@@ -0,0 +1,31 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) Daniel Stenberg, <daniel@haxx.se>, 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 <stdio.h>
+
+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 (executable)
index 0000000..8878691
--- /dev/null
@@ -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