diff options
author | Brad King <brad.king@kitware.com> | 2024-03-12 22:57:02 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2024-03-18 18:04:17 (GMT) |
commit | 0b3756a7e3c4676c7f8a08c1047b6cdc7da147e2 (patch) | |
tree | 1342c023b89d779f0fc5c6171b92601e4a0f6bde | |
parent | 7cc09d8859396d543da039ded772030aa4cfb80b (diff) | |
download | CMake-0b3756a7e3c4676c7f8a08c1047b6cdc7da147e2.zip CMake-0b3756a7e3c4676c7f8a08c1047b6cdc7da147e2.tar.gz CMake-0b3756a7e3c4676c7f8a08c1047b6cdc7da147e2.tar.bz2 |
Tests/RunCMake: Add new infrastructure to run cpack
Create an alternative to the `Tests/RunCMake/CPack` infrastructure
that more closely follows the rest of RunCMake's conventions.
-rw-r--r-- | Tests/RunCMake/README.rst | 10 | ||||
-rw-r--r-- | Tests/RunCMake/RunCPack.cmake | 112 | ||||
-rw-r--r-- | Tests/RunCMake/RunCPack/verify.cmake | 14 |
3 files changed, 136 insertions, 0 deletions
diff --git a/Tests/RunCMake/README.rst b/Tests/RunCMake/README.rst index e726864..8850d7a 100644 --- a/Tests/RunCMake/README.rst +++ b/Tests/RunCMake/README.rst @@ -32,6 +32,16 @@ but do not actually build anything. To add a test: and create ``test.cmake.in``, ``CTestConfig.cmake.in``, and ``CMakeLists.txt.in`` files to be configured for each case. + Alternatively, if the test is to cover running ``cpack -G`` then use:: + + include(RunCPack) + run_cpack(Sample1) + ... + run_cpack(SampleN) + + where ``Sample1`` through ``SampleN`` are sample project directories + in the ``RunCPack/`` directory adjacent to this file. + 4. Create file ``<Test>/CMakeLists.txt`` in the directory containing:: cmake_minimum_required(...) diff --git a/Tests/RunCMake/RunCPack.cmake b/Tests/RunCMake/RunCPack.cmake new file mode 100644 index 0000000..b21eb26 --- /dev/null +++ b/Tests/RunCMake/RunCPack.cmake @@ -0,0 +1,112 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +include(RunCMake) + +#[[ +set(RunPack_GENERATORS ...) +run_cpack(<case> + # general options + [CONFIG <config>] # Build/package given configuration (default "Release"). + [GENERATORS <gen>...] # Tell cpack to use the given generator(s). + [SAMPLE <sample>] # Use RunCPack/<sample> project (default <case>). + + # build step + [BUILD] # Build the test project before packaging. + + # package,cpack-<gen> steps + [PACKAGE] # Run cpack via buildsystem "package" target. + [NO_CPACK] # Do not run cpack directly. + + # verify step + [NO_VERIFY] # Do not run verify step. + [GLOB <glob>...] # Match expected package files with globbing patterns. + [VERIFY <command>...] # Run custom verification command on each package file. + ) +#]] +function(run_cpack case) + cmake_parse_arguments(PARSE_ARGV 1 run_cpack + # Zero-value + "BUILD;PACKAGE;NO_CPACK;NO_VERIFY" + # One-value + "CONFIG;SAMPLE" + # Multi-value + "GENERATORS;GLOB;VERIFY" + ) + + if(DEFINED RunCPack_UNPARSED_ARGUMENTS) + message(FATAL_ERROR "Unknown arguments:\n ${RunCPack_UNPARSED_ARGUMENTS}") + endif() + if(DEFINED RunCPack_KEYWORDS_MISSING_VALUES) + message(FATAL_ERROR "Keywords missing values:\n ${RunCPack_KEYWORDS_MISSING_VALUES}") + endif() + + if(run_cpack_GENERATORS) + set(RunCPack_GENERATORS "${run_cpack_GENERATORS}") + elseif(NOT RunCPack_GENERATORS) + message(FATAL_ERROR "RunCPack_GENERATORS not defined by caller!") + endif() + + if(run_cpack_CONFIG) + set(RunCPack_CONFIG "${run_cpack_CONFIG}") + elseif(NOT RunCPack_CONFIG) + set(RunCPack_CONFIG "Release") + endif() + + if(run_cpack_SAMPLE) + set(RunCPack_SAMPLE "${run_cpack_SAMPLE}") + else() + set(RunCPack_SAMPLE "${case}") + endif() + + if(run_cpack_GLOB) + set(RunCPack_GLOB "${run_cpack_GLOB}") + endif() + + if(run_cpack_VERIFY) + set(RunCPack_VERIFY ${run_cpack_VERIFY}) + endif() + + # Configure the sample project. + set(RunCMake_TEST_SOURCE_DIR ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/RunCPack/${RunCPack_SAMPLE}) + set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/${case}-build) + string(APPEND RunCMake_TEST_RAW_ARGS " \"-DCPACK_GENERATOR=${RunCPack_GENERATORS}\"") + if(NOT RunCMake_GENERATOR_IS_MULTI_CONFIG) + list(APPEND RunCMake_TEST_OPTIONS -DCMAKE_BUILD_TYPE=${RunCPack_CONFIG}) + endif() + run_cmake(${case}-cmake) + unset(RunCMake_TEST_RAW_ARGS) + set(RunCMake_TEST_NO_CLEAN 1) + + # Optionally build the project. + if(run_cpack_BUILD) + set(RunCMake_TEST_OUTPUT_MERGE 1) + run_cmake_command(${case}-build + "${CMAKE_COMMAND}" --build . --config "${RunCPack_CONFIG}") + unset(RunCMake_TEST_OUTPUT_MERGE) + endif() + + # Optionally package through the build system. + if(run_cpack_PACKAGE) + set(RunCMake_TEST_OUTPUT_MERGE 1) + run_cmake_command(${case}-package + "${CMAKE_COMMAND}" --build . --config "${RunCPack_CONFIG}" --target package) + unset(RunCMake_TEST_OUTPUT_MERGE) + endif() + + # Run cpack with each generator. + if(NOT run_cpack_NO_CPACK) + foreach(RunCPack_GENERATOR IN LISTS RunCPack_GENERATORS) + run_cmake_command(${case}-cpack-${RunCPack_GENERATOR} + "${CMAKE_CPACK_COMMAND}" -C "${RunCPack_CONFIG}" -G "${RunCPack_GENERATOR}") + endforeach() + endif() + + # Verify the resulting package files. + if(NOT run_cpack_NO_VERIFY) + set(RunCMake_TEST_RAW_ARGS " \"-Dglob=${RunCPack_GLOB}\" \"-Dverify=${RunCPack_VERIFY}\" -P \"${CMAKE_CURRENT_FUNCTION_LIST_DIR}/RunCPack/verify.cmake\"") + run_cmake_command(${case}-verify + "${CMAKE_COMMAND}" -Ddir=${RunCMake_TEST_BINARY_DIR}) + unset(RunCMake_TEST_RAW_ARGS) + endif() +endfunction() diff --git a/Tests/RunCMake/RunCPack/verify.cmake b/Tests/RunCMake/RunCPack/verify.cmake new file mode 100644 index 0000000..26a52bc --- /dev/null +++ b/Tests/RunCMake/RunCPack/verify.cmake @@ -0,0 +1,14 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +if(glob) + list(TRANSFORM glob PREPEND "${dir}/") + file(GLOB files RELATIVE "${dir}" ${glob}) + foreach(file IN LISTS files) + message(STATUS "${file}") + if(verify) + execute_process(COMMAND ${verify} ${file} COMMAND_ERROR_IS_FATAL ANY) + endif() + endforeach() + message(STATUS "") +endif() |