| include(RunCMake) |
| |
| function(build_project test) |
| set(RunCMake_TEST_NO_CLEAN FALSE) |
| set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/${test}-build) |
| if (NOT RunCMake_GENERATOR_IS_MULTI_CONFIG) |
| list(APPEND RunCMake_TEST_OPTIONS -DCMAKE_BUILD_TYPE=Release) |
| endif() |
| |
| run_cmake(${test}) |
| |
| set(RunCMake_TEST_NO_CLEAN TRUE) |
| run_cmake_command(${test}-build ${CMAKE_COMMAND} --build . --config Release) |
| endfunction() |
| |
| #[[ |
| These tests are not testing CPS as such, but rather are testing the way that |
| CMake maps configurations; specifically, which MAP_IMPORTED_CONFIG_<CONFIG> is |
| considered when selecting a configuration of a target required by another |
| target for which a non-standard configuration has been selected. |
| |
| It happens that CMake's behavior is to always use the configuration of the |
| project being built, and not the selected configuration of the consumer of the |
| target for which configuration selection is occurring. This turns out to be |
| advantageous, as it makes it relatively simple to use chains of interface |
| targets to select along multiple configuration axes, since it is relatively |
| simple for projects to set CMAKE_MAP_IMPORTED_CONFIG_<CONFIG> to a list of |
| preferred values along each axis and be sure the same list will be used for |
| each level of selection. |
| |
| This test/example uses the following hierarchy: |
| target "animal", configurations "cat", "dog" |
| targets "cat", "dog", configurations "tame", "wild" |
| |
| The consuming project sets CMAKE_MAP_IMPORTED_CONFIG_<CONFIG> to the list of |
| desired values on each of the two axes, e.g. "CAT;TAME". This causes CMake to |
| select the "CAT" configuration of the "animal" target, which links "cat", |
| then, because CMake is still using MAP_IMPORTED_CONFIG_${CMAKE_BUILD_TYPE}, |
| to select the "TAME" configuration of the "cat" target. |
| |
| A more practical example is described by CPS, at |
| https://cps-org.github.io/cps/recommendations.html. |
| |
| The main reason this is a "CPS" test is because CPS makes it possible to |
| provide targets which implement multiple configuration axes in a way that is |
| surprisingly usable by CMake consumers. However, CMake itself has no way of |
| generating such exports as of when this test is being added (CMake 4.3). Thus, |
| it is testing something which is suggested by CPS, but is unlikely to be |
| encountered in a CMake-created package. (In principle, however, a hand-written |
| CMake-script package description could produce equivalent imported targets.) |
| #]] |
| |
| build_project(TestTameCat) |
| build_project(TestWildCat) |
| build_project(TestTameDog) |
| build_project(TestWildDog) |