summaryrefslogtreecommitdiffstats
path: root/Source/cmGlobalNinjaGenerator.cxx
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2023-11-27 13:36:28 (GMT)
committerKitware Robot <kwrobot@kitware.com>2023-11-27 13:36:45 (GMT)
commitc2bd158712b1ee3465296ee6be369f49747d709d (patch)
treeeb694c8b3d5669ead72001ea09c8e30c53c1e717 /Source/cmGlobalNinjaGenerator.cxx
parent89cfb90b9c0893133983b4f25896671c4f07497c (diff)
parentbeb1393f8f29302197b80741bec41a13b7f207c7 (diff)
downloadCMake-c2bd158712b1ee3465296ee6be369f49747d709d.zip
CMake-c2bd158712b1ee3465296ee6be369f49747d709d.tar.gz
CMake-c2bd158712b1ee3465296ee6be369f49747d709d.tar.bz2
Merge topic 'fortran-objects-as-sources-fix'
beb1393f8f Merge branch 'revert-exact-collation-depends-3.27' into fortran-objects-as-sources-fix a033dce326 Makefiles: provide, but do not consume, "forward linked" target dirs 7cd0adab1b cmCommonTargetGenerator: use modules from linked object-referenced targets 1175f1c874 LinkItem: track `cmSourceFile` instances for external objects d2fa56772f Ninja: support "forwarding" modules from other targets ec1e589bec Ninja: Revert exact collation dependencies for 3.27 06df59b930 cmCommonTargetGenerator: return forward linked target dirs too f8729ab366 cmLocalUnixMakefileGenerator3: handle object-referencing Fortran modules ... Acked-by: Kitware Robot <kwrobot@kitware.com> Acked-by: buildbot <buildbot@kitware.com> Merge-request: !8989
Diffstat (limited to 'Source/cmGlobalNinjaGenerator.cxx')
-rw-r--r--Source/cmGlobalNinjaGenerator.cxx59
1 files changed, 58 insertions, 1 deletions
diff --git a/Source/cmGlobalNinjaGenerator.cxx b/Source/cmGlobalNinjaGenerator.cxx
index 9fac513..af2fa82 100644
--- a/Source/cmGlobalNinjaGenerator.cxx
+++ b/Source/cmGlobalNinjaGenerator.cxx
@@ -2542,6 +2542,7 @@ bool cmGlobalNinjaGenerator::WriteDyndepFile(
std::string const& arg_dd, std::vector<std::string> const& arg_ddis,
std::string const& module_dir,
std::vector<std::string> const& linked_target_dirs,
+ std::vector<std::string> const& forward_modules_from_target_dirs,
std::string const& arg_lang, std::string const& arg_modmapfmt,
cmCxxModuleExportInfo const& export_info)
{
@@ -2819,6 +2820,51 @@ bool cmGlobalNinjaGenerator::WriteDyndepFile(
// use by dependents that reference this target in linked-target-dirs.
std::string const target_mods_file = cmStrCat(
cmSystemTools::GetFilenamePath(arg_dd), '/', arg_lang, "Modules.json");
+
+ // Populate the module map with those provided by linked targets first.
+ for (std::string const& forward_modules_from_target_dir :
+ forward_modules_from_target_dirs) {
+ std::string const fmftn =
+ cmStrCat(forward_modules_from_target_dir, '/', arg_lang, "Modules.json");
+ Json::Value fmft;
+ cmsys::ifstream fmftf(fmftn.c_str(), std::ios::in | std::ios::binary);
+ if (!fmftf) {
+ cmSystemTools::Error(cmStrCat("-E cmake_ninja_dyndep failed to open ",
+ fmftn, " for module information"));
+ return false;
+ }
+ Json::Reader reader;
+ if (!reader.parse(fmftf, fmft, false)) {
+ cmSystemTools::Error(cmStrCat("-E cmake_ninja_dyndep failed to parse ",
+ forward_modules_from_target_dir,
+ reader.getFormattedErrorMessages()));
+ return false;
+ }
+ if (!fmft.isObject()) {
+ continue;
+ }
+
+ auto forward_info = [](Json::Value& target, Json::Value const& source) {
+ if (!source.isObject()) {
+ return;
+ }
+
+ for (auto i = source.begin(); i != source.end(); ++i) {
+ std::string const key = i.key().asString();
+ if (target.isMember(key)) {
+ continue;
+ }
+ target[key] = *i;
+ }
+ };
+
+ // Forward info from forwarding targets into our collation.
+ Json::Value& tmi_target_modules = target_module_info["modules"];
+ forward_info(tmi_target_modules, fmft["modules"]);
+ forward_info(target_references, fmft["references"]);
+ forward_info(target_usages, fmft["usages"]);
+ }
+
cmGeneratedFileStream tmf(target_mods_file);
tmf << target_module_info;
@@ -2906,6 +2952,16 @@ int cmcmd_cmake_ninja_dyndep(std::vector<std::string>::const_iterator argBeg,
linked_target_dirs.push_back(tdi_linked_target_dir.asString());
}
}
+ std::vector<std::string> forward_modules_from_target_dirs;
+ Json::Value const& tdi_forward_modules_from_target_dirs =
+ tdi["forward-modules-from-target-dirs"];
+ if (tdi_forward_modules_from_target_dirs.isArray()) {
+ for (auto const& tdi_forward_modules_from_target_dir :
+ tdi_forward_modules_from_target_dirs) {
+ forward_modules_from_target_dirs.push_back(
+ tdi_forward_modules_from_target_dir.asString());
+ }
+ }
std::string const compilerId = tdi["compiler-id"].asString();
std::string const simulateId = tdi["compiler-simulate-id"].asString();
std::string const compilerFrontendVariant =
@@ -2929,7 +2985,8 @@ int cmcmd_cmake_ninja_dyndep(std::vector<std::string>::const_iterator argBeg,
# endif
return gg.WriteDyndepFile(dir_top_src, dir_top_bld, dir_cur_src, dir_cur_bld,
arg_dd, arg_ddis, module_dir, linked_target_dirs,
- arg_lang, arg_modmapfmt, *export_info)
+ forward_modules_from_target_dirs, arg_lang,
+ arg_modmapfmt, *export_info)
? 0
: 1;
}