From 7cc09d8859396d543da039ded772030aa4cfb80b Mon Sep 17 00:00:00 2001 From: Brad King Date: Tue, 12 Mar 2024 18:55:57 -0400 Subject: Tests/RunCMake: Add option to print custom details in failure output --- Tests/RunCMake/README.rst | 2 ++ Tests/RunCMake/RunCMake.cmake | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/Tests/RunCMake/README.rst b/Tests/RunCMake/README.rst index d8cae8b..e726864 100644 --- a/Tests/RunCMake/README.rst +++ b/Tests/RunCMake/README.rst @@ -71,6 +71,8 @@ but do not actually build anything. To add a test: Top of test binary tree and an failure must store a message in ``RunCMake_TEST_FAILED``. + The check script may optionally set ``RunCMake_TEST_FAILURE_MESSAGE`` + with additional text to be included in the message if the test fails. To speed up local testing, you can choose to run only a subset of ``run_cmake()`` tests in a ``RunCMakeTest.cmake`` script by using the diff --git a/Tests/RunCMake/RunCMake.cmake b/Tests/RunCMake/RunCMake.cmake index ecd7fad..ea3099f 100644 --- a/Tests/RunCMake/RunCMake.cmake +++ b/Tests/RunCMake/RunCMake.cmake @@ -248,6 +248,7 @@ function(run_cmake test) endif() endforeach() unset(RunCMake_TEST_FAILED) + unset(RunCMake_TEST_FAILURE_MESSAGE) if(RunCMake-check-file AND EXISTS ${top_src}/${RunCMake-check-file}) include(${top_src}/${RunCMake-check-file}) else() @@ -278,6 +279,9 @@ function(run_cmake test) string(APPEND msg "Actual ${o}:\n${actual_${o}}\n") endif() endforeach() + if(RunCMake_TEST_FAILURE_MESSAGE) + string(APPEND msg "${RunCMake_TEST_FAILURE_MESSAGE}") + endif() message(SEND_ERROR "${test}${RunCMake_TEST_VARIANT_DESCRIPTION} - FAILED:\n${msg}") else() message(STATUS "${test}${RunCMake_TEST_VARIANT_DESCRIPTION} - PASSED") -- cgit v0.12 From 0b3756a7e3c4676c7f8a08c1047b6cdc7da147e2 Mon Sep 17 00:00:00 2001 From: Brad King Date: Tue, 12 Mar 2024 18:57:02 -0400 Subject: 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. --- Tests/RunCMake/README.rst | 10 ++++ Tests/RunCMake/RunCPack.cmake | 112 +++++++++++++++++++++++++++++++++++ Tests/RunCMake/RunCPack/verify.cmake | 14 +++++ 3 files changed, 136 insertions(+) create mode 100644 Tests/RunCMake/RunCPack.cmake create mode 100644 Tests/RunCMake/RunCPack/verify.cmake 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 ``/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( + # general options + [CONFIG ] # Build/package given configuration (default "Release"). + [GENERATORS ...] # Tell cpack to use the given generator(s). + [SAMPLE ] # Use RunCPack/ project (default ). + + # build step + [BUILD] # Build the test project before packaging. + + # package,cpack- 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 ...] # Match expected package files with globbing patterns. + [VERIFY ...] # 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() -- cgit v0.12