summaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2021-06-16 12:19:23 +0000
committerKitware Robot <kwrobot@kitware.com>2021-06-16 08:19:28 -0400
commita9fbc4959a51e87d4833edef822dc56f14add26e (patch)
tree148dd63b0084fc8e02f7801a037fde8c45c31b3c /Source
parent89a1aa8412ce61fea28b6ce7e6891a3f34982e8e (diff)
parenta35d1212760707b195f6c462aadae8383ffcdeca (diff)
downloadcmake-a9fbc4959a51e87d4833edef822dc56f14add26e.tar.gz
Merge topic 'scandep-format'
a35d121276 Ninja: Populate P1689R4 compiled-module-path field for Fortran 10b2e53469 cmScanDepFormat: Remove Fortran-specific compiled-module-path logic 2b9890e9b9 cmScanDepFormat: Avoid writing lookup-method with default value Acked-by: Kitware Robot <kwrobot@kitware.com> Acked-by: Ben Boeckel <ben.boeckel@kitware.com> Merge-request: !6228
Diffstat (limited to 'Source')
-rw-r--r--Source/cmGlobalNinjaGenerator.cxx37
-rw-r--r--Source/cmScanDepFormat.cxx19
2 files changed, 39 insertions, 17 deletions
diff --git a/Source/cmGlobalNinjaGenerator.cxx b/Source/cmGlobalNinjaGenerator.cxx
index cbe1bc8501..963118fd62 100644
--- a/Source/cmGlobalNinjaGenerator.cxx
+++ b/Source/cmGlobalNinjaGenerator.cxx
@@ -6,6 +6,7 @@
#include <cctype>
#include <cstdio>
#include <sstream>
+#include <utility>
#include <cm/iterator>
#include <cm/memory>
@@ -2400,6 +2401,8 @@ cm::optional<cmSourceInfo> cmcmd_cmake_ninja_depends_fortran(
cm::optional<cmSourceInfo> info;
cmFortranCompiler fc;
std::vector<std::string> includes;
+ std::string dir_top_bld;
+ std::string module_dir;
{
Json::Value tdio;
Json::Value const& tdi = tdio;
@@ -2414,6 +2417,11 @@ cm::optional<cmSourceInfo> cmcmd_cmake_ninja_depends_fortran(
}
}
+ dir_top_bld = tdi["dir-top-bld"].asString();
+ if (!dir_top_bld.empty() && !cmHasLiteralSuffix(dir_top_bld, "/")) {
+ dir_top_bld += '/';
+ }
+
Json::Value const& tdi_include_dirs = tdi["include-dirs"];
if (tdi_include_dirs.isArray()) {
for (auto const& tdi_include_dir : tdi_include_dirs) {
@@ -2421,6 +2429,12 @@ cm::optional<cmSourceInfo> cmcmd_cmake_ninja_depends_fortran(
}
}
+ Json::Value const& tdi_module_dir = tdi["module-dir"];
+ module_dir = tdi_module_dir.asString();
+ if (!module_dir.empty() && !cmHasLiteralSuffix(module_dir, "/")) {
+ module_dir += '/';
+ }
+
Json::Value const& tdi_compiler_id = tdi["compiler-id"];
fc.Id = tdi_compiler_id.asString();
@@ -2448,7 +2462,13 @@ cm::optional<cmSourceInfo> cmcmd_cmake_ninja_depends_fortran(
for (std::string const& provide : finfo.Provides) {
cmSourceReqInfo src_info;
src_info.LogicalName = provide;
- src_info.CompiledModulePath = provide;
+ if (!module_dir.empty()) {
+ std::string mod = cmStrCat(module_dir, provide);
+ if (!dir_top_bld.empty() && cmHasPrefix(mod, dir_top_bld)) {
+ mod = mod.substr(dir_top_bld.size());
+ }
+ src_info.CompiledModulePath = std::move(mod);
+ }
info->ScanDep.Provides.emplace_back(src_info);
}
for (std::string const& require : finfo.Requires) {
@@ -2458,7 +2478,6 @@ cm::optional<cmSourceInfo> cmcmd_cmake_ninja_depends_fortran(
}
cmSourceReqInfo src_info;
src_info.LogicalName = require;
- src_info.CompiledModulePath = require;
info->ScanDep.Requires.emplace_back(src_info);
}
for (std::string const& include : finfo.Includes) {
@@ -2529,8 +2548,18 @@ bool cmGlobalNinjaGenerator::WriteDyndepFile(
Json::Value tm = Json::objectValue;
for (cmScanDepInfo const& object : objects) {
for (auto const& p : object.Provides) {
- std::string const mod = cmStrCat(
- module_dir, cmSystemTools::GetFilenameName(p.CompiledModulePath));
+ std::string mod;
+ if (!p.CompiledModulePath.empty()) {
+ // The scanner provided the path to the module file.
+ mod = p.CompiledModulePath;
+ if (!cmSystemTools::FileIsFullPath(mod)) {
+ // Treat relative to work directory (top of build tree).
+ mod = cmSystemTools::CollapseFullPath(mod, dir_top_bld);
+ }
+ } else {
+ // Assume the module file path matches the logical module name.
+ mod = cmStrCat(module_dir, p.LogicalName);
+ }
mod_files[p.LogicalName] = mod;
tm[p.LogicalName] = mod;
}
diff --git a/Source/cmScanDepFormat.cxx b/Source/cmScanDepFormat.cxx
index 66202212c8..6fcbce5f18 100644
--- a/Source/cmScanDepFormat.cxx
+++ b/Source/cmScanDepFormat.cxx
@@ -3,7 +3,6 @@
#include "cmScanDepFormat.h"
-#include <cassert>
#include <cctype>
#include <cstdio>
#include <utility>
@@ -163,9 +162,6 @@ bool cmScanDepFormat_P1689_Parse(std::string const& arg_pp,
provide["compiled-module-path"];
PARSE_FILENAME(compiled_module_path,
provide_info.CompiledModulePath);
- } else {
- provide_info.CompiledModulePath =
- cmStrCat(provide_info.LogicalName, ".mod");
}
if (provide.isMember("unique-on-source-path")) {
@@ -300,9 +296,7 @@ bool cmScanDepFormat_P1689_Write(std::string const& path,
Json::Value provide_obj(Json::objectValue);
auto const encoded = EncodeFilename(provide.LogicalName);
provide_obj["logical-name"] = encoded;
- if (provide.CompiledModulePath.empty()) {
- provide_obj["compiled-module-path"] = encoded;
- } else {
+ if (!provide.CompiledModulePath.empty()) {
provide_obj["compiled-module-path"] =
EncodeFilename(provide.CompiledModulePath);
}
@@ -322,9 +316,7 @@ bool cmScanDepFormat_P1689_Write(std::string const& path,
Json::Value require_obj(Json::objectValue);
auto const encoded = EncodeFilename(require.LogicalName);
require_obj["logical-name"] = encoded;
- if (require.CompiledModulePath.empty()) {
- require_obj["compiled-module-path"] = encoded;
- } else {
+ if (!require.CompiledModulePath.empty()) {
require_obj["compiled-module-path"] =
EncodeFilename(require.CompiledModulePath);
}
@@ -339,7 +331,7 @@ bool cmScanDepFormat_P1689_Write(std::string const& path,
const char* lookup_method = nullptr;
switch (require.Method) {
case LookupMethod::ByName:
- lookup_method = "by-name";
+ // No explicit value needed for the default.
break;
case LookupMethod::IncludeAngle:
lookup_method = "include-angle";
@@ -348,8 +340,9 @@ bool cmScanDepFormat_P1689_Write(std::string const& path,
lookup_method = "include-quote";
break;
}
- assert(lookup_method);
- require_obj["lookup-method"] = lookup_method;
+ if (lookup_method) {
+ require_obj["lookup-method"] = lookup_method;
+ }
reqs.append(require_obj);
}