Files
cmake/Source/cmStateSnapshot.h
Arha Gatram 86759dce81 enable_language: add support for usage in subdirectories
Propagates variables set in enable_language() logic up variable scopes
so that the language can be used by targets in the ancestor directories.
Works through block() and function() scopes as well. The
add_subdirectory() call can be thought of as the effective call site for
enabling the language. The same holds for endblock() and the actual
function call.

Adds a policy CMP0220 to control this behavior. As the language is
"enabled" at each ancestor scope, the policy is checked. If OLD, the
language is not enabled at this scope and the ones above.

Closes: #27881 #27508 #27389
Related: #26751 #27564
2026-08-07 11:05:57 -04:00

137 lines
4.4 KiB
C++

/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file LICENSE.rst or https://cmake.org/licensing for details. */
#pragma once
#include "cmConfigure.h" // IWYU pragma: keep
#include <string>
#include <vector>
#include <cm/string_view>
#include "cmDiagnostics.h"
#include "cmPolicies.h"
#include "cmStateTypes.h"
#include "cmValue.h"
class cmPackageState;
class cmState;
class cmStateDirectory;
class cmStateSnapshot
{
public:
cmStateSnapshot(cmState* state = nullptr);
cmStateSnapshot(cmState* state, cmStateDetail::PositionType position);
cmValue GetDefinition(std::string const& name) const;
bool IsInitialized(std::string const& name) const;
void SetDefinition(std::string const& name, cm::string_view value);
void RemoveDefinition(std::string const& name);
std::vector<std::string> ClosureKeys() const;
std::vector<std::string> LocalKeys() const;
bool RaiseScope(std::string const& var, char const* varDef);
enum class CheckCMP0220
{
No,
Yes,
};
enum class WarnCMP0220
{
No,
Yes,
};
WarnCMP0220 RaiseToRoot(std::string const& var, char const* varDef,
CheckCMP0220 checkCMP0220);
void SetListFile(std::string const& listfile);
std::string const& GetExecutionListFile() const;
std::vector<cmStateSnapshot> GetChildren();
bool IsValid() const;
cmStateSnapshot GetBuildsystemDirectory() const;
cmStateSnapshot GetBuildsystemDirectoryParent() const;
cmStateSnapshot GetCallStackParent() const;
cmStateSnapshot GetCallStackBottom() const;
cmStateEnums::SnapshotType GetType() const;
cmStateEnums::SnapshotUnwindType GetUnwindType() const;
void SetUnwindType(cmStateEnums::SnapshotUnwindType type);
cmStateEnums::SnapshotUnwindState GetUnwindState() const;
void SetUnwindState(cmStateEnums::SnapshotUnwindState state);
void SetPolicy(cmPolicies::PolicyID id, cmPolicies::PolicyStatus status);
cmPolicies::PolicyStatus GetPolicy(cmPolicies::PolicyID id,
bool parent_scope = false) const;
cmPolicies::PolicyStatus GetScopePolicy(cmPolicies::PolicyID id) const;
void PushPolicy(cmPolicies::PolicyMap const& entry, bool weak);
bool PopPolicy();
bool CanPopPolicyScope() const;
void SetDiagnostic(cmDiagnosticCategory category, cmDiagnosticAction action,
bool recursive);
void PromoteDiagnostic(cmDiagnosticCategory category,
cmDiagnosticAction action, bool recursive);
void DemoteDiagnostic(cmDiagnosticCategory category,
cmDiagnosticAction action, bool recursive);
cmDiagnosticAction GetDiagnostic(cmDiagnosticCategory category,
cmDiagnosticAction defaultAction) const;
cmDiagnosticAction GetDiagnostic(cmDiagnosticCategory category) const
{
return this->GetDiagnostic(
category, cmDiagnostics::CategoryInfo[category].DefaultAction);
}
void PushDiagnostic(cmDiagnostics::DiagnosticMap entry, bool weak);
bool PopDiagnostic();
bool CanPopDiagnosticScope() const;
cmState* GetState() const;
cmStateDirectory GetDirectory() const;
void SetProjectName(std::string const& name);
std::string GetProjectName() const;
bool CheckProjectName(std::string const& name) const;
cmPackageState& GetPackageState(std::string const& packagePath);
void InitializeFromParent_ForSubdirsCommand();
struct StrictWeakOrder
{
bool operator()(cmStateSnapshot const& lhs,
cmStateSnapshot const& rhs) const;
};
void SetDirectoryDefinitions();
void SetDefaultDefinitions();
private:
friend bool operator==(cmStateSnapshot const& lhs,
cmStateSnapshot const& rhs);
friend bool operator!=(cmStateSnapshot const& lhs,
cmStateSnapshot const& rhs);
friend class cmState;
friend class cmStateDirectory;
friend struct StrictWeakOrder;
void InitializeFromParent();
using AlterDiagnosticFunction = bool (*)(cmDiagnosticAction current,
cmDiagnosticAction desired);
void AlterDiagnostic(cmDiagnosticCategory category,
cmDiagnosticAction action,
AlterDiagnosticFunction function, bool recursive);
cmState* State;
cmStateDetail::PositionType Position;
};
bool operator==(cmStateSnapshot const& lhs, cmStateSnapshot const& rhs);
bool operator!=(cmStateSnapshot const& lhs, cmStateSnapshot const& rhs);