Normalize OBJECT_DEPENDS paths to match custom commands (#15366)

Custom command path normalization added in commit v3.1.0-rc1~471^2
(add_custom_command: Normalize OUTPUT and DEPENDS paths, 2014-05-28)
broke use of OBJECT_DEPENDS to bring in custom commands because the
latter paths were not normalized too.  Normalize them and add a test
case.

Reported-by: Daniel v. Gerpen
This commit is contained in:
Brad King 2015-01-27 10:57:17 -05:00
parent 57622bd19d
commit 9259d77881
5 changed files with 35 additions and 0 deletions

View File

@ -676,6 +676,14 @@ void cmTargetTraceDependencies::Trace()
{ {
std::vector<std::string> objDeps; std::vector<std::string> objDeps;
cmSystemTools::ExpandListArgument(additionalDeps, objDeps); cmSystemTools::ExpandListArgument(additionalDeps, objDeps);
for(std::vector<std::string>::iterator odi = objDeps.begin();
odi != objDeps.end(); ++odi)
{
if (cmSystemTools::FileIsFullPath(*odi))
{
*odi = cmSystemTools::CollapseFullPath(*odi);
}
}
this->FollowNames(objDeps); this->FollowNames(objDeps);
} }

View File

@ -600,6 +600,14 @@ cmNinjaTargetGenerator
if(const char* objectDeps = source->GetProperty("OBJECT_DEPENDS")) { if(const char* objectDeps = source->GetProperty("OBJECT_DEPENDS")) {
std::vector<std::string> depList; std::vector<std::string> depList;
cmSystemTools::ExpandListArgument(objectDeps, depList); cmSystemTools::ExpandListArgument(objectDeps, depList);
for(std::vector<std::string>::iterator odi = depList.begin();
odi != depList.end(); ++odi)
{
if (cmSystemTools::FileIsFullPath(*odi))
{
*odi = cmSystemTools::CollapseFullPath(*odi);
}
}
std::transform(depList.begin(), depList.end(), std::transform(depList.begin(), depList.end(),
std::back_inserter(implicitDeps), MapToNinjaPath()); std::back_inserter(implicitDeps), MapToNinjaPath());
} }

View File

@ -153,6 +153,19 @@ add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/foo.c
${PROJECT_BINARY_DIR}/foo.c ${PROJECT_BINARY_DIR}/foo.c
) )
# Test using OBJECT_DEPENDS to bring in a custom command.
# Use a path that can be simplified to make sure paths
# are consistently normalized.
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/subdir/../subdir/subdir.h
COMMAND ${CMAKE_COMMAND} -E copy
${CMAKE_CURRENT_SOURCE_DIR}/subdir.h.in
${CMAKE_CURRENT_BINARY_DIR}/subdir/subdir.h
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/subdir.h.in
)
set_property(SOURCE ${PROJECT_BINARY_DIR}/foo.c PROPERTY
OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/subdir/../subdir/subdir.h)
# Add custom command to generate not_included.h, which is a header # Add custom command to generate not_included.h, which is a header
# file that is not included by any source in this project. This will # file that is not included by any source in this project. This will
# test whether all custom command outputs explicitly listed as sources # test whether all custom command outputs explicitly listed as sources

View File

@ -7,6 +7,11 @@
int generated(); int generated();
int wrapped(); int wrapped();
#include "subdir/subdir.h"
#ifndef SUBDIR_DEF
# error SUBDIR_DEF not defined
#endif
int main () int main ()
{ {
if (generated()*wrapped()*doc() == 3*5*7) if (generated()*wrapped()*doc() == 3*5*7)

View File

@ -0,0 +1 @@
#define SUBDIR_DEF