diff options
author | Brad King <brad.king@kitware.com> | 2021-06-16 12:19:23 +0000 |
---|---|---|
committer | Kitware Robot <kwrobot@kitware.com> | 2021-06-16 08:19:28 -0400 |
commit | a9fbc4959a51e87d4833edef822dc56f14add26e (patch) | |
tree | 148dd63b0084fc8e02f7801a037fde8c45c31b3c /Source | |
parent | 89a1aa8412ce61fea28b6ce7e6891a3f34982e8e (diff) | |
parent | a35d1212760707b195f6c462aadae8383ffcdeca (diff) | |
download | cmake-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.cxx | 37 | ||||
-rw-r--r-- | Source/cmScanDepFormat.cxx | 19 |
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); } |