summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Boeckel <ben.boeckel@kitware.com>2023-02-10 22:52:17 (GMT)
committerBen Boeckel <ben.boeckel@kitware.com>2023-02-10 23:03:15 (GMT)
commit0ace6053e8a09656f2548697a8c61b9ad60a3cad (patch)
tree0f80b791bee9cf6a9e3d0325920dbb1779c1c249
parentb215cbc07d997b19ad8c02b2159eb0538be6dee3 (diff)
downloadCMake-0ace6053e8a09656f2548697a8c61b9ad60a3cad.zip
CMake-0ace6053e8a09656f2548697a8c61b9ad60a3cad.tar.gz
CMake-0ace6053e8a09656f2548697a8c61b9ad60a3cad.tar.bz2
Ninja: track modmap dependencies properly
Mark modmaps as outputs of the collation step.
-rw-r--r--Source/cmNinjaTargetGenerator.cxx27
-rw-r--r--Source/cmNinjaTargetGenerator.h15
2 files changed, 33 insertions, 9 deletions
diff --git a/Source/cmNinjaTargetGenerator.cxx b/Source/cmNinjaTargetGenerator.cxx
index da74fad..6f9bdbd 100644
--- a/Source/cmNinjaTargetGenerator.cxx
+++ b/Source/cmNinjaTargetGenerator.cxx
@@ -1140,13 +1140,20 @@ void cmNinjaTargetGenerator::WriteObjectBuildStatements(
}
}
- for (auto const& langDDIFiles : this->Configs[config].DDIFiles) {
- std::string const& language = langDDIFiles.first;
- cmNinjaDeps const& ddiFiles = langDDIFiles.second;
+ for (auto const& langScanningFiles : this->Configs[config].ScanningInfo) {
+ std::string const& language = langScanningFiles.first;
+ std::vector<ScanningFiles> const& scanningFiles = langScanningFiles.second;
cmNinjaBuild build(this->LanguageDyndepRule(language, config));
build.Outputs.push_back(this->GetDyndepFilePath(language, config));
- build.ExplicitDeps = ddiFiles;
+ for (auto const& scanFiles : scanningFiles) {
+ if (!scanFiles.ScanningOutput.empty()) {
+ build.ExplicitDeps.push_back(scanFiles.ScanningOutput);
+ }
+ if (!scanFiles.ModuleMapFile.empty()) {
+ build.ImplicitOuts.push_back(scanFiles.ModuleMapFile);
+ }
+ }
this->WriteTargetDependInfo(language, config);
@@ -1493,9 +1500,10 @@ void cmNinjaTargetGenerator::WriteObjectBuildStatement(
vars["INCLUDES"] = cmStrCat(sourceDirectoryFlag, ' ', vars["INCLUDES"]);
}
+ ScanningFiles scanningFiles;
+
if (firstForConfig) {
- std::string const ddiFile = cmStrCat(objectFileName, ".ddi");
- this->Configs[config].DDIFiles[language].push_back(ddiFile);
+ scanningFiles.ScanningOutput = cmStrCat(objectFileName, ".ddi");
}
this->addPoolNinjaVariable("JOB_POOL_COMPILE", this->GetGeneratorTarget(),
@@ -1512,9 +1520,14 @@ void cmNinjaTargetGenerator::WriteObjectBuildStatement(
// XXX(modmap): If changing this path construction, change
// `cmGlobalNinjaGenerator::WriteDyndep` to expect the corresponding file
// path.
- std::string const ddModmapFile = cmStrCat(objectFileName, ".modmap");
+ std::string ddModmapFile = cmStrCat(objectFileName, ".modmap");
vars["DYNDEP_MODULE_MAP_FILE"] = ddModmapFile;
objBuild.OrderOnlyDeps.push_back(ddModmapFile);
+ scanningFiles.ModuleMapFile = std::move(ddModmapFile);
+ }
+
+ if (!scanningFiles.IsEmpty()) {
+ this->Configs[config].ScanningInfo[language].emplace_back(scanningFiles);
}
}
diff --git a/Source/cmNinjaTargetGenerator.h b/Source/cmNinjaTargetGenerator.h
index 8bf7986..8f4a764 100644
--- a/Source/cmNinjaTargetGenerator.h
+++ b/Source/cmNinjaTargetGenerator.h
@@ -222,12 +222,23 @@ protected:
private:
cmLocalNinjaGenerator* LocalGenerator;
+ struct ScanningFiles
+ {
+ bool IsEmpty() const
+ {
+ return this->ScanningOutput.empty() && this->ModuleMapFile.empty();
+ }
+
+ std::string ScanningOutput;
+ std::string ModuleMapFile;
+ };
+
struct ByConfig
{
/// List of object files for this target.
cmNinjaDeps Objects;
- // Fortran Support
- std::map<std::string, cmNinjaDeps> DDIFiles;
+ // Dyndep Support
+ std::map<std::string, std::vector<ScanningFiles>> ScanningInfo;
// Swift Support
Json::Value SwiftOutputMap;
std::vector<cmCustomCommand const*> CustomCommands;