Files
Craig Scott d410092ece FetchContent: Move log level detection into step script
A step with a custom command shouldn't be seen as out-of-date
just because the user re-runs configure with a different log level.
Previously, the log level was written directly to the step scripts,
but that meant the script changes if the user specifies a different
effective log level to the previous configure. Now we move the
log level detection into the script so that the script remains the
same no matter what log level the user asks for.

This was most noticeable with the PATCH step, since that always
uses a custom command when present. Changing the log level
would cause the PATCH step to re-run, which usually results in
an error because PATCH typically only expects to run once after
a DOWNLOAD. But the underlying problem would affect any step
with a custom command, not just PATCH.

Fixes: #28055
2026-09-13 21:23:27 +10:00

129 lines
4.9 KiB
CMake

include(RunCMake)
unset(RunCMake_TEST_NO_CLEAN)
function(run_cmake_with_cmp0168 name)
run_cmake_with_options("${name}" -D CMP0168=OLD ${ARGN})
set(RunCMake_TEST_VARIANT_DESCRIPTION "-direct")
run_cmake_with_options("${name}" -D CMP0168=NEW ${ARGN})
endfunction()
# Won't get to the part where CMP0168 matters
run_cmake_with_options(MissingDetails -D CMP0168=NEW)
# These are testing specific aspects of the sub-build
run_cmake_with_options(SameGenerator -D CMP0168=OLD)
run_cmake_with_options(VarPassthroughs -D CMP0168=OLD)
run_cmake_with_cmp0168(DirectIgnoresDetails)
run_cmake_with_cmp0168(FirstDetailsWin)
block(SCOPE_FOR VARIABLES)
# Reuse this test to also verify that "cmake --fresh" re-executes the steps
# when using the direct mode
set(RunCMake_TEST_NO_CLEAN 1)
set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/FirstDetailsWin-direct-build)
set(RunCMake_TEST_VARIANT_DESCRIPTION "-direct-fresh")
run_cmake_with_options(FirstDetailsWin -D CMP0168=NEW --fresh)
endblock()
run_cmake_with_cmp0168(DownloadTwice)
run_cmake_with_cmp0168(DownloadFile)
run_cmake_with_cmp0168(IgnoreToolchainFile)
run_cmake_with_cmp0168(System)
run_cmake_with_cmp0168(VarDefinitions)
run_cmake_with_cmp0168(GetProperties)
run_cmake_with_cmp0168(UsesTerminalOverride)
run_cmake_with_cmp0168(MakeAvailable)
run_cmake_with_cmp0168(MakeAvailableTwice)
run_cmake_with_cmp0168(MakeAvailableUndeclared)
run_cmake_with_cmp0168(VerifyHeaderSet)
block(SCOPE_FOR VARIABLES)
# The direct-population scripts must be independent of the configure-time
# log level. Steps should not be seen as out-of-date just because the user
# re-ran configure with a different verbosity.
# Reuse the build tree for a quiet then verbose configuration.
set(RunCMake_TEST_NO_CLEAN 1)
set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/LogLevel-direct-build)
run_cmake(LogLevel)
set(RunCMake_TEST_VARIANT_DESCRIPTION "-verbose")
run_cmake_with_options(LogLevel --log-level=VERBOSE)
endblock()
run_cmake_with_cmp0168(FindDependencyExport
-D "CMAKE_PROJECT_TOP_LEVEL_INCLUDES=${CMAKE_CURRENT_LIST_DIR}/FindDependencyExportDP.cmake"
)
run_cmake_with_cmp0168(ManualSourceDirectory
-D "FETCHCONTENT_SOURCE_DIR_WITHPROJECT=${CMAKE_CURRENT_LIST_DIR}/WithProject"
)
run_cmake_with_cmp0168(ManualSourceDirectoryMissing
-D "FETCHCONTENT_SOURCE_DIR_WITHPROJECT=${CMAKE_CURRENT_LIST_DIR}/ADirThatDoesNotExist"
)
# Need to use :STRING to prevent CMake from automatically converting it to an
# absolute path
run_cmake_with_cmp0168(ManualSourceDirectoryRelative
-D "FETCHCONTENT_SOURCE_DIR_WITHPROJECT:STRING=WithProject"
)
function(run_FetchContent_DirOverrides cmp0168)
if(cmp0168 STREQUAL "NEW")
set(RunCMake_TEST_VARIANT_DESCRIPTION "-direct")
endif()
set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/DirOverrides${RunCMake_TEST_VARIANT_DESCRIPTION}-build)
file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
run_cmake_with_options(DirOverrides -D CMP0168=${cmp0168})
set(RunCMake_TEST_NO_CLEAN 1)
run_cmake_with_options(DirOverridesDisconnected
-D CMP0168=${cmp0168}
-D FETCHCONTENT_FULLY_DISCONNECTED=YES
)
endfunction()
run_FetchContent_DirOverrides(OLD)
run_FetchContent_DirOverrides(NEW)
set(RunCMake_TEST_OUTPUT_MERGE 1)
run_cmake_with_cmp0168(PreserveEmptyArgs)
set(RunCMake_TEST_OUTPUT_MERGE 0)
function(run_FetchContent_ExcludeFromAll)
set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/ExcludeFromAll-build)
file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
# We're testing FetchContent_MakeAvailable()'s add_subdirectory() behavior,
# so it doesn't matter if we use OLD or NEW for CMP0168, but NEW is faster.
run_cmake(ExcludeFromAll -D CMP0168=NEW)
set(RunCMake_TEST_NO_CLEAN 1)
run_cmake_command(ExcludeFromAll-build ${CMAKE_COMMAND} --build .)
endfunction()
run_FetchContent_ExcludeFromAll()
# Script mode testing requires more care for CMP0168 set to OLD.
# We need to pass through CMAKE_GENERATOR and CMAKE_MAKE_PROGRAM
# to ensure the test can run on machines where the build tool
# isn't on the PATH. Some build machines explicitly test with such
# an arrangement (e.g. to test with spaces in the path). We also
# pass through the platform and toolset for completeness, even
# though we don't build anything, just in case this somehow affects
# the way the build tool is invoked.
run_cmake_command(ScriptMode
${CMAKE_COMMAND}
-DCMP0168=OLD
-DCMAKE_GENERATOR=${RunCMake_GENERATOR}
-DCMAKE_GENERATOR_PLATFORM=${RunCMake_GENERATOR_PLATFORM}
-DCMAKE_GENERATOR_TOOLSET=${RunCMake_GENERATOR_TOOLSET}
-DCMAKE_MAKE_PROGRAM=${RunCMake_MAKE_PROGRAM}
-P ${CMAKE_CURRENT_LIST_DIR}/ScriptMode.cmake
)
# CMP0168 NEW doesn't need a build tool or generator, so don't set them.
run_cmake_command(ScriptMode-direct
${CMAKE_COMMAND}
-DCMP0168=NEW
-P ${CMAKE_CURRENT_LIST_DIR}/ScriptMode.cmake
)
run_cmake(DisableSourceChanges)