| /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying | |
| file LICENSE.rst or https://cmake.org/licensing for details. */ | |
| #pragma once | |
| #include <cstdint> | |
| #include <set> | |
| #include <utility> | |
| #include <vector> | |
| #include <cm/optional> | |
| #include <cm/string_view> | |
| #include <cmext/enum_set> | |
| class cmMakefile; | |
| namespace cm { | |
| namespace FileSetMetadata { | |
| enum class FileSetDomain : std::uint16_t | |
| { | |
| // NATIVE: File set type is defined by CMake | |
| NATIVE, | |
| // RULE: file set type is matching a defined custom rule | |
| RULE | |
| }; | |
| using FileSetDomainSet = cm::enum_set<FileSetDomain, 2>; | |
| static FileSetDomainSet const AllFileSetDomains{ FileSetDomain::NATIVE, | |
| FileSetDomain::RULE }; | |
| enum class Visibility | |
| { | |
| Private, | |
| Public, | |
| Interface | |
| }; | |
| cm::string_view VisibilityToName(Visibility vis); | |
| Visibility VisibilityFromName(cm::string_view name, cmMakefile* mf); | |
| bool VisibilityIsForSelf(Visibility vis); | |
| bool VisibilityIsForInterface(Visibility vis); | |
| // Pre-defined FileSet types | |
| extern cm::string_view const HEADERS; | |
| extern cm::string_view const SOURCES; | |
| extern cm::string_view const SYCL; | |
| extern cm::string_view const SYCL_HEADERS; | |
| extern cm::string_view const CXX_MODULES; | |
| enum class FileSetLookup | |
| { | |
| // Search for file sets attached to the target | |
| Target, | |
| // Search also file sets inherited from link libraries | |
| Dependencies | |
| }; | |
| // Define the various modes regarding graph dependency for | |
| // the generated files (Ninja specific) | |
| // items must be kept in this order: "Lower" modes are "stronger" in that they | |
| // have more restrictions (and therefore allow for more build graph | |
| // optimization). | |
| // std::set rely on it. | |
| enum class DependencyMode | |
| { | |
| IndependentFiles, // files in the file set are independent from each other | |
| Includables // files can be used by another source during compilation | |
| }; | |
| using DependencySet = std::set<DependencyMode>; | |
| enum class FileSetAttributes : std::uint16_t | |
| { | |
| FrameworkCompatible, // Can be part of an Apple framework | |
| FilesInMultipleFileSets, // Files of this file set type can be part of other | |
| // file sets | |
| UnityBuild // Can be part of a unity build | |
| }; | |
| using AttributeSet = cm::enum_set<FileSetAttributes, 3>; | |
| struct FileSetDescriptor | |
| { | |
| FileSetDescriptor(cm::string_view type, FileSetLookup lookup, | |
| DependencySet dependencies, | |
| DependencyMode defaultDependency, AttributeSet attributes) | |
| : Type(type) | |
| , Lookup(lookup) | |
| , SupportedDependencies(std::move(dependencies)) | |
| , DefaultDependency(defaultDependency) | |
| , Attributes(attributes) | |
| { | |
| } | |
| FileSetDescriptor(FileSetLookup lookup) | |
| : Type() | |
| , Lookup(lookup) | |
| , SupportedDependencies({ DependencyMode::Includables }) | |
| , DefaultDependency(DependencyMode::Includables) | |
| { | |
| } | |
| cm::string_view const Type; | |
| FileSetLookup const Lookup; | |
| DependencySet const SupportedDependencies; | |
| DependencyMode const DefaultDependency; | |
| AttributeSet const Attributes; | |
| }; | |
| cm::optional<FileSetDescriptor> GetFileSetDescriptor(cm::string_view type); | |
| DependencyMode GetDependencyMode(cm::string_view type); | |
| DependencyMode GetDependencyMode(cm::string_view type, | |
| DependencyMode requestedMode); | |
| AttributeSet GetAttributes(cm::string_view type); | |
| bool IsFrameworkSupported(cm::string_view type); | |
| std::vector<cm::string_view> const& GetKnownTypes(); | |
| bool IsKnownType(cm::string_view type); | |
| // check validity of a user's file set name | |
| bool IsValidName(cm::string_view type); | |
| } | |
| } | |
| CM_ENUM_SET_TRAITS(cm::FileSetMetadata::AttributeSet) | |
| CM_ENUM_SET_TRAITS(cm::FileSetMetadata::FileSetDomainSet) |