CMake/Source/cmCxxModuleMapper.h
Ben Boeckel 18f87c87f8 cmCxxModuleMapper: track whether modules are private or not
This allows collation to give a useful error message when it finds usage
of a private module rather than collation just not informing the
compilation and the compiler erroring out about not being able to import
unknown modules (which exists, but it was not told about due to
visibility).

Fixes: #24652
2023-05-18 08:34:31 -04:00

103 lines
2.8 KiB
C++

/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file Copyright.txt or https://cmake.org/licensing for details. */
#pragma once
#include "cmConfigure.h" // IWYU pragma: keep
#include <functional>
#include <map>
#include <set>
#include <string>
#include <vector>
#include <cm/optional>
#include <cmext/string_view>
#include "cmScanDepFormat.h"
enum class CxxModuleMapFormat
{
Clang,
Gcc,
Msvc,
};
struct CxxBmiLocation
{
static CxxBmiLocation Unknown();
static CxxBmiLocation Private();
static CxxBmiLocation Known(std::string path);
bool IsKnown() const;
bool IsPrivate() const;
std::string const& Location() const;
private:
CxxBmiLocation();
CxxBmiLocation(std::string path);
cm::optional<std::string> BmiLocation;
};
struct CxxModuleLocations
{
// The path from which all relative paths should be computed. If
// this is relative, it is relative to the compiler's working
// directory.
std::string RootDirectory;
// A function to convert a full path to a path for the generator.
std::function<std::string(std::string)> PathForGenerator;
// Lookup the BMI location of a logical module name.
std::function<CxxBmiLocation(std::string const&)> BmiLocationForModule;
// Returns the generator path (if known) for the BMI given a
// logical module name.
CxxBmiLocation BmiGeneratorPathForModule(
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,
CxxModuleLocations const& loc,
cmScanDepInfo const& obj,
CxxModuleUsage const& usages);