Ninja: Fix dupbuild error skipping alias with conflicting custom command

See-also: https://issues.slicer.org/view.php?id=4595

Reported-by: Isaiah Norton <inorton@bwh.harvard.edu>
This commit is contained in:
Jean-Christophe Fillion-Robin
2018-08-08 23:40:00 -04:00
parent 708dcbfdf5
commit 180c2f8de8
3 changed files with 54 additions and 0 deletions

View File

@@ -1112,6 +1112,12 @@ void cmGlobalNinjaGenerator::WriteTargetAliases(std::ostream& os)
continue;
}
// Don't write alias if there is a already a custom command with
// matching output
if (this->HasCustomCommandOutput(ta.first)) {
continue;
}
cmNinjaDeps deps;
this->AppendTargetOutputs(ta.second, deps);

View File

@@ -0,0 +1,41 @@
cmake_minimum_required(VERSION 3.12)
project(Test LANGUAGES C)
# fake launcher executable
set(input_launcher_executable ${CMAKE_CURRENT_BINARY_DIR}/fake_launcher_executable)
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/fake_launcher_executable "")
# application and executable name
set(application_target "HelloApp")
set(application_name "Hello")
set(executable_name "Hello")
# target built in "<root>/bin"
add_executable(${application_target} hello.c)
set_target_properties(${application_target} PROPERTIES
OUTPUT_NAME ${executable_name}
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/bin
)
# configured launcher in "<root>"
set(configured_launcher_executable "${CMAKE_CURRENT_BINARY_DIR}/${application_name}")
# create command to copy the launcher
add_custom_command(
DEPENDS
${input_launcher_executable}
OUTPUT
${configured_launcher_executable}
COMMAND
${CMAKE_COMMAND} -E copy ${input_launcher_executable} ${configured_launcher_executable}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMENT
"Configuring application launcher: ${application_name}"
)
add_custom_target(Configure${application_name}Launcher ALL
DEPENDS
${application_target}
${input_launcher_executable}
${configured_launcher_executable}
)

View File

@@ -278,3 +278,10 @@ foreach(ninja_output_path_prefix "sub space" "sub")
run_sub_cmake(SubDirPrefix "${ninja_output_path_prefix}")
run_sub_cmake(CustomCommandWorkingDirectory "${ninja_output_path_prefix}")
endforeach(ninja_output_path_prefix)
function (run_PreventTargetAliasesDupBuildRule)
set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/PreventTargetAliasesDupBuildRule-build)
run_cmake(PreventTargetAliasesDupBuildRule)
run_ninja("${RunCMake_TEST_BINARY_DIR}" -w dupbuild=err)
endfunction ()
run_PreventTargetAliasesDupBuildRule()