CMake/Source/cmFileSet.h
Ben Boeckel 80d6544398 cxxmodules: generate synthetic targets as an initial pass
We need to be able to construct BMIs that will be usable from the client
modules for the target importing the module, so create BMI-only
compilation rules for `IMPORTED` targets to create these BMIs.
2023-08-17 14:42:53 -04:00

90 lines
2.7 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 <map>
#include <memory>
#include <string>
#include <vector>
#include <cm/string_view>
#include <cmext/string_view>
#include "cmListFileCache.h"
class cmCompiledGeneratorExpression;
struct cmGeneratorExpressionDAGChecker;
class cmGeneratorTarget;
class cmLocalGenerator;
class cmMakefile;
class cmake;
enum class cmFileSetVisibility
{
Private,
Public,
Interface,
};
cm::static_string_view cmFileSetVisibilityToName(cmFileSetVisibility vis);
cmFileSetVisibility cmFileSetVisibilityFromName(cm::string_view name,
cmMakefile* mf);
bool cmFileSetVisibilityIsForSelf(cmFileSetVisibility vis);
bool cmFileSetVisibilityIsForInterface(cmFileSetVisibility vis);
class cmFileSet
{
public:
cmFileSet(cmake& cmakeInstance, std::string name, std::string type,
cmFileSetVisibility visibility);
const std::string& GetName() const { return this->Name; }
const std::string& GetType() const { return this->Type; }
cmFileSetVisibility GetVisibility() const { return this->Visibility; }
void CopyEntries(cmFileSet const* fs);
void ClearDirectoryEntries();
void AddDirectoryEntry(BT<std::string> directories);
const std::vector<BT<std::string>>& GetDirectoryEntries() const
{
return this->DirectoryEntries;
}
void ClearFileEntries();
void AddFileEntry(BT<std::string> files);
const std::vector<BT<std::string>>& GetFileEntries() const
{
return this->FileEntries;
}
std::vector<std::unique_ptr<cmCompiledGeneratorExpression>>
CompileFileEntries() const;
std::vector<std::unique_ptr<cmCompiledGeneratorExpression>>
CompileDirectoryEntries() const;
std::vector<std::string> EvaluateDirectoryEntries(
const std::vector<std::unique_ptr<cmCompiledGeneratorExpression>>& cges,
cmLocalGenerator* lg, const std::string& config,
const cmGeneratorTarget* target,
cmGeneratorExpressionDAGChecker* dagChecker = nullptr) const;
void EvaluateFileEntry(
const std::vector<std::string>& dirs,
std::map<std::string, std::vector<std::string>>& filesPerDir,
const std::unique_ptr<cmCompiledGeneratorExpression>& cge,
cmLocalGenerator* lg, const std::string& config,
const cmGeneratorTarget* target,
cmGeneratorExpressionDAGChecker* dagChecker = nullptr) const;
static bool IsValidName(const std::string& name);
private:
cmake& CMakeInstance;
std::string Name;
std::string Type;
cmFileSetVisibility Visibility;
std::vector<BT<std::string>> DirectoryEntries;
std::vector<BT<std::string>> FileEntries;
};