blob: 53c90f7c3094ac99b0fea587a630ffc530b8dfd5 [file] [edit]
include(RunCMake)
# Function called in *-check.cmake scripts to check installed files.
function(check_installed expect)
file(GLOB_RECURSE actual
LIST_DIRECTORIES TRUE
RELATIVE ${CMAKE_INSTALL_PREFIX}
${CMAKE_INSTALL_PREFIX}/*
)
if(actual)
list(SORT actual)
endif()
if(NOT "${actual}" MATCHES "${expect}")
set(RunCMake_TEST_FAILED "Installed files:
${actual}
do not match what we expected:
${expect}
in directory:
${CMAKE_INSTALL_PREFIX}\n" PARENT_SCOPE)
endif()
endfunction()
# Functions called in *-check.cmake scripts to check whether preparing for
# installation built the given static library targets.
function(check_prepared)
foreach(target IN LISTS ARGN)
if(NOT EXISTS "${RunCMake_TEST_BINARY_DIR}/${RunCMake_TEST_CONFIG}/lib${target}.a" AND
NOT EXISTS "${RunCMake_TEST_BINARY_DIR}/${RunCMake_TEST_CONFIG}/${target}.lib" AND
NOT EXISTS "${RunCMake_TEST_BINARY_DIR}/${RunCMake_TEST_CONFIG}/${target}.l")
set(RunCMake_TEST_FAILED "Preparation did not build ${target}." PARENT_SCOPE)
return()
endif()
endforeach()
endfunction()
function(check_not_prepared)
foreach(target IN LISTS ARGN)
file(GLOB_RECURSE artifacts LIST_DIRECTORIES FALSE
"${RunCMake_TEST_BINARY_DIR}/lib${target}.a"
"${RunCMake_TEST_BINARY_DIR}/${target}.lib"
)
if(artifacts)
set(RunCMake_TEST_FAILED "Preparation built ${target}: ${artifacts}" PARENT_SCOPE)
return()
endif()
endforeach()
endfunction()
# Configure a test project. Callers set RunCMake_TEST_NO_CLEAN afterward to
# run further commands in the same build tree.
macro(configure_install_prep test config)
set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/${test}-build)
set(CMAKE_INSTALL_PREFIX ${RunCMake_BINARY_DIR}/${test}-install)
file(REMOVE_RECURSE "${CMAKE_INSTALL_PREFIX}")
set(RunCMake_TEST_CONFIG "")
if(RunCMake_GENERATOR_IS_MULTI_CONFIG)
set(RunCMake_TEST_CONFIG "${config}")
endif()
set(RunCMake_TEST_OPTIONS
-DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX})
if(NOT RunCMake_GENERATOR_IS_MULTI_CONFIG)
list(APPEND RunCMake_TEST_OPTIONS -DCMAKE_BUILD_TYPE=${config})
endif()
# Some generators issue additional diagnostics.
set(stderr_variant "")
if(RunCMake_GENERATOR MATCHES "Make")
set(stderr_variant make)
elseif(RunCMake_GENERATOR STREQUAL "FASTBuild")
set(stderr_variant fastbuild)
endif()
if(stderr_variant AND
EXISTS "${RunCMake_SOURCE_DIR}/${test}-stderr-${stderr_variant}.txt")
set(RunCMake-stderr-file ${test}-stderr-${stderr_variant}.txt)
endif()
run_cmake(${test})
unset(RunCMake-stderr-file)
set(RunCMake_TEST_NO_CLEAN TRUE)
endmacro()
# Build a preparation target that is expected not to exist.
function(run_missing_install_prep test prep_target)
set(RunCMake_TEST_OUTPUT_MERGE TRUE)
run_cmake_command(${test}-build ${CMAKE_COMMAND}
--build . --config Debug --target ${prep_target})
endfunction()
# Build a preparation target and then install the matching component.
function(run_install_prep test prep_target install_component)
configure_install_prep(${test} Debug)
run_cmake_command(${test}-prep ${CMAKE_COMMAND}
--build . --config Debug --target ${prep_target})
if(EXISTS "${CMAKE_INSTALL_PREFIX}")
message(SEND_ERROR "${test}: preparation ran installation.")
endif()
set(install_args --install . --config Debug)
if(NOT install_component STREQUAL "ALL")
list(APPEND install_args --component ${install_component})
endif()
set(RunCMake-check-file ${test}-install-check.cmake)
run_cmake_command(${test}-install ${CMAKE_COMMAND} ${install_args})
endfunction()
block()
configure_install_prep(InstallPrepGate-ON Debug)
run_missing_install_prep(InstallPrepGate-ON install_prep/all)
endblock()
block()
configure_install_prep(NoInstallRules Debug)
run_missing_install_prep(NoInstallRules install_prep/all)
endblock()
run_install_prep(All install_prep/all ALL)
run_install_prep(Runtime install_prep/Runtime Runtime)
run_install_prep(Development install_prep/Development Development)
run_install_prep(Nested
install_prep/Nested/Runtime_1.2+dbg Nested/Runtime_1.2+dbg)
run_install_prep(Default install_prep/DefaultComponent DefaultComponent)
run_install_prep(Hidden install_prep/Hidden Hidden)
run_install_prep(Imported install_prep/Imported Imported)
run_install_prep(Documentation install_prep/Documentation Documentation)
run_install_prep(ExcludedSubdirectory
install_prep/ExcludedSubdirectory ExcludedSubdirectory)
run_install_prep(BuildDepends install_prep/Payload Payload)
run_install_prep(GeneratedFileSetHeaders install_prep/Headers Headers)
run_install_prep(GeneratedTargetProperties install_prep/Headers Headers)
run_install_prep(GeneratedByOtherTarget install_prep/Headers Headers)
run_install_prep(GeneratedByDependency install_prep/Headers Headers)
run_install_prep(GeneratedSubdirectory install_prep/Headers Headers)
run_install_prep(GeneratedFiles install_prep/Files Files)
run_install_prep(TargetFileArtifact install_prep/Artifacts Artifacts)
if(RunCMake_GENERATOR MATCHES "Ninja")
run_install_prep(GeneratedFilesByproduct install_prep/Byproduct Byproduct)
else()
# The byproduct cannot be prepared, which is diagnosed.
block()
configure_install_prep(GeneratedFilesByproduct Debug)
endblock()
endif()
block()
configure_install_prep(ComponentNames Debug)
run_cmake_command(ComponentNames-all-build ${CMAKE_COMMAND}
--build . --config Debug --target install_prep/all)
if(RunCMake_GENERATOR MATCHES "Make")
set(RunCMake_TEST_EXPECT_RESULT "[^0]")
set(RunCMake_TEST_OUTPUT_MERGE TRUE)
endif()
run_cmake_command(ComponentNames-colon-build ${CMAKE_COMMAND}
--build . --config Debug --target install_prep/Colon:Name)
unset(RunCMake_TEST_EXPECT_RESULT)
unset(RunCMake_TEST_OUTPUT_MERGE)
run_missing_install_prep(ComponentNames-dotdot install_prep/Unsafe/../Name)
run_missing_install_prep(ComponentNames-empty-segment
install_prep/Empty//Segment)
run_missing_install_prep(ComponentNames-dot install_prep/./Dot)
foreach(case IN ITEMS "Mixed;upper" "mixed;lower" "All;all")
list(GET case 0 component)
list(GET case 1 dependency)
set(RunCMake-check-file ComponentNames-case-build-check.cmake)
run_cmake_command(ComponentNames-case-${dependency}-build ${CMAKE_COMMAND}
--build . --config Debug --target install_prep/${component})
endforeach()
endblock()
function(run_configured_install_prep test config)
configure_install_prep(${test} ${config})
run_cmake_command(${test}-prep ${CMAKE_COMMAND}
--build . --config ${config} --target install_prep/Configured)
if(EXISTS "${CMAKE_INSTALL_PREFIX}")
message(SEND_ERROR "${test}: preparation ran installation.")
endif()
set(RunCMake-check-file ${test}-install-check.cmake)
run_cmake_command(${test}-install ${CMAKE_COMMAND}
--install . --config ${config} --component Configured)
endfunction()
run_configured_install_prep(ConfigurationsDebug Debug)
run_configured_install_prep(ConfigurationsRelease Release)
if(RunCMake_GENERATOR_IS_MULTI_CONFIG)
block()
configure_install_prep(ConfigurationsMulti Debug)
foreach(config IN ITEMS Debug Release)
set(RunCMake_TEST_CONFIG "${config}")
run_cmake_command(ConfigurationsMulti-prep-${config} ${CMAKE_COMMAND}
--build . --config ${config} --target install_prep/Configured)
run_cmake_command(ConfigurationsMulti-install-${config} ${CMAKE_COMMAND}
--install . --config ${config} --component Configured)
endforeach()
endblock()
endif()
if(CMAKE_HOST_SYSTEM_NAME MATCHES "^(Windows|Linux|Darwin|FreeBSD)$")
run_install_prep(RuntimeDependencySet
install_prep/RuntimeDependencySet RuntimeDependencySet)
run_install_prep(RuntimeDependencies
install_prep/RuntimeDependencies RuntimeDependencies)
endif()
if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Darwin")
run_install_prep(RuntimeDependencyFramework
install_prep/FrameworkDependencies FrameworkDependencies)
endif()
if(CMAKE_HOST_SYSTEM_NAME MATCHES "^(Linux|Darwin)$")
run_install_prep(Namelink install_prep/Namelink Namelink)
endif()
if(RunCMake_GENERATOR MATCHES "Make" AND
CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux")
block()
configure_install_prep(MakefilePreinstall Debug)
run_cmake_command(MakefilePreinstall-prep ${CMAKE_COMMAND}
--build . --config Debug --target install_prep/Relink)
run_cmake_command(MakefilePreinstall-run
${RunCMake_TEST_BINARY_DIR}/relink)
set(RunCMake-check-file MakefilePreinstall-install-check.cmake)
run_cmake_command(MakefilePreinstall-install ${CMAKE_COMMAND}
--install . --config Debug --component Relink)
endblock()
endif()