Ninja: Honor Fortran_BUILDING_INTRINSIC_MODULES

In commit b65930a7a7 (Fortran: Add Fortran_BUILDING_INTRINSIC_MODULES
for building intrinsics, 2025-01-09, v4.0.0-rc1~223^2) we only
implemented the property for the Makefile generators.  Implement it
for the Ninja generators too.

Fixes: #26803
This commit is contained in:
Michael Kruse 2026-06-17 14:38:45 +02:00 committed by Brad King
parent 365c7d6af8
commit 0e142193ac
4 changed files with 23 additions and 1 deletions

View File

@ -14,3 +14,7 @@ Turning this property on will correctly add dependencies for building
Fortran intrinsic modules whereas turning the property off will ignore
Fortran intrinsic modules in the dependency graph as they are supplied
by the compiler itself.
.. versionadded:: 4.5
This property is now honored by the :ref:`Ninja Generators`.
Previously it was only honored by the :ref:`Makefile Generators`.

View File

@ -0,0 +1,6 @@
fortran-intrinsic-modules-ninja
-------------------------------
* The :prop_tgt:`Fortran_BUILDING_INTRINSIC_MODULES` target property is now
honored by the :ref:`Ninja Generators`. Previously it was only honored
by the :ref:`Makefile Generators`.

View File

@ -7,6 +7,7 @@
#include <cstdio>
#include <functional>
#include <iterator>
#include <set>
#include <sstream>
#include <utility>
@ -2565,6 +2566,7 @@ cm::optional<cmSourceInfo> cmcmd_cmake_ninja_depends_fortran(
std::vector<std::string> includes;
std::string dir_top_bld;
std::string module_dir;
bool building_intrinsics = false;
if (!arg_src_orig.empty()) {
// Prepend the original source file's directory as an include directory
@ -2615,6 +2617,10 @@ cm::optional<cmSourceInfo> cmcmd_cmake_ninja_depends_fortran(
Json::Value const& tdi_submodule_ext = tdi["submodule-ext"];
fc.SModExt = tdi_submodule_ext.asString();
Json::Value const& tdi_building_intrinsics =
tdi["building-intrinsic-modules"];
building_intrinsics = tdi_building_intrinsics.asBool();
}
cmFortranSourceInfo finfo;
@ -2643,7 +2649,11 @@ cm::optional<cmSourceInfo> cmcmd_cmake_ninja_depends_fortran(
}
info->ScanDep.Provides.emplace_back(src_info);
}
for (std::string const& require : finfo.Requires) {
std::set<std::string> requiredModules = finfo.Requires;
if (building_intrinsics) {
requiredModules.insert(finfo.Intrinsics.begin(), finfo.Intrinsics.end());
}
for (std::string const& require : requiredModules) {
// Require modules not provided in the same source.
if (finfo.Provides.count(require)) {
continue;

View File

@ -2376,6 +2376,8 @@ void cmNinjaTargetGenerator::WriteTargetDependInfo(std::string const& lang,
this->Makefile->GetSafeDefinition("CMAKE_Fortran_SUBMODULE_SEP");
tdi["submodule-ext"] =
this->Makefile->GetSafeDefinition("CMAKE_Fortran_SUBMODULE_EXT");
tdi["building-intrinsic-modules"] =
this->GeneratorTarget->IsFortranBuildingIntrinsicModules();
} else if (lang == "CXX") {
// No extra information necessary.
}