From 1161ad76ac569a38ad767d98ea7c5963a076696a Mon Sep 17 00:00:00 2001 From: Jeremy Day Date: Fri, 15 Dec 2023 12:18:39 -0800 Subject: Swift/Ninja: Always restat swift build commands The swift toolchain leaves output files untouched if there are no meaningful input changes; without restat, this causes ninja to needlessly rebuild targets that are not actually out-of-date Fixes: #25496 --- Source/cmNinjaTargetGenerator.cxx | 4 ++++ Tests/RunCMake/Swift/NoWorkToDo-norelink-stdout.txt | 2 ++ Tests/RunCMake/Swift/NoWorkToDo.cmake | 7 +++++-- Tests/RunCMake/Swift/RunCMakeTest.cmake | 3 +++ 4 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 Tests/RunCMake/Swift/NoWorkToDo-norelink-stdout.txt diff --git a/Source/cmNinjaTargetGenerator.cxx b/Source/cmNinjaTargetGenerator.cxx index 732593f..d80adf1 100644 --- a/Source/cmNinjaTargetGenerator.cxx +++ b/Source/cmNinjaTargetGenerator.cxx @@ -1948,6 +1948,10 @@ void cmNinjaTargetGenerator::WriteSwiftObjectBuildStatement( this->LanguageCompilerRule(language, config, WithScanning::No)); cmNinjaVars& vars = objBuild.Variables; + // The swift toolchain leaves outputs untouched if there are no meaningful + // changes to input files (e.g. addition of a comment). + vars.emplace("restat", "1"); + std::string const moduleName = getTargetPropertyOrDefault(target, "Swift_MODULE_NAME", target.GetName()); std::string const moduleDirectory = getTargetPropertyOrDefault( diff --git a/Tests/RunCMake/Swift/NoWorkToDo-norelink-stdout.txt b/Tests/RunCMake/Swift/NoWorkToDo-norelink-stdout.txt new file mode 100644 index 0000000..e7b31b7 --- /dev/null +++ b/Tests/RunCMake/Swift/NoWorkToDo-norelink-stdout.txt @@ -0,0 +1,2 @@ +.*\[1\/4\].* +.*\[2\/3\].* diff --git a/Tests/RunCMake/Swift/NoWorkToDo.cmake b/Tests/RunCMake/Swift/NoWorkToDo.cmake index 02b9195..b58f8ff 100644 --- a/Tests/RunCMake/Swift/NoWorkToDo.cmake +++ b/Tests/RunCMake/Swift/NoWorkToDo.cmake @@ -1,6 +1,9 @@ cmake_policy(SET CMP0157 NEW) enable_language(Swift) -add_executable(hello1 hello.swift) + +file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/hello.swift "") + +add_executable(hello1 ${CMAKE_CURRENT_BINARY_DIR}/hello.swift) set_target_properties(hello1 PROPERTIES ENABLE_EXPORTS TRUE) -add_executable(hello2 hello.swift) +add_executable(hello2 ${CMAKE_CURRENT_BINARY_DIR}/hello.swift) diff --git a/Tests/RunCMake/Swift/RunCMakeTest.cmake b/Tests/RunCMake/Swift/RunCMakeTest.cmake index 68d10ea..ba5bf44 100644 --- a/Tests/RunCMake/Swift/RunCMakeTest.cmake +++ b/Tests/RunCMake/Swift/RunCMakeTest.cmake @@ -27,6 +27,9 @@ elseif(RunCMake_GENERATOR STREQUAL Ninja) set(RunCMake_TEST_OUTPUT_MERGE 1) run_cmake_command(NoWorkToDo-build ${CMAKE_COMMAND} --build .) run_cmake_command(NoWorkToDo-nowork ${CMAKE_COMMAND} --build . -- -d explain) + file(WRITE ${RunCMake_TEST_BINARY_DIR}/hello.swift "//No-op change\n") + run_cmake_command(NoWorkToDo-norelink ${CMAKE_COMMAND} --build . -- -d explain) + run_cmake_command(NoWorkToDo-nowork ${CMAKE_COMMAND} --build . -- -d explain) endblock() # Test that intermediate static libraries are rebuilt when the public -- cgit v0.12