ソースを参照

Ninja: Restat custom command byproducts even with a SYMBOLIC output (#16049)

The change in commit v3.5.0-rc1~198^2 (Ninja: Always re-run custom
commands that have symbolic dependencies, 2015-11-19) broke the
byproducts feature added by commit v3.2.0-rc1~340^2~2 (Add an option for
explicit BYPRODUCTS of custom commands, 2014-11-13) when SYMBOLIC
outputs also appear.  This case occurs with AUTORCC-generated custom
targets because the output is SYMBOLIC (to always run) and the generated
file is a byproduct (for restat so dependents do not run unnecessarily).

The two use cases conflict because Ninja does not support per-output
restat.  Favor restat whenever byproducts are present because it is
required for byproducts to work correctly.  In use cases where we want
an always-run chain we simply will not be able to also use byproducts.
Brad King 9 年 前
コミット
add7abc835

+ 1 - 1
Source/cmLocalNinjaGenerator.cxx

@@ -444,7 +444,7 @@ cmLocalNinjaGenerator::WriteCustomCommandBuildStatement(
       this->ConstructComment(ccg),
       "Custom command for " + ninjaOutputs[0],
       cc->GetUsesTerminal(),
-      /*restat*/!symbolic,
+      /*restat*/!symbolic || !byproducts.empty(),
       ninjaOutputs,
       ninjaDeps,
       orderOnlyDeps);

+ 28 - 0
Tests/RunCMake/BuildDepends/Custom-Symbolic-and-Byproduct.cmake

@@ -0,0 +1,28 @@
+add_custom_command(
+  OUTPUT gen-byproduct gen-byproduct-stamp
+  BYPRODUCTS byproduct
+  COMMAND ${CMAKE_COMMAND} -E touch gen-byproduct-stamp
+  COMMAND ${CMAKE_COMMAND} -E copy_if_different gen-byproduct-stamp byproduct
+  )
+set_property(SOURCE gen-byproduct PROPERTY SYMBOLIC 1)
+add_custom_target(produce DEPENDS gen-byproduct)
+
+add_custom_command(
+  OUTPUT use-byproduct
+  DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/byproduct
+  COMMAND ${CMAKE_COMMAND} -E touch use-byproduct
+  )
+add_custom_target(drive ALL DEPENDS use-byproduct)
+add_dependencies(drive produce)
+
+file(GENERATE OUTPUT check-$<LOWER_CASE:$<CONFIG>>.cmake CONTENT "
+if (check_step EQUAL 1)
+  set(check_pairs
+    \"${CMAKE_CURRENT_BINARY_DIR}/use-byproduct|${CMAKE_CURRENT_BINARY_DIR}/gen-byproduct-stamp\"
+    )
+else()
+  set(check_pairs
+    \"${CMAKE_CURRENT_BINARY_DIR}/gen-byproduct-stamp|${CMAKE_CURRENT_BINARY_DIR}/use-byproduct\"
+    )
+endif()
+")

+ 1 - 0
Tests/RunCMake/BuildDepends/RunCMakeTest.cmake

@@ -39,4 +39,5 @@ if(NOT RunCMake_GENERATOR MATCHES "Visual Studio [67]|Xcode")
   unset(run_BuildDepends_skip_step_2)
 endif()
 
+run_BuildDepends(Custom-Symbolic-and-Byproduct)
 run_BuildDepends(Custom-Always)