diff options
-rw-r--r-- | Source/cmCxxModuleMapper.cxx | 46 | ||||
-rw-r--r-- | Source/cmCxxModuleMapper.h | 1 |
2 files changed, 47 insertions, 0 deletions
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 <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 {}; } diff --git a/Source/cmCxxModuleMapper.h b/Source/cmCxxModuleMapper.h index ad2f88cc47..99384c919b 100644 --- a/Source/cmCxxModuleMapper.h +++ b/Source/cmCxxModuleMapper.h @@ -14,6 +14,7 @@ struct cmScanDepInfo; enum class CxxModuleMapFormat { + Gcc, }; struct CxxModuleLocations |