ENH: Adding cleaning of custom command outputs during "make clean".
This commit is contained in:
parent
5798510cc7
commit
4931afd89d
|
@ -46,10 +46,6 @@
|
||||||
// TODO: Add "help" target.
|
// TODO: Add "help" target.
|
||||||
// TODO: Identify remaining relative path violations.
|
// TODO: Identify remaining relative path violations.
|
||||||
// TODO: Need test for separate executable/library output path.
|
// TODO: Need test for separate executable/library output path.
|
||||||
// TODO: Add registered files for cleaning:
|
|
||||||
// $(GENERATED_QT_FILES) $(GENERATED_FLTK_FILES)
|
|
||||||
// What about cleaning custom command outputs?
|
|
||||||
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
cmLocalUnixMakefileGenerator2::cmLocalUnixMakefileGenerator2()
|
cmLocalUnixMakefileGenerator2::cmLocalUnixMakefileGenerator2()
|
||||||
|
@ -706,6 +702,35 @@ cmLocalUnixMakefileGenerator2
|
||||||
preEcho += "...";
|
preEcho += "...";
|
||||||
this->WriteMakeRule(ruleFileStream, comment, preEcho.c_str(),
|
this->WriteMakeRule(ruleFileStream, comment, preEcho.c_str(),
|
||||||
cc.GetOutput().c_str(), depends, commands);
|
cc.GetOutput().c_str(), depends, commands);
|
||||||
|
|
||||||
|
// Write the clean rule for this custom command.
|
||||||
|
std::string cleanTarget = customName;
|
||||||
|
cleanTarget += ".clean";
|
||||||
|
commands.clear();
|
||||||
|
depends.clear();
|
||||||
|
std::vector<std::string> cleanFiles;
|
||||||
|
cleanFiles.push_back(cc.GetOutput().c_str());
|
||||||
|
this->AppendCleanCommand(commands, cleanFiles);
|
||||||
|
this->WriteMakeRule(ruleFileStream,
|
||||||
|
"Clean the output of this custom command.", 0,
|
||||||
|
cleanTarget.c_str(), depends, commands);
|
||||||
|
|
||||||
|
// Check whether to attach the clean rule.
|
||||||
|
bool attach = true;
|
||||||
|
if(const char* clean_no_custom =
|
||||||
|
m_Makefile->GetProperty("CLEAN_NO_CUSTOM"))
|
||||||
|
{
|
||||||
|
if(!cmSystemTools::IsOff(clean_no_custom))
|
||||||
|
{
|
||||||
|
attach = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Attach the clean rule to the directory-level clean rule.
|
||||||
|
if(attach)
|
||||||
|
{
|
||||||
|
this->WriteLocalRule(ruleFileStream, "clean", cleanTarget.c_str());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
|
@ -1797,23 +1822,17 @@ cmLocalUnixMakefileGenerator2
|
||||||
|
|
||||||
// Add a command to remove any existing files for this library.
|
// Add a command to remove any existing files for this library.
|
||||||
std::vector<std::string> cleanFiles;
|
std::vector<std::string> cleanFiles;
|
||||||
std::string remove = "$(CMAKE_COMMAND) -E remove -f ";
|
cleanFiles.push_back(targetFullPathReal);
|
||||||
remove += targetOutPathReal;
|
|
||||||
cleanFiles.push_back(targetOutPathReal);
|
|
||||||
if(targetOutPathSO != targetOutPathReal)
|
if(targetOutPathSO != targetOutPathReal)
|
||||||
{
|
{
|
||||||
remove += " ";
|
cleanFiles.push_back(targetFullPathSO);
|
||||||
remove += targetOutPathSO;
|
|
||||||
cleanFiles.push_back(targetOutPathSO);
|
|
||||||
}
|
}
|
||||||
if(targetOutPath != targetOutPathSO &&
|
if(targetOutPath != targetOutPathSO &&
|
||||||
targetOutPath != targetOutPathReal)
|
targetOutPath != targetOutPathReal)
|
||||||
{
|
{
|
||||||
remove += " ";
|
cleanFiles.push_back(targetFullPath);
|
||||||
remove += targetOutPath;
|
|
||||||
cleanFiles.push_back(targetOutPath);
|
|
||||||
}
|
}
|
||||||
commands.push_back(remove);
|
this->AppendCleanCommand(commands, cleanFiles);
|
||||||
|
|
||||||
// TODO: Pre-build and pre-link rules.
|
// TODO: Pre-build and pre-link rules.
|
||||||
|
|
||||||
|
@ -2008,14 +2027,7 @@ cmLocalUnixMakefileGenerator2
|
||||||
cleanTarget += ".clean";
|
cleanTarget += ".clean";
|
||||||
|
|
||||||
// Construct the clean command.
|
// Construct the clean command.
|
||||||
std::string remove = "$(CMAKE_COMMAND) -E remove -f";
|
this->AppendCleanCommand(commands, files);
|
||||||
for(std::vector<std::string>::const_iterator f = files.begin();
|
|
||||||
f != files.end(); ++f)
|
|
||||||
{
|
|
||||||
remove += " ";
|
|
||||||
remove += *f;
|
|
||||||
}
|
|
||||||
commands.push_back(remove);
|
|
||||||
|
|
||||||
// Write the rule.
|
// Write the rule.
|
||||||
this->WriteMakeRule(ruleFileStream, 0, 0, cleanTarget.c_str(),
|
this->WriteMakeRule(ruleFileStream, 0, 0, cleanTarget.c_str(),
|
||||||
|
@ -2110,16 +2122,9 @@ cmLocalUnixMakefileGenerator2
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Have extra files to clean. Write the action to remove them.
|
// Have extra files to clean. Write the action to remove them.
|
||||||
std::string remove = "$(CMAKE_COMMAND) -E remove -f";
|
|
||||||
for(std::vector<std::string>::iterator i = files.begin();
|
|
||||||
i != files.end(); ++i)
|
|
||||||
{
|
|
||||||
remove += " ";
|
|
||||||
remove += this->ConvertToRelativeOutputPath(i->c_str());
|
|
||||||
}
|
|
||||||
std::vector<std::string> no_depends;
|
std::vector<std::string> no_depends;
|
||||||
std::vector<std::string> commands;
|
std::vector<std::string> commands;
|
||||||
commands.push_back(remove);
|
this->AppendCleanCommand(commands, files);
|
||||||
this->WriteMakeRule(makefileStream,
|
this->WriteMakeRule(makefileStream,
|
||||||
"Clean extra files in this directory.", 0,
|
"Clean extra files in this directory.", 0,
|
||||||
"clean.local", no_depends, commands);
|
"clean.local", no_depends, commands);
|
||||||
|
@ -2719,6 +2724,25 @@ cmLocalUnixMakefileGenerator2
|
||||||
commands.push_back(cmd);
|
commands.push_back(cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void
|
||||||
|
cmLocalUnixMakefileGenerator2
|
||||||
|
::AppendCleanCommand(std::vector<std::string>& commands,
|
||||||
|
const std::vector<std::string>& files)
|
||||||
|
{
|
||||||
|
if(!files.empty())
|
||||||
|
{
|
||||||
|
std::string remove = "$(CMAKE_COMMAND) -E remove -f";
|
||||||
|
for(std::vector<std::string>::const_iterator f = files.begin();
|
||||||
|
f != files.end(); ++f)
|
||||||
|
{
|
||||||
|
remove += " ";
|
||||||
|
remove += this->ConvertToRelativeOutputPath(f->c_str());
|
||||||
|
}
|
||||||
|
commands.push_back(remove);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
std::string
|
std::string
|
||||||
cmLocalUnixMakefileGenerator2
|
cmLocalUnixMakefileGenerator2
|
||||||
|
|
|
@ -180,6 +180,8 @@ protected:
|
||||||
const std::vector<cmCustomCommand>& ccs);
|
const std::vector<cmCustomCommand>& ccs);
|
||||||
void AppendCustomCommand(std::vector<std::string>& commands,
|
void AppendCustomCommand(std::vector<std::string>& commands,
|
||||||
const cmCustomCommand& cc);
|
const cmCustomCommand& cc);
|
||||||
|
void AppendCleanCommand(std::vector<std::string>& commands,
|
||||||
|
const std::vector<std::string>& files);
|
||||||
std::string GetRecursiveMakeCall(const char* tgt);
|
std::string GetRecursiveMakeCall(const char* tgt);
|
||||||
void WriteJumpAndBuildRules(std::ostream& makefileStream);
|
void WriteJumpAndBuildRules(std::ostream& makefileStream);
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,6 @@ TRY_COMPILE(TOCLEAN_BUILT
|
||||||
${MakeClean_BINARY_DIR}/ToClean
|
${MakeClean_BINARY_DIR}/ToClean
|
||||||
${MakeClean_SOURCE_DIR}/ToClean
|
${MakeClean_SOURCE_DIR}/ToClean
|
||||||
ToClean
|
ToClean
|
||||||
toclean
|
|
||||||
OUTPUT_VARIABLE OUTPUT
|
OUTPUT_VARIABLE OUTPUT
|
||||||
)
|
)
|
||||||
IF(TOCLEAN_BUILT)
|
IF(TOCLEAN_BUILT)
|
||||||
|
|
|
@ -5,10 +5,13 @@ ADD_EXECUTABLE(toclean toclean.cxx)
|
||||||
|
|
||||||
# List some build-time-generated files.
|
# List some build-time-generated files.
|
||||||
GET_TARGET_PROPERTY(TOCLEAN_FILES toclean LOCATION)
|
GET_TARGET_PROPERTY(TOCLEAN_FILES toclean LOCATION)
|
||||||
SET(TOCLEAN_FILES ${TOCLEAN_FILES}
|
IF(CMAKE_GENERATOR_NEW)
|
||||||
"${ToClean_BINARY_DIR}/toclean${CMAKE_CXX_OUTPUT_EXTENSION}")
|
SET(TOCLEAN_FILES ${TOCLEAN_FILES}
|
||||||
#SET(TOCLEAN_FILES ${TOCLEAN_FILES}
|
"${ToClean_BINARY_DIR}/toclean.dir/toclean${CMAKE_CXX_OUTPUT_EXTENSION}")
|
||||||
# "${ToClean_BINARY_DIR}/toclean.dir/toclean${CMAKE_CXX_OUTPUT_EXTENSION}")
|
ELSE(CMAKE_GENERATOR_NEW)
|
||||||
|
SET(TOCLEAN_FILES ${TOCLEAN_FILES}
|
||||||
|
"${ToClean_BINARY_DIR}/toclean${CMAKE_CXX_OUTPUT_EXTENSION}")
|
||||||
|
ENDIF(CMAKE_GENERATOR_NEW)
|
||||||
|
|
||||||
# Create a file that must be registered for cleaning.
|
# Create a file that must be registered for cleaning.
|
||||||
FILE(WRITE "${ToClean_BINARY_DIR}/Registered.txt"
|
FILE(WRITE "${ToClean_BINARY_DIR}/Registered.txt"
|
||||||
|
@ -17,6 +20,18 @@ SET_DIRECTORY_PROPERTIES(PROPERTIES
|
||||||
ADDITIONAL_MAKE_CLEAN_FILES "${ToClean_BINARY_DIR}/Registered.txt")
|
ADDITIONAL_MAKE_CLEAN_FILES "${ToClean_BINARY_DIR}/Registered.txt")
|
||||||
SET(TOCLEAN_FILES ${TOCLEAN_FILES} "${ToClean_BINARY_DIR}/Registered.txt")
|
SET(TOCLEAN_FILES ${TOCLEAN_FILES} "${ToClean_BINARY_DIR}/Registered.txt")
|
||||||
|
|
||||||
|
# Create a custom command whose output should be cleaned.
|
||||||
|
IF(CMAKE_GENERATOR_NEW)
|
||||||
|
ADD_CUSTOM_COMMAND(OUTPUT ${ToClean_BINARY_DIR}/generated.txt
|
||||||
|
DEPENDS ${ToClean_SOURCE_DIR}/toclean.cxx
|
||||||
|
COMMAND ${CMAKE_COMMAND}
|
||||||
|
ARGS -E copy ${ToClean_SOURCE_DIR}/toclean.cxx
|
||||||
|
${ToClean_BINARY_DIR}/generated.txt
|
||||||
|
)
|
||||||
|
ADD_CUSTOM_TARGET(generate ALL DEPENDS ${ToClean_BINARY_DIR}/generated.txt)
|
||||||
|
SET(TOCLEAN_FILES ${TOCLEAN_FILES} "${ToClean_BINARY_DIR}/generated.txt")
|
||||||
|
ENDIF(CMAKE_GENERATOR_NEW)
|
||||||
|
|
||||||
# Configure a file listing these build-time-generated files.
|
# Configure a file listing these build-time-generated files.
|
||||||
CONFIGURE_FILE(${ToClean_SOURCE_DIR}/ToCleanFiles.cmake.in
|
CONFIGURE_FILE(${ToClean_SOURCE_DIR}/ToCleanFiles.cmake.in
|
||||||
${ToClean_BINARY_DIR}/ToCleanFiles.cmake @ONLY IMMEDIATE)
|
${ToClean_BINARY_DIR}/ToCleanFiles.cmake @ONLY IMMEDIATE)
|
||||||
|
|
|
@ -3,6 +3,10 @@
|
||||||
#
|
#
|
||||||
PROJECT (Wrapping)
|
PROJECT (Wrapping)
|
||||||
|
|
||||||
|
# Disable cleaning of custom command outputs to preserve the hacks
|
||||||
|
# used to generate the files using CONFIGURE_FILE.
|
||||||
|
SET_DIRECTORY_PROPERTIES(PROPERTIES CLEAN_NO_CUSTOM 1)
|
||||||
|
|
||||||
#
|
#
|
||||||
# Lib and exe path
|
# Lib and exe path
|
||||||
#
|
#
|
||||||
|
|
Loading…
Reference in New Issue