From 38c8807c5ac5cdc7c8d5f6ff48b521b0a2e3c81c Mon Sep 17 00:00:00 2001 From: Evan Wilde Date: Fri, 11 Nov 2022 09:59:59 -0800 Subject: Ninja: Avoid re-linking a Swift executable on every build Swift doesn't emit swiftmodules for executables, so we shouldn't put it in dependency graph. Ninja sees the "missing" dependency and always tries to rebuild/re-link the target. --- Source/cmNinjaNormalTargetGenerator.cxx | 4 +++- Tests/RunCMake/Swift/NoWorkToDo-nowork-stdout.txt | 1 + Tests/RunCMake/Swift/NoWorkToDo.cmake | 2 ++ Tests/RunCMake/Swift/RunCMakeTest.cmake | 10 ++++++++++ Tests/RunCMake/Swift/hello.swift | 0 5 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 Tests/RunCMake/Swift/NoWorkToDo-nowork-stdout.txt create mode 100644 Tests/RunCMake/Swift/NoWorkToDo.cmake create mode 100644 Tests/RunCMake/Swift/hello.swift diff --git a/Source/cmNinjaNormalTargetGenerator.cxx b/Source/cmNinjaNormalTargetGenerator.cxx index 895a4c3..21409d7 100644 --- a/Source/cmNinjaNormalTargetGenerator.cxx +++ b/Source/cmNinjaNormalTargetGenerator.cxx @@ -1112,7 +1112,9 @@ void cmNinjaNormalTargetGenerator::WriteLinkStatement( this->GetObjectFilePath(source, config)); } } - linkBuild.Outputs.push_back(vars["SWIFT_MODULE"]); + if (targetType != cmStateEnums::EXECUTABLE) { + linkBuild.Outputs.push_back(vars["SWIFT_MODULE"]); + } } else { linkBuild.ExplicitDeps = this->GetObjects(config); } diff --git a/Tests/RunCMake/Swift/NoWorkToDo-nowork-stdout.txt b/Tests/RunCMake/Swift/NoWorkToDo-nowork-stdout.txt new file mode 100644 index 0000000..60a9228 --- /dev/null +++ b/Tests/RunCMake/Swift/NoWorkToDo-nowork-stdout.txt @@ -0,0 +1 @@ +^ninja: no work to do diff --git a/Tests/RunCMake/Swift/NoWorkToDo.cmake b/Tests/RunCMake/Swift/NoWorkToDo.cmake new file mode 100644 index 0000000..e86a861 --- /dev/null +++ b/Tests/RunCMake/Swift/NoWorkToDo.cmake @@ -0,0 +1,2 @@ +enable_language(Swift) +add_executable(hello hello.swift) diff --git a/Tests/RunCMake/Swift/RunCMakeTest.cmake b/Tests/RunCMake/Swift/RunCMakeTest.cmake index 21d5a25..7f4464d 100644 --- a/Tests/RunCMake/Swift/RunCMakeTest.cmake +++ b/Tests/RunCMake/Swift/RunCMakeTest.cmake @@ -14,6 +14,16 @@ elseif(RunCMake_GENERATOR STREQUAL Ninja) run_cmake(SwiftMultiArch) unset(RunCMake_TEST_OPTIONS) endif() + + # Test that a second build with no changes does nothing. + block() + run_cmake(NoWorkToDo) + set(RunCMake_TEST_NO_CLEAN 1) + set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/NoWorkToDo-build) + set(RunCMake_TEST_OUTPUT_MERGE 1) + run_cmake_command(NoWorkToDo-build ${CMAKE_COMMAND} --build .) + run_cmake_command(NoWorkToDo-nowork ${CMAKE_COMMAND} --build . -- -d explain) + endblock() endif() elseif(RunCMake_GENERATOR STREQUAL "Ninja Multi-Config") if(CMAKE_Swift_COMPILER) diff --git a/Tests/RunCMake/Swift/hello.swift b/Tests/RunCMake/Swift/hello.swift new file mode 100644 index 0000000..e69de29 -- cgit v0.12