blob: b21eb269ebeae4f0307c178e4e1dffa4b4e0cf7e [file] [log] [blame]
# 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()