Browse Source

cmCxxModuleMapper: implement support for GCC's module map format

Ben Boeckel 3 years ago
parent
commit
b43bdaff3c
2 changed files with 47 additions and 0 deletions
  1. 46 0
      Source/cmCxxModuleMapper.cxx
  2. 1 0
      Source/cmCxxModuleMapper.h

+ 46 - 0
Source/cmCxxModuleMapper.cxx

@@ -3,6 +3,8 @@
 #include "cmCxxModuleMapper.h"
 
 #include <cassert>
+#include <sstream>
+#include <vector>
 
 #include "cmScanDepFormat.h"
 
@@ -15,9 +17,48 @@ cm::optional<std::string> CxxModuleLocations::BmiGeneratorPathForModule(
   return {};
 }
 
+namespace {
+
+std::string CxxModuleMapContentGcc(CxxModuleLocations const& loc,
+                                   cmScanDepInfo const& obj)
+{
+  std::stringstream mm;
+
+  // Documented in GCC's documentation. The format is a series of
+  // lines with a module name and the associated filename separated
+  // by spaces. The first line may use `$root` as the module name
+  // to specify a "repository root". That is used to anchor any
+  // relative paths present in the file (CMake should never
+  // generate any).
+
+  // Write the root directory to use for module paths.
+  mm << "$root " << loc.RootDirectory << "\n";
+
+  for (auto const& p : obj.Provides) {
+    if (auto bmi_loc = loc.BmiGeneratorPathForModule(p.LogicalName)) {
+      mm << p.LogicalName << ' ' << *bmi_loc << '\n';
+    }
+  }
+  for (auto const& r : obj.Requires) {
+    if (auto bmi_loc = loc.BmiGeneratorPathForModule(r.LogicalName)) {
+      mm << r.LogicalName << ' ' << *bmi_loc << '\n';
+    }
+  }
+
+  return mm.str();
+}
+}
+
 cm::static_string_view CxxModuleMapExtension(
   cm::optional<CxxModuleMapFormat> format)
 {
+  if (format) {
+    switch (*format) {
+      case CxxModuleMapFormat::Gcc:
+        return ".gcm"_s;
+    }
+  }
+
   return ".bmi"_s;
 }
 
@@ -25,6 +66,11 @@ std::string CxxModuleMapContent(CxxModuleMapFormat format,
                                 CxxModuleLocations const& loc,
                                 cmScanDepInfo const& obj)
 {
+  switch (format) {
+    case CxxModuleMapFormat::Gcc:
+      return CxxModuleMapContentGcc(loc, obj);
+  }
+
   assert(false);
   return {};
 }

+ 1 - 0
Source/cmCxxModuleMapper.h

@@ -14,6 +14,7 @@ struct cmScanDepInfo;
 
 enum class CxxModuleMapFormat
 {
+  Gcc,
 };
 
 struct CxxModuleLocations