From fd0ba705ce37f54eb88f17e257e5a57e823351bb Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Thu, 9 Jan 2020 10:14:38 -0500 Subject: [PATCH] add_custom_command: check if a relative path should be an in-source path This still is broken for dependencies on generated paths where they get generated to the source directory rather than the build directory however, but there's no way to determine that is the case. Fixes: #20194 --- Source/cmCustomCommandGenerator.cxx | 4 ---- Source/cmLocalGenerator.cxx | 7 +++++++ Tests/CustomCommand/CMakeLists.txt | 8 ++++++++ 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/Source/cmCustomCommandGenerator.cxx b/Source/cmCustomCommandGenerator.cxx index a5950071f2..34f815f3b4 100644 --- a/Source/cmCustomCommandGenerator.cxx +++ b/Source/cmCustomCommandGenerator.cxx @@ -8,7 +8,6 @@ #include -#include "cmAlgorithms.h" #include "cmCustomCommand.h" #include "cmCustomCommandLines.h" #include "cmGeneratorExpression.h" @@ -30,9 +29,6 @@ void AppendPaths(const std::vector& inputs, cmExpandedList(cge->Evaluate(lg, config)); for (std::string& it : result) { cmSystemTools::ConvertToUnixSlashes(it); - if (cmContains(it, '/') && !cmSystemTools::FileIsFullPath(it)) { - it = cmStrCat(lg->GetMakefile()->GetCurrentBinaryDirectory(), '/', it); - } if (cmSystemTools::FileIsFullPath(it)) { it = cmSystemTools::CollapseFullPath( it, lg->GetMakefile()->GetHomeOutputDirectory()); diff --git a/Source/cmLocalGenerator.cxx b/Source/cmLocalGenerator.cxx index f9d8e55e7c..6b282ab1a0 100644 --- a/Source/cmLocalGenerator.cxx +++ b/Source/cmLocalGenerator.cxx @@ -2004,6 +2004,13 @@ bool cmLocalGenerator::GetRealDependency(const std::string& inName, // Treat the name as relative to the source directory in which it // was given. dep = cmStrCat(this->GetCurrentSourceDirectory(), '/', inName); + + // If the in-source path does not exist, assume it instead lives in the + // binary directory. + if (!cmSystemTools::FileExists(dep)) { + dep = cmStrCat(this->GetCurrentBinaryDirectory(), '/', inName); + } + return true; } diff --git a/Tests/CustomCommand/CMakeLists.txt b/Tests/CustomCommand/CMakeLists.txt index 70e8476c3e..86c74ba876 100644 --- a/Tests/CustomCommand/CMakeLists.txt +++ b/Tests/CustomCommand/CMakeLists.txt @@ -549,3 +549,11 @@ add_custom_command( ) add_custom_target(depends_on_path ALL DEPENDS "depends_on_path.txt") + +add_custom_command( + OUTPUT "depends_on_in_source_path.txt" + COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/main.cxx" in_source_path.txt + DEPENDS main.cxx +) + +add_custom_target(depends_on_in_source_path ALL DEPENDS "depends_on_in_source_path.txt")