Sfoglia il codice sorgente

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 <[email protected]>
Acked-by: Ben Boeckel <[email protected]>
Merge-request: !6115
Brad King 4 anni fa
parent
commit
02e50a4c0a

+ 4 - 1
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

+ 29 - 21
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) {

+ 1 - 1
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);
 }
 

+ 3 - 22
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;
 

+ 3 - 7
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);