diff options
author | Ben Boeckel <ben.boeckel@kitware.com> | 2023-02-02 21:06:46 (GMT) |
---|---|---|
committer | Ben Boeckel <ben.boeckel@kitware.com> | 2023-08-17 18:42:53 (GMT) |
commit | 9840bfdab0542fdbecc3787fb6cad9f4fb861519 (patch) | |
tree | 25761719883aabd22f528d37c5141706a8a6491b /Source/cmDyndepCollation.cxx | |
parent | caf5971c8a628b29c2d5c56cb08cbe54b0449f35 (diff) | |
download | CMake-9840bfdab0542fdbecc3787fb6cad9f4fb861519.zip CMake-9840bfdab0542fdbecc3787fb6cad9f4fb861519.tar.gz CMake-9840bfdab0542fdbecc3787fb6cad9f4fb861519.tar.bz2 |
cmDyndepCollation: support BMI-only collation
Diffstat (limited to 'Source/cmDyndepCollation.cxx')
-rw-r--r-- | Source/cmDyndepCollation.cxx | 38 |
1 files changed, 30 insertions, 8 deletions
diff --git a/Source/cmDyndepCollation.cxx b/Source/cmDyndepCollation.cxx index 80e1357..bdf6b44 100644 --- a/Source/cmDyndepCollation.cxx +++ b/Source/cmDyndepCollation.cxx @@ -73,20 +73,36 @@ Json::Value CollationInformationCxxModules( gt->LocalGenerator, config, gt); } - std::map<std::string, cmSourceFile const*> sf_map; + enum class CompileType { - std::vector<cmSourceFile const*> objectSources; - gt->GetObjectSources(objectSources, config); - for (auto const* sf : objectSources) { + ObjectAndBmi, + BmiOnly, + }; + std::map<std::string, std::pair<cmSourceFile const*, CompileType>> sf_map; + { + auto fill_sf_map = [gt, tgt, &sf_map](cmSourceFile const* sf, + CompileType type) { auto full_path = sf->GetFullPath(); if (full_path.empty()) { gt->Makefile->IssueMessage( MessageType::INTERNAL_ERROR, cmStrCat("Target \"", tgt->GetName(), "\" has a full path-less source file.")); - continue; + return; } - sf_map[full_path] = sf; + sf_map[full_path] = std::make_pair(sf, type); + }; + + std::vector<cmSourceFile const*> objectSources; + gt->GetObjectSources(objectSources, config); + for (auto const* sf : objectSources) { + fill_sf_map(sf, CompileType::ObjectAndBmi); + } + + std::vector<cmSourceFile const*> cxxModuleSources; + gt->GetCxxModuleSources(cxxModuleSources, config); + for (auto const* sf : cxxModuleSources) { + fill_sf_map(sf, CompileType::BmiOnly); } } @@ -113,7 +129,8 @@ Json::Value CollationInformationCxxModules( continue; } - auto const* sf = lookup->second; + auto const* sf = lookup->second.first; + CompileType const ct = lookup->second.second; if (!sf) { gt->Makefile->IssueMessage( @@ -123,11 +140,14 @@ Json::Value CollationInformationCxxModules( continue; } - auto obj_path = cb.ObjectFilePath(sf, config); + auto obj_path = ct == CompileType::ObjectAndBmi + ? cb.ObjectFilePath(sf, config) + : cb.BmiFilePath(sf, config); Json::Value& tdi_module_info = tdi_cxx_module_info[obj_path] = Json::objectValue; tdi_module_info["source"] = file; + tdi_module_info["bmi-only"] = ct == CompileType::BmiOnly; tdi_module_info["relative-directory"] = files_per_dir.first; tdi_module_info["name"] = file_set->GetName(); tdi_module_info["type"] = file_set->GetType(); @@ -269,6 +289,7 @@ void cmDyndepCollation::AddCollationInformation( struct CxxModuleFileSet { std::string Name; + bool BmiOnly; std::string RelativeDirectory; std::string SourcePath; std::string Type; @@ -356,6 +377,7 @@ cmDyndepCollation::ParseExportInfo(Json::Value const& tdi) CxxModuleFileSet& fsi = export_info->ObjectToFileSet[i.key().asString()]; auto const& tdi_cxx_module_info = *i; fsi.Name = tdi_cxx_module_info["name"].asString(); + fsi.BmiOnly = tdi_cxx_module_info["bmi-only"].asBool(); fsi.RelativeDirectory = tdi_cxx_module_info["relative-directory"].asString(); if (!fsi.RelativeDirectory.empty() && |