Handle relative WORKING_DIRECTORY in add_custom_(command|target)

This also fixes handling of trailing slashes in the directory name.
This commit is contained in:
Brad King 2011-01-26 16:32:17 -05:00
parent 7befc00783
commit 88548a45fb
5 changed files with 28 additions and 2 deletions

View File

@ -286,6 +286,13 @@ bool cmAddCustomCommandCommand
return false; return false;
} }
// Convert working directory to a full path.
if(!working.empty())
{
const char* build_dir = this->Makefile->GetCurrentOutputDirectory();
working = cmSystemTools::CollapseFullPath(working.c_str(), build_dir);
}
// Choose which mode of the command to use. // Choose which mode of the command to use.
bool escapeOldStyle = !verbatim; bool escapeOldStyle = !verbatim;
if(source.empty() && output.empty()) if(source.empty() && output.empty())

View File

@ -110,6 +110,8 @@ public:
"will be treated as PRE_LINK.\n" "will be treated as PRE_LINK.\n"
"If WORKING_DIRECTORY is specified the command will be executed " "If WORKING_DIRECTORY is specified the command will be executed "
"in the directory given. " "in the directory given. "
"If it is a relative path it will be interpreted relative to the "
"build tree directory corresponding to the current source directory. "
"If COMMENT is set, the value will be displayed as a " "If COMMENT is set, the value will be displayed as a "
"message before the commands are executed at build time. " "message before the commands are executed at build time. "
"If APPEND is specified the COMMAND and DEPENDS option values " "If APPEND is specified the COMMAND and DEPENDS option values "

View File

@ -166,6 +166,14 @@ bool cmAddCustomTargetCommand
} }
} }
// Convert working directory to a full path.
if(!working_directory.empty())
{
const char* build_dir = this->Makefile->GetCurrentOutputDirectory();
working_directory =
cmSystemTools::CollapseFullPath(working_directory.c_str(), build_dir);
}
// Add the utility target to the makefile. // Add the utility target to the makefile.
bool escapeOldStyle = !verbatim; bool escapeOldStyle = !verbatim;
cmTarget* target = cmTarget* target =

View File

@ -79,6 +79,8 @@ public:
"empty target will be created. " "empty target will be created. "
"If WORKING_DIRECTORY is set, then the command will be run in that " "If WORKING_DIRECTORY is set, then the command will be run in that "
"directory. " "directory. "
"If it is a relative path it will be interpreted relative to the "
"build tree directory corresponding to the current source directory. "
"If COMMENT is set, the value will be displayed as a " "If COMMENT is set, the value will be displayed as a "
"message before the commands are executed at build time. " "message before the commands are executed at build time. "
"Dependencies listed with the DEPENDS argument may reference files " "Dependencies listed with the DEPENDS argument may reference files "

View File

@ -10,6 +10,7 @@ ADD_CUSTOM_COMMAND(
SET_SOURCE_FILES_PROPERTIES( SET_SOURCE_FILES_PROPERTIES(
"${TestWorkingDir_BINARY_DIR}/customTarget.c" "${TestWorkingDir_BINARY_DIR}/customTarget.c"
"${TestWorkingDir_BINARY_DIR}/customTarget2.c"
PROPERTIES GENERATED 1) PROPERTIES GENERATED 1)
ADD_EXECUTABLE(working "${TestWorkingDir_BINARY_DIR}/working.c" ADD_EXECUTABLE(working "${TestWorkingDir_BINARY_DIR}/working.c"
@ -28,8 +29,14 @@ add_custom_command(
OUTPUT working2.c # Relative to build tree OUTPUT working2.c # Relative to build tree
COMMAND "${CMAKE_COMMAND}" -E copy ${TestWorkingDir_SOURCE_DIR}/working.c.in ../working2.c COMMAND "${CMAKE_COMMAND}" -E copy ${TestWorkingDir_SOURCE_DIR}/working.c.in ../working2.c
DEPENDS ${TestWorkingDir_SOURCE_DIR}/working.c.in/ # trailing slash should be removed DEPENDS ${TestWorkingDir_SOURCE_DIR}/working.c.in/ # trailing slash should be removed
WORKING_DIRECTORY ${TestWorkingDir_BINARY_DIR}/work WORKING_DIRECTORY work/ # Relative to build tree, trailing slash
) )
add_executable(working2 working2.c ${TestWorkingDir_BINARY_DIR}/customTarget.c) add_executable(working2 working2.c ${TestWorkingDir_BINARY_DIR}/customTarget2.c)
add_custom_target(
Custom2 ALL
COMMAND "${CMAKE_COMMAND}" -E copy_if_different ${TestWorkingDir_SOURCE_DIR}/customTarget.c ../customTarget2.c
WORKING_DIRECTORY work/ # Relative to build tree, trailing slash
)
add_dependencies(working2 Custom2) add_dependencies(working2 Custom2)