From b43bdaff3c13fe2273ec407797ff05db89bf3761 Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Thu, 2 Jun 2022 17:20:05 -0400 Subject: cmCxxModuleMapper: implement support for GCC's module map format --- Source/cmCxxModuleMapper.cxx | 46 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) (limited to 'Source/cmCxxModuleMapper.cxx') diff --git a/Source/cmCxxModuleMapper.cxx b/Source/cmCxxModuleMapper.cxx index ddb95e38dd..94ad721702 100644 --- a/Source/cmCxxModuleMapper.cxx +++ b/Source/cmCxxModuleMapper.cxx @@ -3,6 +3,8 @@ #include "cmCxxModuleMapper.h" #include +#include +#include #include "cmScanDepFormat.h" @@ -15,9 +17,48 @@ cm::optional 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 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 {}; } -- cgit v1.2.1