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.
This commit is contained in:
Brad King 2016-04-05 16:20:28 -04:00
parent ff805113c7
commit add7abc835
3 changed files with 30 additions and 1 deletions

View File

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

View File

@ -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()
")

View File

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