|
|
@@ -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 {};
|
|
|
}
|