add_custom_command: Normalize OUTPUT and DEPENDS paths.

While tracing dependencies of a target, cmTargetTraceDependencies
follows sources by full path to determine if the source is to be
produced by a custom command.  Commit 4959f341 (cmSourceFileLocation:
Collapse full path for directory comparisons., 2014-03-27) changed
the storage of target sources to be in the form of a normalized
path instead of an unnormalized path.

The path is followed by looking it up in a mapping via
cmMakefile::GetSourceFileWithOutput to acquire an appropriate
cmSourceFile.  The mapping is populated with the OUTPUT components
of add_custom_command invocations, however it is populated with
unnormalized paths.  This means that the tracing logic does not
find appropriate cmSourceFiles, and does not generate appropriate
build rules for the generated sources.

Normalize the paths in the OUTPUT components of add_custom_command
to resolve this.

The paths in the DEPENDS component of add_custom_command are also
not normalized, leading to the same problem again.  Normalize the
depends paths after generator evaluation and expansion.
This commit is contained in:
Stephen Kelly 2014-05-28 20:16:39 +02:00
parent 5e9441cd39
commit c4af46b444
3 changed files with 42 additions and 1 deletions

View File

@ -173,6 +173,10 @@ bool cmAddCustomCommandCommand
break;
}
if (cmSystemTools::FileIsFullPath(filename.c_str()))
{
filename = cmSystemTools::CollapseFullPath(filename);
}
switch (doing)
{
case doing_working_directory:

View File

@ -103,8 +103,18 @@ std::vector<std::string> const& cmCustomCommandGenerator::GetDepends() const
{
cmsys::auto_ptr<cmCompiledGeneratorExpression> cge
= this->GE->Parse(*i);
std::vector<std::string> result;
cmSystemTools::ExpandListArgument(
cge->Evaluate(this->Makefile, this->Config), this->Depends);
cge->Evaluate(this->Makefile, this->Config), result);
for (std::vector<std::string>::iterator it = result.begin();
it != result.end(); ++it)
{
if (cmSystemTools::FileIsFullPath(it->c_str()))
{
*it = cmSystemTools::CollapseFullPath(*it);
}
}
this->Depends.insert(this->Depends.end(), result.begin(), result.end());
}
}
return this->Depends;

View File

@ -456,3 +456,30 @@ add_custom_target(source_in_custom_target SOURCES source_in_custom_target.cpp)
set_property(SOURCE source_in_custom_target
PROPERTY COMPILE_DEFINITIONS "TEST"
)
set(gen_path "${CMAKE_CURRENT_BINARY_DIR}//./foo")
set(gen_file "${gen_path}/foo.cxx")
add_custom_command(
OUTPUT "${gen_file}"
# Make sure the output directory exists before trying to write to it.
COMMAND ${CMAKE_COMMAND} -E make_directory "${gen_path}"
COMMAND ${CMAKE_COMMAND} -E touch "${gen_file}"
)
add_library(NormOutput "${gen_file}")
set(gen_path "${gen_path}/bar")
set(gen_file "${gen_path}/bar.cxx")
add_custom_command(
OUTPUT "${gen_path}"
COMMAND ${CMAKE_COMMAND} -E make_directory "${gen_path}"
)
add_custom_command(
OUTPUT "${gen_file}"
DEPENDS "${gen_path}"
COMMAND ${CMAKE_COMMAND} -E touch "${gen_file}")
add_library(NormDepends "${gen_file}")