mirror of
https://github.com/Kitware/CMake.git
synced 2026-01-05 21:31:08 -06:00
Ninja: Add support for additional clean files
Additional clean files for the Ninja generator can be registered via the new method `cmGlobalNinjaGenerator::AddAdditionalCleanFile`. If there are additional clean files, a new rule `CLEAN_ADDITIONAL` and a new build target `CMakeFiles/clean.additional` get generated. The `clean` target will depend on `CMakeFiles/clean.additional`, if the target exists.
This commit is contained in:
@@ -852,6 +852,11 @@ std::string const& cmGlobalNinjaGenerator::ConvertToNinjaPath(
|
|||||||
.first->second;
|
.first->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void cmGlobalNinjaGenerator::AddAdditionalCleanFile(std::string fileName)
|
||||||
|
{
|
||||||
|
this->AdditionalCleanFiles.emplace(std::move(fileName));
|
||||||
|
}
|
||||||
|
|
||||||
void cmGlobalNinjaGenerator::AddCXXCompileCommand(
|
void cmGlobalNinjaGenerator::AddCXXCompileCommand(
|
||||||
const std::string& commandLine, const std::string& sourceFile)
|
const std::string& commandLine, const std::string& sourceFile)
|
||||||
{
|
{
|
||||||
@@ -1464,8 +1469,80 @@ bool cmGlobalNinjaGenerator::SupportsMultilineDepfile() const
|
|||||||
return this->NinjaSupportsMultilineDepfile;
|
return this->NinjaSupportsMultilineDepfile;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool cmGlobalNinjaGenerator::WriteTargetCleanAdditional(std::ostream& os)
|
||||||
|
{
|
||||||
|
cmLocalGenerator* lgr = this->LocalGenerators.at(0);
|
||||||
|
std::string cleanScriptRel = "CMakeFiles/clean_additional.cmake";
|
||||||
|
std::string cleanScriptAbs = lgr->GetBinaryDirectory();
|
||||||
|
cleanScriptAbs += '/';
|
||||||
|
cleanScriptAbs += cleanScriptRel;
|
||||||
|
|
||||||
|
// Check if there are additional files to clean
|
||||||
|
if (this->AdditionalCleanFiles.empty()) {
|
||||||
|
// Remove cmake clean script file if it exists
|
||||||
|
cmSystemTools::RemoveFile(cleanScriptAbs);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Write cmake clean script file
|
||||||
|
{
|
||||||
|
cmGeneratedFileStream fout(cleanScriptAbs);
|
||||||
|
if (!fout) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
fout << "# Additional clean files\n\n";
|
||||||
|
fout << "file(REMOVE_RECURSE\n";
|
||||||
|
for (std::string const& acf : this->AdditionalCleanFiles) {
|
||||||
|
fout << " "
|
||||||
|
<< cmOutputConverter::EscapeForCMake(ConvertToNinjaPath(acf))
|
||||||
|
<< '\n';
|
||||||
|
}
|
||||||
|
fout << ")\n";
|
||||||
|
}
|
||||||
|
// Register clean script file
|
||||||
|
lgr->GetMakefile()->AddCMakeOutputFile(cleanScriptAbs);
|
||||||
|
|
||||||
|
// Write rule
|
||||||
|
{
|
||||||
|
std::string cmd = CMakeCmd();
|
||||||
|
cmd += " -P ";
|
||||||
|
cmd += lgr->ConvertToOutputFormat(this->NinjaOutputPath(cleanScriptRel),
|
||||||
|
cmOutputConverter::SHELL);
|
||||||
|
WriteRule(*this->RulesFileStream, "CLEAN_ADDITIONAL", cmd,
|
||||||
|
"Cleaning additional files...",
|
||||||
|
"Rule for cleaning additional files.",
|
||||||
|
/*depfile=*/"",
|
||||||
|
/*deptype=*/"",
|
||||||
|
/*rspfile=*/"",
|
||||||
|
/*rspcontent*/ "",
|
||||||
|
/*restat=*/"",
|
||||||
|
/*generator=*/false);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Write build
|
||||||
|
{
|
||||||
|
cmNinjaDeps outputs;
|
||||||
|
outputs.emplace_back(
|
||||||
|
this->NinjaOutputPath(this->GetAdditionalCleanTargetName()));
|
||||||
|
WriteBuild(os, "Clean additional files.", "CLEAN_ADDITIONAL",
|
||||||
|
/*outputs=*/outputs,
|
||||||
|
/*implicitOuts=*/cmNinjaDeps(),
|
||||||
|
/*explicitDeps=*/cmNinjaDeps(),
|
||||||
|
/*implicitDeps=*/cmNinjaDeps(),
|
||||||
|
/*orderOnlyDeps=*/cmNinjaDeps(),
|
||||||
|
/*variables=*/cmNinjaVars());
|
||||||
|
}
|
||||||
|
// Return success
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void cmGlobalNinjaGenerator::WriteTargetClean(std::ostream& os)
|
void cmGlobalNinjaGenerator::WriteTargetClean(std::ostream& os)
|
||||||
{
|
{
|
||||||
|
// -- Additional clean target
|
||||||
|
bool additionalFiles = WriteTargetCleanAdditional(os);
|
||||||
|
|
||||||
|
// -- Default clean target
|
||||||
|
// Write rule
|
||||||
WriteRule(*this->RulesFileStream, "CLEAN", NinjaCmd() + " -t clean",
|
WriteRule(*this->RulesFileStream, "CLEAN", NinjaCmd() + " -t clean",
|
||||||
"Cleaning all built files...",
|
"Cleaning all built files...",
|
||||||
"Rule for cleaning all built files.",
|
"Rule for cleaning all built files.",
|
||||||
@@ -1475,13 +1552,24 @@ void cmGlobalNinjaGenerator::WriteTargetClean(std::ostream& os)
|
|||||||
/*rspcontent*/ "",
|
/*rspcontent*/ "",
|
||||||
/*restat=*/"",
|
/*restat=*/"",
|
||||||
/*generator=*/false);
|
/*generator=*/false);
|
||||||
WriteBuild(os, "Clean all the built files.", "CLEAN",
|
|
||||||
/*outputs=*/cmNinjaDeps(1, this->NinjaOutputPath("clean")),
|
// Write build
|
||||||
/*implicitOuts=*/cmNinjaDeps(),
|
{
|
||||||
/*explicitDeps=*/cmNinjaDeps(),
|
cmNinjaDeps explicitDeps;
|
||||||
/*implicitDeps=*/cmNinjaDeps(),
|
if (additionalFiles) {
|
||||||
/*orderOnlyDeps=*/cmNinjaDeps(),
|
explicitDeps.emplace_back(
|
||||||
/*variables=*/cmNinjaVars());
|
this->NinjaOutputPath(this->GetAdditionalCleanTargetName()));
|
||||||
|
}
|
||||||
|
cmNinjaDeps outputs;
|
||||||
|
outputs.emplace_back(this->NinjaOutputPath(this->GetCleanTargetName()));
|
||||||
|
WriteBuild(os, "Clean all the built files.", "CLEAN",
|
||||||
|
/*outputs=*/outputs,
|
||||||
|
/*implicitOuts=*/cmNinjaDeps(),
|
||||||
|
/*explicitDeps=*/explicitDeps,
|
||||||
|
/*implicitDeps=*/cmNinjaDeps(),
|
||||||
|
/*orderOnlyDeps=*/cmNinjaDeps(),
|
||||||
|
/*variables=*/cmNinjaVars());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void cmGlobalNinjaGenerator::WriteTargetHelp(std::ostream& os)
|
void cmGlobalNinjaGenerator::WriteTargetHelp(std::ostream& os)
|
||||||
|
|||||||
@@ -257,6 +257,13 @@ public:
|
|||||||
};
|
};
|
||||||
MapToNinjaPathImpl MapToNinjaPath() { return MapToNinjaPathImpl(this); }
|
MapToNinjaPathImpl MapToNinjaPath() { return MapToNinjaPathImpl(this); }
|
||||||
|
|
||||||
|
// -- Additional clean files
|
||||||
|
void AddAdditionalCleanFile(std::string fileName);
|
||||||
|
const char* GetAdditionalCleanTargetName() const
|
||||||
|
{
|
||||||
|
return "CMakeFiles/clean.additional";
|
||||||
|
}
|
||||||
|
|
||||||
void AddCXXCompileCommand(const std::string& commandLine,
|
void AddCXXCompileCommand(const std::string& commandLine,
|
||||||
const std::string& sourceFile);
|
const std::string& sourceFile);
|
||||||
|
|
||||||
@@ -398,6 +405,7 @@ private:
|
|||||||
void WriteBuiltinTargets(std::ostream& os);
|
void WriteBuiltinTargets(std::ostream& os);
|
||||||
void WriteTargetAll(std::ostream& os);
|
void WriteTargetAll(std::ostream& os);
|
||||||
void WriteTargetRebuildManifest(std::ostream& os);
|
void WriteTargetRebuildManifest(std::ostream& os);
|
||||||
|
bool WriteTargetCleanAdditional(std::ostream& os);
|
||||||
void WriteTargetClean(std::ostream& os);
|
void WriteTargetClean(std::ostream& os);
|
||||||
void WriteTargetHelp(std::ostream& os);
|
void WriteTargetHelp(std::ostream& os);
|
||||||
|
|
||||||
@@ -470,6 +478,7 @@ private:
|
|||||||
std::string OutputPathPrefix;
|
std::string OutputPathPrefix;
|
||||||
std::string TargetAll;
|
std::string TargetAll;
|
||||||
std::string CMakeCacheFile;
|
std::string CMakeCacheFile;
|
||||||
|
std::set<std::string> AdditionalCleanFiles;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // ! cmGlobalNinjaGenerator_h
|
#endif // ! cmGlobalNinjaGenerator_h
|
||||||
|
|||||||
Reference in New Issue
Block a user