/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying file Copyright.txt or https://cmake.org/licensing for details. */ #include "cmCxxModuleMapper.h" #include #include #include #include "cmScanDepFormat.h" cm::optional CxxModuleLocations::BmiGeneratorPathForModule( std::string const& logical_name) const { if (auto l = this->BmiLocationForModule(logical_name)) { return this->PathForGenerator(*l); } 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; } std::string CxxModuleMapContent(CxxModuleMapFormat format, CxxModuleLocations const& loc, cmScanDepInfo const& obj) { switch (format) { case CxxModuleMapFormat::Gcc: return CxxModuleMapContentGcc(loc, obj); } assert(false); return {}; }