mirror of
https://github.com/Kitware/CMake.git
synced 2026-08-04 14:50:23 +00:00
cmDyndepCollation: write out scanned source information too
This is required to fill in the `requires` field for sources using modules that do not provide them.
This commit is contained in:
@@ -39,13 +39,55 @@
|
|||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
Json::Value CollationInformationCxxModules(
|
struct TdiSourceInfo
|
||||||
cmGeneratorTarget const* gt, std::string const& config,
|
|
||||||
cmDyndepGeneratorCallbacks const& cb)
|
|
||||||
{
|
{
|
||||||
|
Json::Value Sources;
|
||||||
|
Json::Value CxxModules;
|
||||||
|
};
|
||||||
|
|
||||||
|
TdiSourceInfo CollationInformationSources(cmGeneratorTarget const* gt,
|
||||||
|
std::string const& config,
|
||||||
|
cmDyndepGeneratorCallbacks const& cb)
|
||||||
|
{
|
||||||
|
TdiSourceInfo info;
|
||||||
cmTarget const* tgt = gt->Target;
|
cmTarget const* tgt = gt->Target;
|
||||||
auto all_file_sets = tgt->GetAllFileSetNames();
|
auto all_file_sets = tgt->GetAllFileSetNames();
|
||||||
Json::Value tdi_cxx_module_info = Json::objectValue;
|
Json::Value& tdi_sources = info.Sources = Json::objectValue;
|
||||||
|
Json::Value& tdi_cxx_module_info = info.CxxModules = Json::objectValue;
|
||||||
|
|
||||||
|
enum class CompileType
|
||||||
|
{
|
||||||
|
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."));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (auto const& file_set_name : all_file_sets) {
|
for (auto const& file_set_name : all_file_sets) {
|
||||||
auto const* file_set = tgt->GetFileSet(file_set_name);
|
auto const* file_set = tgt->GetFileSet(file_set_name);
|
||||||
if (!file_set) {
|
if (!file_set) {
|
||||||
@@ -73,39 +115,6 @@ Json::Value CollationInformationCxxModules(
|
|||||||
gt->LocalGenerator, config, gt);
|
gt->LocalGenerator, config, gt);
|
||||||
}
|
}
|
||||||
|
|
||||||
enum class CompileType
|
|
||||||
{
|
|
||||||
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."));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Json::Value fs_dest = Json::nullValue;
|
Json::Value fs_dest = Json::nullValue;
|
||||||
for (auto const& ig : gt->Makefile->GetInstallGenerators()) {
|
for (auto const& ig : gt->Makefile->GetInstallGenerators()) {
|
||||||
if (auto const* fsg =
|
if (auto const* fsg =
|
||||||
@@ -134,6 +143,8 @@ Json::Value CollationInformationCxxModules(
|
|||||||
auto const* sf = lookup->second.first;
|
auto const* sf = lookup->second.first;
|
||||||
CompileType const ct = lookup->second.second;
|
CompileType const ct = lookup->second.second;
|
||||||
|
|
||||||
|
sf_map.erase(lookup);
|
||||||
|
|
||||||
if (!sf) {
|
if (!sf) {
|
||||||
gt->Makefile->IssueMessage(
|
gt->Makefile->IssueMessage(
|
||||||
MessageType::INTERNAL_ERROR,
|
MessageType::INTERNAL_ERROR,
|
||||||
@@ -160,7 +171,26 @@ Json::Value CollationInformationCxxModules(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return tdi_cxx_module_info;
|
for (auto const& sf_entry : sf_map) {
|
||||||
|
CompileType const ct = sf_entry.second.second;
|
||||||
|
if (ct == CompileType::BmiOnly) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto const* sf = sf_entry.second.first;
|
||||||
|
if (!gt->NeedDyndepForSource(sf->GetLanguage(), config, sf)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto full_file = cmSystemTools::CollapseFullPath(sf->GetFullPath());
|
||||||
|
auto obj_path = cb.ObjectFilePath(sf, config);
|
||||||
|
Json::Value& tdi_source_info = tdi_sources[obj_path] = Json::objectValue;
|
||||||
|
|
||||||
|
tdi_source_info["source"] = full_file;
|
||||||
|
tdi_source_info["language"] = sf->GetLanguage();
|
||||||
|
}
|
||||||
|
|
||||||
|
return info;
|
||||||
}
|
}
|
||||||
|
|
||||||
Json::Value CollationInformationBmiInstallation(cmGeneratorTarget const* gt,
|
Json::Value CollationInformationBmiInstallation(cmGeneratorTarget const* gt,
|
||||||
@@ -289,12 +319,20 @@ void cmDyndepCollation::AddCollationInformation(
|
|||||||
Json::Value& tdi, cmGeneratorTarget const* gt, std::string const& config,
|
Json::Value& tdi, cmGeneratorTarget const* gt, std::string const& config,
|
||||||
cmDyndepGeneratorCallbacks const& cb)
|
cmDyndepGeneratorCallbacks const& cb)
|
||||||
{
|
{
|
||||||
tdi["cxx-modules"] = CollationInformationCxxModules(gt, config, cb);
|
auto sourcesInfo = CollationInformationSources(gt, config, cb);
|
||||||
|
tdi["sources"] = sourcesInfo.Sources;
|
||||||
|
tdi["cxx-modules"] = sourcesInfo.CxxModules;
|
||||||
tdi["bmi-installation"] = CollationInformationBmiInstallation(gt, config);
|
tdi["bmi-installation"] = CollationInformationBmiInstallation(gt, config);
|
||||||
tdi["exports"] = CollationInformationExports(gt);
|
tdi["exports"] = CollationInformationExports(gt);
|
||||||
tdi["config"] = config;
|
tdi["config"] = config;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct SourceInfo
|
||||||
|
{
|
||||||
|
std::string SourcePath;
|
||||||
|
std::string Language;
|
||||||
|
};
|
||||||
|
|
||||||
struct CxxModuleFileSet
|
struct CxxModuleFileSet
|
||||||
{
|
{
|
||||||
std::string Name;
|
std::string Name;
|
||||||
@@ -330,6 +368,7 @@ struct CxxModuleExport
|
|||||||
|
|
||||||
struct cmCxxModuleExportInfo
|
struct cmCxxModuleExportInfo
|
||||||
{
|
{
|
||||||
|
std::map<std::string, SourceInfo> ObjectToSource;
|
||||||
std::map<std::string, CxxModuleFileSet> ObjectToFileSet;
|
std::map<std::string, CxxModuleFileSet> ObjectToFileSet;
|
||||||
cm::optional<CxxModuleBmiInstall> BmiInstallation;
|
cm::optional<CxxModuleBmiInstall> BmiInstallation;
|
||||||
std::vector<CxxModuleExport> Exports;
|
std::vector<CxxModuleExport> Exports;
|
||||||
@@ -405,6 +444,15 @@ cmDyndepCollation::ParseExportInfo(Json::Value const& tdi)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Json::Value const& tdi_sources = tdi["sources"];
|
||||||
|
if (tdi_sources.isObject()) {
|
||||||
|
for (auto i = tdi_sources.begin(); i != tdi_sources.end(); ++i) {
|
||||||
|
SourceInfo& si = export_info->ObjectToSource[i.key().asString()];
|
||||||
|
auto const& tdi_source = *i;
|
||||||
|
si.SourcePath = tdi_source["source"].asString();
|
||||||
|
si.Language = tdi_source["language"].asString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return export_info;
|
return export_info;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,5 +47,6 @@
|
|||||||
"language": "CXX",
|
"language": "CXX",
|
||||||
"forward-modules-from-target-dirs": [],
|
"forward-modules-from-target-dirs": [],
|
||||||
"linked-target-dirs": [],
|
"linked-target-dirs": [],
|
||||||
"module-dir": "<BINARY_DIR>/CMakeFiles/ninja-bmi-install-private.dir<CONFIG_DIR>"
|
"module-dir": "<BINARY_DIR>/CMakeFiles/ninja-bmi-install-private.dir<CONFIG_DIR>",
|
||||||
|
"sources": {}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,5 +47,6 @@
|
|||||||
"language": "CXX",
|
"language": "CXX",
|
||||||
"forward-modules-from-target-dirs": [],
|
"forward-modules-from-target-dirs": [],
|
||||||
"linked-target-dirs": [],
|
"linked-target-dirs": [],
|
||||||
"module-dir": "<BINARY_DIR>/CMakeFiles/ninja-bmi-install-public.dir<CONFIG_DIR>"
|
"module-dir": "<BINARY_DIR>/CMakeFiles/ninja-bmi-install-public.dir<CONFIG_DIR>",
|
||||||
|
"sources": {}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -79,5 +79,6 @@
|
|||||||
"language": "CXX",
|
"language": "CXX",
|
||||||
"forward-modules-from-target-dirs": [],
|
"forward-modules-from-target-dirs": [],
|
||||||
"linked-target-dirs": [],
|
"linked-target-dirs": [],
|
||||||
"module-dir": "<BINARY_DIR>/CMakeFiles/ninja-exports-private.dir<CONFIG_DIR>"
|
"module-dir": "<BINARY_DIR>/CMakeFiles/ninja-exports-private.dir<CONFIG_DIR>",
|
||||||
|
"sources": {}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -79,5 +79,6 @@
|
|||||||
"language": "CXX",
|
"language": "CXX",
|
||||||
"forward-modules-from-target-dirs": [],
|
"forward-modules-from-target-dirs": [],
|
||||||
"linked-target-dirs": [],
|
"linked-target-dirs": [],
|
||||||
"module-dir": "<BINARY_DIR>/CMakeFiles/ninja-exports-public.dir<CONFIG_DIR>"
|
"module-dir": "<BINARY_DIR>/CMakeFiles/ninja-exports-public.dir<CONFIG_DIR>",
|
||||||
|
"sources": {}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -79,5 +79,6 @@
|
|||||||
"language": "CXX",
|
"language": "CXX",
|
||||||
"forward-modules-from-target-dirs": [],
|
"forward-modules-from-target-dirs": [],
|
||||||
"linked-target-dirs": [],
|
"linked-target-dirs": [],
|
||||||
"module-dir": "<BINARY_DIR>/CMakeFiles/ninja-exports-private.dir<CONFIG_DIR>"
|
"module-dir": "<BINARY_DIR>/CMakeFiles/ninja-exports-private.dir<CONFIG_DIR>",
|
||||||
|
"sources": {}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -79,5 +79,6 @@
|
|||||||
"language": "CXX",
|
"language": "CXX",
|
||||||
"forward-modules-from-target-dirs": [],
|
"forward-modules-from-target-dirs": [],
|
||||||
"linked-target-dirs": [],
|
"linked-target-dirs": [],
|
||||||
"module-dir": "<BINARY_DIR>/CMakeFiles/ninja-exports-public.dir<CONFIG_DIR>"
|
"module-dir": "<BINARY_DIR>/CMakeFiles/ninja-exports-public.dir<CONFIG_DIR>",
|
||||||
|
"sources": {}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,5 +42,23 @@
|
|||||||
"language": "CXX",
|
"language": "CXX",
|
||||||
"forward-modules-from-target-dirs": [],
|
"forward-modules-from-target-dirs": [],
|
||||||
"linked-target-dirs": [],
|
"linked-target-dirs": [],
|
||||||
"module-dir": "<BINARY_DIR>/CMakeFiles/ninja-file-sets-private.dir<CONFIG_DIR>"
|
"module-dir": "<BINARY_DIR>/CMakeFiles/ninja-file-sets-private.dir<CONFIG_DIR>",
|
||||||
|
"sources": {
|
||||||
|
"CMakeFiles/ninja-file-sets-private.dir/sources/module-impl.cxx<OBJEXT>" : {
|
||||||
|
"language" : "CXX",
|
||||||
|
"source" : "<SOURCE_DIR>/sources/module-impl.cxx"
|
||||||
|
},
|
||||||
|
"CMakeFiles/ninja-file-sets-private.dir/sources/module-internal-part-impl.cxx<OBJEXT>" : {
|
||||||
|
"language" : "CXX",
|
||||||
|
"source" : "<SOURCE_DIR>/sources/module-internal-part-impl.cxx"
|
||||||
|
},
|
||||||
|
"CMakeFiles/ninja-file-sets-private.dir/sources/module-part-impl.cxx<OBJEXT>" : {
|
||||||
|
"language" : "CXX",
|
||||||
|
"source" : "<SOURCE_DIR>/sources/module-part-impl.cxx"
|
||||||
|
},
|
||||||
|
"CMakeFiles/ninja-file-sets-private.dir/sources/module-use.cxx<OBJEXT>" : {
|
||||||
|
"language" : "CXX",
|
||||||
|
"source" : "<SOURCE_DIR>/sources/module-use.cxx"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,5 +42,23 @@
|
|||||||
"language": "CXX",
|
"language": "CXX",
|
||||||
"forward-modules-from-target-dirs": [],
|
"forward-modules-from-target-dirs": [],
|
||||||
"linked-target-dirs": [],
|
"linked-target-dirs": [],
|
||||||
"module-dir": "<BINARY_DIR>/CMakeFiles/ninja-file-sets-public.dir<CONFIG_DIR>"
|
"module-dir": "<BINARY_DIR>/CMakeFiles/ninja-file-sets-public.dir<CONFIG_DIR>",
|
||||||
|
"sources": {
|
||||||
|
"CMakeFiles/ninja-file-sets-public.dir/sources/module-impl.cxx<OBJEXT>" : {
|
||||||
|
"language" : "CXX",
|
||||||
|
"source" : "<SOURCE_DIR>/sources/module-impl.cxx"
|
||||||
|
},
|
||||||
|
"CMakeFiles/ninja-file-sets-public.dir/sources/module-internal-part-impl.cxx<OBJEXT>" : {
|
||||||
|
"language" : "CXX",
|
||||||
|
"source" : "<SOURCE_DIR>/sources/module-internal-part-impl.cxx"
|
||||||
|
},
|
||||||
|
"CMakeFiles/ninja-file-sets-public.dir/sources/module-part-impl.cxx<OBJEXT>" : {
|
||||||
|
"language" : "CXX",
|
||||||
|
"source" : "<SOURCE_DIR>/sources/module-part-impl.cxx"
|
||||||
|
},
|
||||||
|
"CMakeFiles/ninja-file-sets-public.dir/sources/module-use.cxx<OBJEXT>" : {
|
||||||
|
"language" : "CXX",
|
||||||
|
"source" : "<SOURCE_DIR>/sources/module-use.cxx"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user