cmCxxModuleMapper: track transitive modules for MSVC

MSVC needs the transitive closure of module usage to compile.
This commit is contained in:
Ben Boeckel
2022-07-19 16:00:58 -04:00
parent a43713d615
commit b3c2880cb2
3 changed files with 278 additions and 6 deletions

View File

@@ -5,12 +5,15 @@
#include "cmConfigure.h" // IWYU pragma: keep
#include <functional>
#include <map>
#include <set>
#include <string>
#include <vector>
#include <cm/optional>
#include <cmext/string_view>
struct cmScanDepInfo;
#include "cmScanDepFormat.h"
enum class CxxModuleMapFormat
{
@@ -37,10 +40,42 @@ struct CxxModuleLocations
std::string const& logical_name) const;
};
struct CxxModuleReference
{
// The path to the module file used.
std::string Path;
// How the module was looked up.
LookupMethod Method;
};
struct CxxModuleUsage
{
// The usage requirements for this object.
std::map<std::string, std::set<std::string>> Usage;
// The references for this object.
std::map<std::string, CxxModuleReference> Reference;
// Add a reference to a module.
//
// Returns `true` if it matches how it was found previously, `false` if it
// conflicts.
bool AddReference(std::string const& logical, std::string const& loc,
LookupMethod method);
};
// Return the extension to use for a given modulemap format.
cm::static_string_view CxxModuleMapExtension(
cm::optional<CxxModuleMapFormat> format);
// Fill in module usage information for internal usages.
//
// Returns the set of unresolved module usage requirements (these form an
// import cycle).
std::set<std::string> CxxModuleUsageSeed(
CxxModuleLocations const& loc, std::vector<cmScanDepInfo> const& objects,
CxxModuleUsage& usages);
// Return the contents of the module map in the given format for the
// object file.
std::string CxxModuleMapContent(CxxModuleMapFormat format,