From c071cb6297797aedf482c9d9f5749bbf4b12d401 Mon Sep 17 00:00:00 2001 From: Philip Top Date: Fri, 15 Sep 2023 13:21:15 -0700 Subject: [PATCH] fix: CMake package and pkgconfig rework (#916) add tests that exercise the CMake module and pkg-config files --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .github/workflows/tests.yml | 53 +++++++++++++++- cmake/CLI11GeneratePkgConfig.cmake | 8 ++- cmake/CLI11precompiled.pc.in | 11 ++++ cmake/CLIsingle.hpp.in | 10 +++ src/CMakeLists.txt | 6 +- tests/CMakeLists.txt | 77 +++++++++++++++++++++++ tests/find_package_tests/CMakeLists.txt | 19 ++++++ tests/package_config_tests/CMakeLists.txt | 21 +++++++ 8 files changed, 201 insertions(+), 4 deletions(-) create mode 100644 cmake/CLI11precompiled.pc.in create mode 100644 cmake/CLIsingle.hpp.in create mode 100644 tests/find_package_tests/CMakeLists.txt create mode 100644 tests/package_config_tests/CMakeLists.txt diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index fe2aca700..48d5dd660 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -35,7 +35,7 @@ jobs: cmake -S . -B build \ -DCMAKE_CXX_STANDARD=${{matrix.std}} \ -DCLI11_SINGLE_FILE_TESTS=OFF \ - -DCLI11_EXAMPLES=OFF \ + -DCLI11_BUILD_EXAMPLES=OFF \ -DCLI11_PRECOMPILED=${{matrix.precompile}} \ -DCMAKE_BUILD_TYPE=Coverage @@ -138,6 +138,57 @@ jobs: - name: Build run: meson compile -C build-meson + + install: + name: install tests + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + submodules: true + - name: Configure + run: cmake -S . -B build -DCLI11_INSTALL_PACKAGE_TESTS=ON -DCMAKE_INSTALL_PREFIX=/home/runner/work/install + - name: Build + run: cmake --build build -j2 + - name: install + run: cmake --install build + - name: Run tests + run: ctest --output-on-failure -L Packaging + working-directory: build + + install-precompiled: + name: install tests precompiled + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + submodules: true + - name: Configure + run: cmake -S . -B build -DCLI11_INSTALL_PACKAGE_TESTS=ON -DCMAKE_INSTALL_PREFIX=/home/runner/work/install -DCLI11_PRECOMPILED=ON + - name: Build + run: cmake --build build -j2 + - name: install + run: cmake --install build + - name: Run tests + run: ctest --output-on-failure -L Packaging + working-directory: build + + install-single_file: + name: install tests single file + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + submodules: true + - name: Configure + run: cmake -S . -B build -DCLI11_INSTALL_PACKAGE_TESTS=ON -DCMAKE_INSTALL_PREFIX=/home/runner/work/install -DCLI11_SINGLE_FILE=ON + - name: Build + run: cmake --build build -j2 + - name: install + run: cmake --install build + - name: Run tests + run: ctest --output-on-failure -L Packaging + working-directory: build cmake-config-ubuntu-2004: name: CMake config check (Ubuntu 20.04) diff --git a/cmake/CLI11GeneratePkgConfig.cmake b/cmake/CLI11GeneratePkgConfig.cmake index 5abb03d16..a9c5eb885 100644 --- a/cmake/CLI11GeneratePkgConfig.cmake +++ b/cmake/CLI11GeneratePkgConfig.cmake @@ -1,3 +1,7 @@ -configure_file("cmake/CLI11.pc.in" "CLI11.pc" @ONLY) +if(CLI11_PRECOMPILED) + configure_file("cmake/CLI11precompiled.pc.in" "CLI11.pc" @ONLY) +else() + configure_file("cmake/CLI11.pc.in" "CLI11.pc" @ONLY) +endif() -install(FILES "${PROJECT_BINARY_DIR}/CLI11.pc" DESTINATION "${CMAKE_INSTALL_DATADIR}/pkgconfig") +install(FILES "${PROJECT_BINARY_DIR}/CLI11.pc" DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig") diff --git a/cmake/CLI11precompiled.pc.in b/cmake/CLI11precompiled.pc.in new file mode 100644 index 000000000..df73d7780 --- /dev/null +++ b/cmake/CLI11precompiled.pc.in @@ -0,0 +1,11 @@ +prefix=@CMAKE_INSTALL_PREFIX@ +exec_prefix=${prefix} +includedir=${prefix}/include +libdir=${exec_prefix}/lib + +Name: CLI11 +Description: C++ command line parser +Version: @PROJECT_VERSION@ + +Cflags: -I${includedir} -DCLI11_COMPILE +Libs: -L${libdir} -lCLI11 diff --git a/cmake/CLIsingle.hpp.in b/cmake/CLIsingle.hpp.in new file mode 100644 index 000000000..862e115ba --- /dev/null +++ b/cmake/CLIsingle.hpp.in @@ -0,0 +1,10 @@ +// Copyright (c) 2017-2023, University of Cincinnati, developed by Henry Schreiner +// under NSF AWARD 1414736 and by the respective contributors. +// All rights reserved. +// +// SPDX-License-Identifier: BSD-3-Clause + +#pragma once + +//single file header +#include "../CLI11.hpp" diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 4f7af6ad1..f62c895c2 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -112,6 +112,10 @@ if(CLI11_SINGLE_FILE) if(CLI11_INSTALL) install(FILES "${PROJECT_BINARY_DIR}/include/CLI11.hpp" DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) + configure_file("${CLI11_SOURCE_DIR}/cmake/CLIsingle.hpp.in" + "${PROJECT_BINARY_DIR}/include/CLI/CLI.hpp" @ONLY) + install(FILES "${PROJECT_BINARY_DIR}/include/CLI/CLI.hpp" + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/CLI) endif() add_library(CLI11_SINGLE INTERFACE) target_link_libraries(CLI11_SINGLE INTERFACE CLI11) @@ -129,7 +133,7 @@ if(CLI11_INSTALL) if(NOT CLI11_SINGLE_FILE) install(FILES ${CLI11_headers} ${CLI11_library_headers} DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/CLI") - if(NOT CLI11_COMPILE) + if(NOT CLI11_PRECOMPILED) install(FILES ${CLI11_impl_headers} DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/CLI/impl") endif() endif() diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index f771aadc2..5618e6cfa 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -277,3 +277,80 @@ if(CMAKE_BUILD_TYPE STREQUAL Coverage) ${CLI11_TESTS} ${CLI11_MULTIONLY_TESTS}) endif() + +set(CLI11_PACKAGE_SEARCH_LOC "") + +# tests of the cmake package and pkg-config package +if(CLI11_INSTALL_PACKAGE_TESTS) + if(NOT MSVC) + set(package_test_command --test-command "${CMAKE_CTEST_COMMAND}") + else() # don't try to run the tests on MSVC since that would require copying the dll's and doing + # some other setup that isn't that important to run on all OS + set(package_test_command) + endif() + + if(CMAKE_BUILD_TYPE) + set(CLI11_PACKAGE_TEST_BUILD_TYPE ${CMAKE_BUILD_TYPE}) + else() + set(CLI11_PACKAGE_TEST_BUILD_TYPE Release) + endif() + + file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/find_package_tests") + + if(MSVC AND ${CMAKE_VERSION} VERSION_GREATER 3.12.9) + # Tests for other CMake projects including and using CLI11 using find_package + add_test( + NAME find-package-testsA + COMMAND + ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" -A "${CMAKE_GENERATOR_PLATFORM}" + "-DCLI11_DIR=${CMAKE_INSTALL_PREFIX}" "-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}" + "-DCMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD}" + "-DCMAKE_RUNTIME_OUTPUT_DIRECTORY=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" + "${CMAKE_CURRENT_SOURCE_DIR}/find_package_tests" + WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/find_package_tests") + else() + add_test( + NAME find-package-testsA + COMMAND + ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" "-DCLI11_DIR=${CMAKE_INSTALL_PREFIX}" + "-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}" "-DCMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD}" + "-DCMAKE_RUNTIME_OUTPUT_DIRECTORY=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" + "${CMAKE_CURRENT_SOURCE_DIR}/find_package_tests" + WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/find_package_tests") + endif() + + add_test(NAME find-package-testsB + COMMAND ${CMAKE_COMMAND} --build "${CMAKE_CURRENT_BINARY_DIR}/find_package_tests" + --config ${CLI11_PACKAGE_TEST_BUILD_TYPE}) + + add_test( + NAME find-package-testsC + COMMAND ${CMAKE_CTEST_COMMAND} -C ${CLI11_PACKAGE_TEST_BUILD_TYPE} + WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/find_package_tests") + set_property(TEST find-package-testsA PROPERTY LABELS Packaging) + set_property(TEST find-package-testsB PROPERTY LABELS Packaging) + set_property(TEST find-package-testsB PROPERTY DEPENDS find-package-testsA) + set_property(TEST find-package-testsC PROPERTY LABELS Packaging) + set_property(TEST find-package-testsC PROPERTY DEPENDS find-package-testsB) + + if(NOT MSVC) + # Tests for other CMake projects using the package_config files + add_test( + package-config-tests + ${CMAKE_CTEST_COMMAND} + -C + --build-and-test + "${CMAKE_CURRENT_SOURCE_DIR}/package_config_tests" + "${CMAKE_CURRENT_BINARY_DIR}/package_config_tests" + --build-generator + "${CMAKE_GENERATOR}" + --build-generator-platform + "${CMAKE_GENERATOR_PLATFORM}" + --build-options + "-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}" + "-DCMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD}" + "-DCLI11_DIR=${CMAKE_INSTALL_PREFIX}" + ${package_test_command}) + set_property(TEST package-config-tests PROPERTY LABELS Packaging) + endif() +endif() diff --git a/tests/find_package_tests/CMakeLists.txt b/tests/find_package_tests/CMakeLists.txt new file mode 100644 index 000000000..6d5aa2775 --- /dev/null +++ b/tests/find_package_tests/CMakeLists.txt @@ -0,0 +1,19 @@ +cmake_minimum_required(VERSION 3.10...3.26) + +project(CLI11-find-package-test) + +include(CTest) + +if(CLI11_DIR) + set(CMAKE_PREFIX_PATH ${CLI11_DIR}) +endif() + +# Test the CLI11 CMake package config +find_package(CLI11 2.0 REQUIRED) + +# Test the target +add_executable(package-test ../../examples/positional_validation.cpp) +target_link_libraries(package-test CLI11::CLI11) + +add_test(NAME package-test1 COMMAND package-test one) +set_property(TEST package-test1 PROPERTY PASS_REGULAR_EXPRESSION "File 1 = one") diff --git a/tests/package_config_tests/CMakeLists.txt b/tests/package_config_tests/CMakeLists.txt new file mode 100644 index 000000000..a775e8cfe --- /dev/null +++ b/tests/package_config_tests/CMakeLists.txt @@ -0,0 +1,21 @@ +cmake_minimum_required(VERSION 3.10...3.26) + +project(CLI11-package-config-test) + +include(CTest) + +find_package(PkgConfig) + +if(CLI11_DIR) + set(CMAKE_PREFIX_PATH ${CLI11_DIR} ${CLI11_DIR}/lib) +endif() + +message(STATUS "${CLI11_DIR}-- ${CMAKE_PREFIX_PATH}") +pkg_check_modules(CLI11 REQUIRED IMPORTED_TARGET CLI11) + +# Test the target +add_executable(package-config-test ../../examples/positional_validation.cpp) +target_link_libraries(package-config-test PkgConfig::CLI11) + +add_test(NAME package-config-test1 COMMAND package-config-test one) +set_property(TEST package-config-test1 PROPERTY PASS_REGULAR_EXPRESSION "File 1 = one")