diff options
author | Ben Boeckel <ben.boeckel@kitware.com> | 2023-02-10 22:52:17 (GMT) |
---|---|---|
committer | Ben Boeckel <ben.boeckel@kitware.com> | 2023-02-10 23:03:15 (GMT) |
commit | 0ace6053e8a09656f2548697a8c61b9ad60a3cad (patch) | |
tree | 0f80b791bee9cf6a9e3d0325920dbb1779c1c249 | |
parent | b215cbc07d997b19ad8c02b2159eb0538be6dee3 (diff) | |
download | CMake-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.cxx | 27 | ||||
-rw-r--r-- | Source/cmNinjaTargetGenerator.h | 15 |
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; |