summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2021-05-14 12:31:54 (GMT)
committerKitware Robot <kwrobot@kitware.com>2021-05-14 12:32:05 (GMT)
commit02e50a4c0ac2b06e5706e05c4b4ed71679658ed4 (patch)
tree34a43a254157025aee4789e6fdc472f90251283d
parent1acc937719d92a6319899ea6aaf05924ec7a6774 (diff)
parentdb8e0beeaca0f0330431d5874bfb22e0a3f1fb70 (diff)
downloadCMake-02e50a4c0ac2b06e5706e05c4b4ed71679658ed4.zip
CMake-02e50a4c0ac2b06e5706e05c4b4ed71679658ed4.tar.gz
CMake-02e50a4c0ac2b06e5706e05c4b4ed71679658ed4.tar.bz2
Merge topic 'scandep-format'
db8e0beeac cmGlobalNinjaGenerator: Clarify semantics of Fortran scanning info bd12b97d05 cmScanDepFormat: Drop unused "outputs", "inputs", and "depends" fields Acked-by: Kitware Robot <kwrobot@kitware.com> Acked-by: Ben Boeckel <ben.boeckel@kitware.com> Merge-request: !6115
-rw-r--r--Help/dev/experimental.rst5
-rw-r--r--Source/cmGlobalNinjaGenerator.cxx50
-rw-r--r--Source/cmNinjaTargetGenerator.cxx2
-rw-r--r--Source/cmScanDepFormat.cxx25
-rw-r--r--Source/cmScanDepFormat.h10
5 files changed, 40 insertions, 52 deletions
diff --git a/Help/dev/experimental.rst b/Help/dev/experimental.rst
index d019161..3db8177 100644
--- a/Help/dev/experimental.rst
+++ b/Help/dev/experimental.rst
@@ -39,7 +39,10 @@ to the file specified by the ``<DEP_FILE>`` placeholder, and write module
dependencies to the file specified by the ``<DYNDEP_FILE>`` placeholder.
The module dependencies should be written in the format described
-by the `P1689r3`_ paper.
+by the `P1689r3`_ paper, with the following updates:
+
+* Omit the ``outputs``, ``inputs``, and ``depends`` fields from
+ each entry in the ``rules`` array. They are unused.
Compiler writers may try out their scanning functionality using
the `cxx-modules-sandbox`_ test project, modified to set variables
diff --git a/Source/cmGlobalNinjaGenerator.cxx b/Source/cmGlobalNinjaGenerator.cxx
index 6937639..d667575 100644
--- a/Source/cmGlobalNinjaGenerator.cxx
+++ b/Source/cmGlobalNinjaGenerator.cxx
@@ -9,6 +9,7 @@
#include <cm/iterator>
#include <cm/memory>
+#include <cm/optional>
#include <cm/string_view>
#include <cmext/algorithm>
#include <cmext/memory>
@@ -2247,14 +2248,22 @@ Compilation of source files within a target is split into the following steps:
(because the latter consumes the module).
*/
-static std::unique_ptr<cmSourceInfo> cmcmd_cmake_ninja_depends_fortran(
+namespace {
+
+struct cmSourceInfo
+{
+ cmScanDepInfo ScanDep;
+ std::vector<std::string> Includes;
+};
+
+cm::optional<cmSourceInfo> cmcmd_cmake_ninja_depends_fortran(
std::string const& arg_tdi, std::string const& arg_pp);
+}
int cmcmd_cmake_ninja_depends(std::vector<std::string>::const_iterator argBeg,
std::vector<std::string>::const_iterator argEnd)
{
std::string arg_tdi;
- std::string arg_src;
std::string arg_pp;
std::string arg_dep;
std::string arg_obj;
@@ -2263,8 +2272,6 @@ int cmcmd_cmake_ninja_depends(std::vector<std::string>::const_iterator argBeg,
for (std::string const& arg : cmMakeRange(argBeg, argEnd)) {
if (cmHasLiteralPrefix(arg, "--tdi=")) {
arg_tdi = arg.substr(6);
- } else if (cmHasLiteralPrefix(arg, "--src=")) {
- arg_src = arg.substr(6);
} else if (cmHasLiteralPrefix(arg, "--pp=")) {
arg_pp = arg.substr(5);
} else if (cmHasLiteralPrefix(arg, "--dep=")) {
@@ -2305,11 +2312,8 @@ int cmcmd_cmake_ninja_depends(std::vector<std::string>::const_iterator argBeg,
cmSystemTools::Error("-E cmake_ninja_depends requires value for --lang=");
return 1;
}
- if (arg_src.empty()) {
- arg_src = cmStrCat("<", arg_obj, " input file>");
- }
- std::unique_ptr<cmSourceInfo> info;
+ cm::optional<cmSourceInfo> info;
if (arg_lang == "Fortran") {
info = cmcmd_cmake_ninja_depends_fortran(arg_tdi, arg_pp);
} else {
@@ -2324,7 +2328,7 @@ int cmcmd_cmake_ninja_depends(std::vector<std::string>::const_iterator argBeg,
return 1;
}
- info->PrimaryOutput = arg_obj;
+ info->ScanDep.PrimaryOutput = arg_obj;
{
cmGeneratedFileStream depfile(arg_dep);
@@ -2335,7 +2339,7 @@ int cmcmd_cmake_ninja_depends(std::vector<std::string>::const_iterator argBeg,
depfile << "\n";
}
- if (!cmScanDepFormat_P1689_Write(arg_ddi, arg_src, *info)) {
+ if (!cmScanDepFormat_P1689_Write(arg_ddi, info->ScanDep)) {
cmSystemTools::Error(
cmStrCat("-E cmake_ninja_depends failed to write ", arg_ddi));
return 1;
@@ -2343,9 +2347,12 @@ int cmcmd_cmake_ninja_depends(std::vector<std::string>::const_iterator argBeg,
return 0;
}
-std::unique_ptr<cmSourceInfo> cmcmd_cmake_ninja_depends_fortran(
+namespace {
+
+cm::optional<cmSourceInfo> cmcmd_cmake_ninja_depends_fortran(
std::string const& arg_tdi, std::string const& arg_pp)
{
+ cm::optional<cmSourceInfo> info;
cmFortranCompiler fc;
std::vector<std::string> includes;
{
@@ -2358,7 +2365,7 @@ std::unique_ptr<cmSourceInfo> cmcmd_cmake_ninja_depends_fortran(
cmSystemTools::Error(
cmStrCat("-E cmake_ninja_depends failed to parse ", arg_tdi,
reader.getFormattedErrorMessages()));
- return nullptr;
+ return info;
}
}
@@ -2385,19 +2392,19 @@ std::unique_ptr<cmSourceInfo> cmcmd_cmake_ninja_depends_fortran(
if (!cmFortranParser_FilePush(&parser, arg_pp.c_str())) {
cmSystemTools::Error(
cmStrCat("-E cmake_ninja_depends failed to open ", arg_pp));
- return nullptr;
+ return info;
}
if (cmFortran_yyparse(parser.Scanner) != 0) {
// Failed to parse the file.
- return nullptr;
+ return info;
}
- auto info = cm::make_unique<cmSourceInfo>();
+ info = cmSourceInfo();
for (std::string const& provide : finfo.Provides) {
cmSourceReqInfo src_info;
src_info.LogicalName = provide;
src_info.CompiledModulePath = provide;
- info->Provides.emplace_back(src_info);
+ info->ScanDep.Provides.emplace_back(src_info);
}
for (std::string const& require : finfo.Requires) {
// Require modules not provided in the same source.
@@ -2407,13 +2414,14 @@ std::unique_ptr<cmSourceInfo> cmcmd_cmake_ninja_depends_fortran(
cmSourceReqInfo src_info;
src_info.LogicalName = require;
src_info.CompiledModulePath = require;
- info->Requires.emplace_back(src_info);
+ info->ScanDep.Requires.emplace_back(src_info);
}
for (std::string const& include : finfo.Includes) {
info->Includes.push_back(include);
}
return info;
}
+}
bool cmGlobalNinjaGenerator::WriteDyndepFile(
std::string const& dir_top_src, std::string const& dir_top_bld,
@@ -2436,9 +2444,9 @@ bool cmGlobalNinjaGenerator::WriteDyndepFile(
this->LocalGenerators.push_back(std::move(lgd));
}
- std::vector<cmSourceInfo> objects;
+ std::vector<cmScanDepInfo> objects;
for (std::string const& arg_ddi : arg_ddis) {
- cmSourceInfo info;
+ cmScanDepInfo info;
if (!cmScanDepFormat_P1689_Parse(arg_ddi, &info)) {
cmSystemTools::Error(
cmStrCat("-E cmake_ninja_dyndep failed to parse ddi file ", arg_ddi));
@@ -2474,7 +2482,7 @@ bool cmGlobalNinjaGenerator::WriteDyndepFile(
// We do this after loading the modules provided by linked targets
// in case we have one of the same name that must be preferred.
Json::Value tm = Json::objectValue;
- for (cmSourceInfo const& object : objects) {
+ for (cmScanDepInfo const& object : objects) {
for (auto const& p : object.Provides) {
std::string const mod = cmStrCat(
module_dir, cmSystemTools::GetFilenameName(p.CompiledModulePath));
@@ -2489,7 +2497,7 @@ bool cmGlobalNinjaGenerator::WriteDyndepFile(
{
cmNinjaBuild build("dyndep");
build.Outputs.emplace_back("");
- for (cmSourceInfo const& object : objects) {
+ for (cmScanDepInfo const& object : objects) {
build.Outputs[0] = this->ConvertToNinjaPath(object.PrimaryOutput);
build.ImplicitOuts.clear();
for (auto const& p : object.Provides) {
diff --git a/Source/cmNinjaTargetGenerator.cxx b/Source/cmNinjaTargetGenerator.cxx
index ce0d869..3ebf364 100644
--- a/Source/cmNinjaTargetGenerator.cxx
+++ b/Source/cmNinjaTargetGenerator.cxx
@@ -528,7 +528,7 @@ std::string GetScanCommand(const std::string& cmakeCmd, const std::string& tdi,
const std::string& ddiFile)
{
return cmStrCat(cmakeCmd, " -E cmake_ninja_depends --tdi=", tdi,
- " --lang=", lang, " --src=$in", " --pp=", ppFile,
+ " --lang=", lang, " --pp=", ppFile,
" --dep=$DEP_FILE --obj=$OBJ_FILE --ddi=", ddiFile);
}
diff --git a/Source/cmScanDepFormat.cxx b/Source/cmScanDepFormat.cxx
index f988fe4..e66f96d 100644
--- a/Source/cmScanDepFormat.cxx
+++ b/Source/cmScanDepFormat.cxx
@@ -74,7 +74,8 @@ static Json::Value EncodeFilename(std::string const& path)
} \
} while (0)
-bool cmScanDepFormat_P1689_Parse(std::string const& arg_pp, cmSourceInfo* info)
+bool cmScanDepFormat_P1689_Parse(std::string const& arg_pp,
+ cmScanDepInfo* info)
{
Json::Value ppio;
Json::Value const& ppi = ppio;
@@ -116,15 +117,6 @@ bool cmScanDepFormat_P1689_Parse(std::string const& arg_pp, cmSourceInfo* info)
return false;
}
- Json::Value const& depends = rule["depends"];
- if (depends.isArray()) {
- std::string depend_filename;
- for (auto const& depend : depends) {
- PARSE_FILENAME(depend, depend_filename);
- info->Includes.push_back(depend_filename);
- }
- }
-
if (rule.isMember("future-compile")) {
Json::Value const& future_compile = rule["future-compile"];
@@ -194,8 +186,7 @@ bool cmScanDepFormat_P1689_Parse(std::string const& arg_pp, cmSourceInfo* info)
}
bool cmScanDepFormat_P1689_Write(std::string const& path,
- std::string const& input,
- cmSourceInfo const& info)
+ cmScanDepInfo const& info)
{
Json::Value ddi(Json::objectValue);
ddi["version"] = 0;
@@ -204,16 +195,6 @@ bool cmScanDepFormat_P1689_Write(std::string const& path,
Json::Value& rules = ddi["rules"] = Json::arrayValue;
Json::Value rule(Json::objectValue);
- Json::Value& inputs = rule["inputs"] = Json::arrayValue;
- inputs.append(EncodeFilename(input));
-
- Json::Value& rule_outputs = rule["outputs"] = Json::arrayValue;
- rule_outputs.append(EncodeFilename(path));
-
- Json::Value& depends = rule["depends"] = Json::arrayValue;
- for (auto const& include : info.Includes) {
- depends.append(EncodeFilename(include));
- }
Json::Value& future_compile = rule["future-compile"] = Json::objectValue;
diff --git a/Source/cmScanDepFormat.h b/Source/cmScanDepFormat.h
index 1ad0ecf..51ceec1 100644
--- a/Source/cmScanDepFormat.h
+++ b/Source/cmScanDepFormat.h
@@ -11,20 +11,16 @@ struct cmSourceReqInfo
std::string CompiledModulePath;
};
-struct cmSourceInfo
+struct cmScanDepInfo
{
std::string PrimaryOutput;
// Set of provided and required modules.
std::vector<cmSourceReqInfo> Provides;
std::vector<cmSourceReqInfo> Requires;
-
- // Set of files included in the translation unit.
- std::vector<std::string> Includes;
};
bool cmScanDepFormat_P1689_Parse(std::string const& arg_pp,
- cmSourceInfo* info);
+ cmScanDepInfo* info);
bool cmScanDepFormat_P1689_Write(std::string const& path,
- std::string const& input,
- cmSourceInfo const& info);
+ cmScanDepInfo const& info);