From f0005bb484bc2b85a169ef7816e33d8e2f16e109 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Sat, 1 Aug 2015 07:16:40 +0200 Subject: [PATCH 1/9] Tests: Verify generate-time policy scope behavior. If some day there are no policies checked through the makefile at generate time, this can be fixed. --- Tests/RunCMake/CMakeLists.txt | 1 + Tests/RunCMake/PolicyScope/CMakeLists.txt | 3 +++ Tests/RunCMake/PolicyScope/RunCMakeTest.cmake | 4 ++++ .../PolicyScope/dir-in-macro-generate-time-result.txt | 1 + .../PolicyScope/dir-in-macro-generate-time-stderr.txt | 5 +++++ .../RunCMake/PolicyScope/dir-in-macro-generate-time.cmake | 2 ++ Tests/RunCMake/PolicyScope/dir-in-macro-include.cmake | 6 ++++++ Tests/RunCMake/PolicyScope/dir1/CMakeLists.txt | 5 +++++ Tests/RunCMake/PolicyScope/dir1/foo.cpp | 5 +++++ .../PolicyScope/parent-dir-generate-time-result.txt | 1 + Tests/RunCMake/PolicyScope/parent-dir-generate-time.cmake | 7 +++++++ 11 files changed, 40 insertions(+) create mode 100644 Tests/RunCMake/PolicyScope/CMakeLists.txt create mode 100644 Tests/RunCMake/PolicyScope/RunCMakeTest.cmake create mode 100644 Tests/RunCMake/PolicyScope/dir-in-macro-generate-time-result.txt create mode 100644 Tests/RunCMake/PolicyScope/dir-in-macro-generate-time-stderr.txt create mode 100644 Tests/RunCMake/PolicyScope/dir-in-macro-generate-time.cmake create mode 100644 Tests/RunCMake/PolicyScope/dir-in-macro-include.cmake create mode 100644 Tests/RunCMake/PolicyScope/dir1/CMakeLists.txt create mode 100644 Tests/RunCMake/PolicyScope/dir1/foo.cpp create mode 100644 Tests/RunCMake/PolicyScope/parent-dir-generate-time-result.txt create mode 100644 Tests/RunCMake/PolicyScope/parent-dir-generate-time.cmake diff --git a/Tests/RunCMake/CMakeLists.txt b/Tests/RunCMake/CMakeLists.txt index 607e79977..c4579d781 100644 --- a/Tests/RunCMake/CMakeLists.txt +++ b/Tests/RunCMake/CMakeLists.txt @@ -145,6 +145,7 @@ add_RunCMake_test(TargetSources) add_RunCMake_test(find_dependency) add_RunCMake_test(CompileDefinitions) add_RunCMake_test(CompileFeatures) +add_RunCMake_test(PolicyScope) add_RunCMake_test(WriteCompilerDetectionHeader) if(NOT WIN32) add_RunCMake_test(PositionIndependentCode) diff --git a/Tests/RunCMake/PolicyScope/CMakeLists.txt b/Tests/RunCMake/PolicyScope/CMakeLists.txt new file mode 100644 index 000000000..667561ea7 --- /dev/null +++ b/Tests/RunCMake/PolicyScope/CMakeLists.txt @@ -0,0 +1,3 @@ +cmake_minimum_required(VERSION 2.8.12) +project(${RunCMake_TEST} NONE) +include(${RunCMake_TEST}.cmake NO_POLICY_SCOPE) diff --git a/Tests/RunCMake/PolicyScope/RunCMakeTest.cmake b/Tests/RunCMake/PolicyScope/RunCMakeTest.cmake new file mode 100644 index 000000000..d6c021fc3 --- /dev/null +++ b/Tests/RunCMake/PolicyScope/RunCMakeTest.cmake @@ -0,0 +1,4 @@ +include(RunCMake) + +run_cmake(parent-dir-generate-time) +run_cmake(dir-in-macro-generate-time) diff --git a/Tests/RunCMake/PolicyScope/dir-in-macro-generate-time-result.txt b/Tests/RunCMake/PolicyScope/dir-in-macro-generate-time-result.txt new file mode 100644 index 000000000..573541ac9 --- /dev/null +++ b/Tests/RunCMake/PolicyScope/dir-in-macro-generate-time-result.txt @@ -0,0 +1 @@ +0 diff --git a/Tests/RunCMake/PolicyScope/dir-in-macro-generate-time-stderr.txt b/Tests/RunCMake/PolicyScope/dir-in-macro-generate-time-stderr.txt new file mode 100644 index 000000000..d223f42a8 --- /dev/null +++ b/Tests/RunCMake/PolicyScope/dir-in-macro-generate-time-stderr.txt @@ -0,0 +1,5 @@ +CMake Warning \(dev\) at dir1/CMakeLists.txt:5 \(target_compile_definitions\): + Policy CMP0044 is not set: Case sensitive _COMPILER_ID generator + expressions. Run "cmake --help-policy CMP0044" for policy details. Use + the cmake_policy command to set the policy and suppress this warning. +This warning is for project developers. Use -Wno-dev to suppress it. diff --git a/Tests/RunCMake/PolicyScope/dir-in-macro-generate-time.cmake b/Tests/RunCMake/PolicyScope/dir-in-macro-generate-time.cmake new file mode 100644 index 000000000..04a7c2c7f --- /dev/null +++ b/Tests/RunCMake/PolicyScope/dir-in-macro-generate-time.cmake @@ -0,0 +1,2 @@ + +include(dir-in-macro-include.cmake) diff --git a/Tests/RunCMake/PolicyScope/dir-in-macro-include.cmake b/Tests/RunCMake/PolicyScope/dir-in-macro-include.cmake new file mode 100644 index 000000000..fd326f12c --- /dev/null +++ b/Tests/RunCMake/PolicyScope/dir-in-macro-include.cmake @@ -0,0 +1,6 @@ + +enable_language(CXX) + +# This does not affect dir1 despite being set before the add_subdirectory. +cmake_policy(SET CMP0044 NEW) +add_subdirectory(dir1) diff --git a/Tests/RunCMake/PolicyScope/dir1/CMakeLists.txt b/Tests/RunCMake/PolicyScope/dir1/CMakeLists.txt new file mode 100644 index 000000000..16bcb3689 --- /dev/null +++ b/Tests/RunCMake/PolicyScope/dir1/CMakeLists.txt @@ -0,0 +1,5 @@ + + +add_library(foo STATIC foo.cpp) +string(TOLOWER ${CMAKE_CXX_COMPILER_ID} compiler_id) +target_compile_definitions(foo PRIVATE Foo=$) diff --git a/Tests/RunCMake/PolicyScope/dir1/foo.cpp b/Tests/RunCMake/PolicyScope/dir1/foo.cpp new file mode 100644 index 000000000..766b7751b --- /dev/null +++ b/Tests/RunCMake/PolicyScope/dir1/foo.cpp @@ -0,0 +1,5 @@ + +int main() +{ + return 0; +} diff --git a/Tests/RunCMake/PolicyScope/parent-dir-generate-time-result.txt b/Tests/RunCMake/PolicyScope/parent-dir-generate-time-result.txt new file mode 100644 index 000000000..573541ac9 --- /dev/null +++ b/Tests/RunCMake/PolicyScope/parent-dir-generate-time-result.txt @@ -0,0 +1 @@ +0 diff --git a/Tests/RunCMake/PolicyScope/parent-dir-generate-time.cmake b/Tests/RunCMake/PolicyScope/parent-dir-generate-time.cmake new file mode 100644 index 000000000..a0842f7b2 --- /dev/null +++ b/Tests/RunCMake/PolicyScope/parent-dir-generate-time.cmake @@ -0,0 +1,7 @@ + +enable_language(CXX) + +add_subdirectory(dir1) + +# This affects dir1 despite being set after the add_subdirectory. +cmake_policy(SET CMP0044 NEW) From 0a01e6c6e7bd428ca0ec99a00924b5b498c6e637 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Sun, 26 Jul 2015 12:54:16 +0200 Subject: [PATCH 2/9] cmState: Add Snapshot Type accessor. --- Source/cmState.cxx | 5 +++++ Source/cmState.h | 1 + 2 files changed, 6 insertions(+) diff --git a/Source/cmState.cxx b/Source/cmState.cxx index d8f8306f9..a46647116 100644 --- a/Source/cmState.cxx +++ b/Source/cmState.cxx @@ -847,6 +847,11 @@ cmState::Snapshot::Snapshot(cmState* state, PositionType position) } +cmState::SnapshotType cmState::Snapshot::GetType() const +{ + return this->Position->SnapshotType; +} + const char* cmState::Directory::GetCurrentSource() const { return this->DirectoryState->Location.c_str(); diff --git a/Source/cmState.h b/Source/cmState.h index 0d5300f75..23fbc79dc 100644 --- a/Source/cmState.h +++ b/Source/cmState.h @@ -56,6 +56,7 @@ public: bool IsValid() const; Snapshot GetBuildsystemDirectoryParent() const; Snapshot GetCallStackParent() const; + SnapshotType GetType() const; void InitializeFromParent(); From a5fc17b5098ee27fd7ae457ca6c5743bacc384a7 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Sun, 26 Jul 2015 16:16:43 +0200 Subject: [PATCH 3/9] cmMakefile: Re-order policy entries and barriers. Make the barriers surround the entries. --- Source/cmMakefile.cxx | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx index 4bdc9d53c..16404cd76 100644 --- a/Source/cmMakefile.cxx +++ b/Source/cmMakefile.cxx @@ -189,12 +189,12 @@ cmMakefile::cmMakefile(cmLocalGenerator* localGenerator) this->cmAtVarRegex.compile("(@[A-Za-z_0-9/.+-]+@)"); this->cmNamedCurly.compile("^[A-Za-z0-9/_.+-]+{"); - // Enter a policy level for this directory. - this->PushPolicy(); - // Protect the directory-level policies. this->PushPolicyBarrier(); + // Enter a policy level for this directory. + this->PushPolicy(); + // push empty loop block this->PushLoopBlockBarrier(); @@ -468,6 +468,7 @@ cmMakefile::IncludeScope::IncludeScope(cmMakefile* mf, Makefile(mf), NoPolicyScope(noPolicyScope), CheckCMP0011(false), ReportError(true) { + this->Makefile->PushPolicyBarrier(); if(!this->NoPolicyScope) { // Check CMP0011 to determine the policy scope type. @@ -497,8 +498,6 @@ cmMakefile::IncludeScope::IncludeScope(cmMakefile* mf, } } - // The included file cannot pop our policy scope. - this->Makefile->PushPolicyBarrier(); this->Makefile->PushFunctionBlockerBarrier(); this->Makefile->StateSnapshot = @@ -518,7 +517,6 @@ cmMakefile::IncludeScope::~IncludeScope() this->Makefile->PopFunctionBlockerBarrier(this->ReportError); // Enforce matching policy scopes inside the included file. - this->Makefile->PopPolicyBarrier(this->ReportError); if(!this->NoPolicyScope) { @@ -541,6 +539,7 @@ cmMakefile::IncludeScope::~IncludeScope() this->EnforceCMP0011(); } } + this->Makefile->PopPolicyBarrier(this->ReportError); } //---------------------------------------------------------------------------- @@ -1640,14 +1639,14 @@ void cmMakefile::PushFunctionScope(std::string const& fileName, this->PushFunctionBlockerBarrier(); - this->PushPolicy(true, pm); this->PushPolicyBarrier(); + this->PushPolicy(true, pm); } void cmMakefile::PopFunctionScope(bool reportError) { - this->PopPolicyBarrier(reportError); this->PopPolicy(); + this->PopPolicyBarrier(reportError); this->StateSnapshot = this->GetState()->Pop(this->StateSnapshot); assert(this->StateSnapshot.IsValid()); @@ -1677,14 +1676,14 @@ void cmMakefile::PushMacroScope(std::string const& fileName, this->PushFunctionBlockerBarrier(); - this->PushPolicy(true, pm); this->PushPolicyBarrier(); + this->PushPolicy(true, pm); } void cmMakefile::PopMacroScope(bool reportError) { - this->PopPolicyBarrier(reportError); this->PopPolicy(); + this->PopPolicyBarrier(reportError); this->StateSnapshot = this->GetState()->Pop(this->StateSnapshot); assert(this->StateSnapshot.IsValid()); @@ -4843,15 +4842,15 @@ cmMakefile::PolicyPushPop::PolicyPushPop(cmMakefile* m, bool weak, cmPolicies::PolicyMap const& pm): Makefile(m), ReportError(true) { - this->Makefile->PushPolicy(weak, pm); this->Makefile->PushPolicyBarrier(); + this->Makefile->PushPolicy(weak, pm); } //---------------------------------------------------------------------------- cmMakefile::PolicyPushPop::~PolicyPushPop() { - this->Makefile->PopPolicyBarrier(this->ReportError); this->Makefile->PopPolicy(); + this->Makefile->PopPolicyBarrier(this->ReportError); } //---------------------------------------------------------------------------- From 6ae8b30bf4127011284a66541ed2116fcb45f007 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Tue, 28 Jul 2015 08:09:49 +0200 Subject: [PATCH 4/9] cmMakefile: Move policy barriers inside cmState scopes. --- Source/cmMakefile.cxx | 43 +++++++++++++++++++++---------------------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx index 16404cd76..2c854dd2f 100644 --- a/Source/cmMakefile.cxx +++ b/Source/cmMakefile.cxx @@ -468,6 +468,14 @@ cmMakefile::IncludeScope::IncludeScope(cmMakefile* mf, Makefile(mf), NoPolicyScope(noPolicyScope), CheckCMP0011(false), ReportError(true) { + this->Makefile->PushFunctionBlockerBarrier(); + + this->Makefile->StateSnapshot = + this->Makefile->GetState()->CreateCallStackSnapshot( + this->Makefile->StateSnapshot, + this->Makefile->ContextStack.back()->Name, + this->Makefile->ContextStack.back()->Line, + filenametoread); this->Makefile->PushPolicyBarrier(); if(!this->NoPolicyScope) { @@ -497,27 +505,11 @@ cmMakefile::IncludeScope::IncludeScope(cmMakefile* mf, break; } } - - this->Makefile->PushFunctionBlockerBarrier(); - - this->Makefile->StateSnapshot = - this->Makefile->GetState()->CreateCallStackSnapshot( - this->Makefile->StateSnapshot, - this->Makefile->ContextStack.back()->Name, - this->Makefile->ContextStack.back()->Line, - filenametoread); } //---------------------------------------------------------------------------- cmMakefile::IncludeScope::~IncludeScope() { - this->Makefile->StateSnapshot = - this->Makefile->GetState()->Pop(this->Makefile->StateSnapshot); - assert(this->Makefile->StateSnapshot.IsValid()); - - this->Makefile->PopFunctionBlockerBarrier(this->ReportError); - // Enforce matching policy scopes inside the included file. - if(!this->NoPolicyScope) { // If we need to enforce policy CMP0011 then the top entry is the @@ -540,6 +532,11 @@ cmMakefile::IncludeScope::~IncludeScope() } } this->Makefile->PopPolicyBarrier(this->ReportError); + this->Makefile->StateSnapshot = + this->Makefile->GetState()->Pop(this->Makefile->StateSnapshot); + assert(this->Makefile->StateSnapshot.IsValid()); + + this->Makefile->PopFunctionBlockerBarrier(this->ReportError); } //---------------------------------------------------------------------------- @@ -634,8 +631,6 @@ public: ListFileScope(cmMakefile* mf, std::string const& filenametoread) : Makefile(mf), ReportError(true) { - this->Makefile->PushPolicyBarrier(); - long line = 0; std::string name; if (!this->Makefile->ContextStack.empty()) @@ -647,17 +642,21 @@ public: this->Makefile->GetState()->CreateInlineListFileSnapshot( this->Makefile->StateSnapshot, name, line, filenametoread); assert(this->Makefile->StateSnapshot.IsValid()); + + this->Makefile->PushPolicyBarrier(); + this->Makefile->PushFunctionBlockerBarrier(); } ~ListFileScope() { + this->Makefile->PopPolicyBarrier(this->ReportError); + this->Makefile->StateSnapshot = this->Makefile->GetState()->Pop(this->Makefile->StateSnapshot); assert(this->Makefile->StateSnapshot.IsValid()); this->Makefile->PopFunctionBlockerBarrier(this->ReportError); - this->Makefile->PopPolicyBarrier(this->ReportError); } void Quiet() { this->ReportError = false; } @@ -1628,6 +1627,7 @@ void cmMakefile::PushFunctionScope(std::string const& fileName, this->ContextStack.back()->Name, this->ContextStack.back()->Line, fileName); assert(this->StateSnapshot.IsValid()); + this->PushPolicyBarrier(); this->Internal->PushDefinitions(); @@ -1639,15 +1639,14 @@ void cmMakefile::PushFunctionScope(std::string const& fileName, this->PushFunctionBlockerBarrier(); - this->PushPolicyBarrier(); this->PushPolicy(true, pm); } void cmMakefile::PopFunctionScope(bool reportError) { this->PopPolicy(); - this->PopPolicyBarrier(reportError); + this->PopPolicyBarrier(reportError); this->StateSnapshot = this->GetState()->Pop(this->StateSnapshot); assert(this->StateSnapshot.IsValid()); @@ -1673,10 +1672,10 @@ void cmMakefile::PushMacroScope(std::string const& fileName, this->ContextStack.back()->Name, this->ContextStack.back()->Line, fileName); assert(this->StateSnapshot.IsValid()); + this->PushPolicyBarrier(); this->PushFunctionBlockerBarrier(); - this->PushPolicyBarrier(); this->PushPolicy(true, pm); } From af0de01c6b3395fb1dba5d2ee0a94c19a9b464e9 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Sat, 1 Aug 2015 07:29:36 +0200 Subject: [PATCH 5/9] cmState: Remove call stack parent tracking. This was added at a time when I thought the cmState would report errors, but that is not the direction it is going. The ordering of the stack of scopes is canonical and clients are required to maintain it. --- Source/cmState.cxx | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/Source/cmState.cxx b/Source/cmState.cxx index a46647116..a7df040a6 100644 --- a/Source/cmState.cxx +++ b/Source/cmState.cxx @@ -20,7 +20,6 @@ struct cmState::SnapshotDataType { - cmState::PositionType CallStackParent; cmState::PositionType DirectoryParent; cmState::SnapshotType SnapshotType; cmLinkedTree::iterator ExecutionListFile; @@ -732,7 +731,6 @@ cmState::CreateBuildsystemDirectorySnapshot(Snapshot originSnapshot, { assert(originSnapshot.IsValid()); PositionType pos = this->SnapshotData.Extend(originSnapshot.Position); - pos->CallStackParent = originSnapshot.Position; pos->EntryPointLine = entryPointLine; pos->EntryPointCommand = entryPointCommand; pos->DirectoryParent = originSnapshot.Position; @@ -754,7 +752,6 @@ cmState::CreateFunctionCallSnapshot(cmState::Snapshot originSnapshot, { PositionType pos = this->SnapshotData.Extend(originSnapshot.Position, *originSnapshot.Position); - pos->CallStackParent = originSnapshot.Position; pos->EntryPointLine = entryPointLine; pos->EntryPointCommand = entryPointCommand; pos->SnapshotType = FunctionCallType; @@ -772,7 +769,6 @@ cmState::CreateMacroCallSnapshot(cmState::Snapshot originSnapshot, { PositionType pos = this->SnapshotData.Extend(originSnapshot.Position, *originSnapshot.Position); - pos->CallStackParent = originSnapshot.Position; pos->EntryPointLine = entryPointLine; pos->EntryPointCommand = entryPointCommand; pos->SnapshotType = MacroCallType; @@ -789,7 +785,6 @@ cmState::CreateCallStackSnapshot(cmState::Snapshot originSnapshot, { PositionType pos = this->SnapshotData.Extend(originSnapshot.Position, *originSnapshot.Position); - pos->CallStackParent = originSnapshot.Position; pos->EntryPointLine = entryPointLine; pos->EntryPointCommand = entryPointCommand; pos->SnapshotType = CallStackType; @@ -806,7 +801,6 @@ cmState::CreateInlineListFileSnapshot(cmState::Snapshot originSnapshot, { PositionType pos = this->SnapshotData.Extend(originSnapshot.Position, *originSnapshot.Position); - pos->CallStackParent = originSnapshot.Position; pos->EntryPointLine = entryPointLine; pos->EntryPointCommand = entryPointCommand; pos->SnapshotType = InlineListFileType; @@ -827,11 +821,7 @@ cmState::Snapshot cmState::Pop(cmState::Snapshot originSnapshot) prevPos->CompileOptionsPosition = prevPos->BuildSystemDirectory->CompileOptions.size(); - if (prevPos == this->SnapshotData.Root()) - { - return Snapshot(this, prevPos); - } - return Snapshot(this, originSnapshot.Position->CallStackParent); + return Snapshot(this, prevPos); } cmState::Snapshot::Snapshot(cmState* state) From 348354333a82ce98d733dc2ee939186c53c506f9 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Sun, 26 Jul 2015 12:56:10 +0200 Subject: [PATCH 6/9] cmState: Add Type for policy scope. --- Source/cmMakefile.cxx | 11 +++++++++++ Source/cmState.cxx | 22 ++++++++++++++++++++-- Source/cmState.h | 4 +++- 3 files changed, 34 insertions(+), 3 deletions(-) diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx index 2c854dd2f..9fb3d0697 100644 --- a/Source/cmMakefile.cxx +++ b/Source/cmMakefile.cxx @@ -189,6 +189,9 @@ cmMakefile::cmMakefile(cmLocalGenerator* localGenerator) this->cmAtVarRegex.compile("(@[A-Za-z_0-9/.+-]+@)"); this->cmNamedCurly.compile("^[A-Za-z0-9/_.+-]+{"); + this->StateSnapshot = this->StateSnapshot.GetState() + ->CreatePolicyScopeSnapshot(this->StateSnapshot); + // Protect the directory-level policies. this->PushPolicyBarrier(); @@ -1705,6 +1708,8 @@ public: this->Makefile->StateSnapshot.GetDirectory().GetCurrentSource(); currentStart += "/CMakeLists.txt"; this->Makefile->StateSnapshot.SetListFile(currentStart); + this->Makefile->StateSnapshot = this->Makefile->StateSnapshot.GetState() + ->CreatePolicyScopeSnapshot(this->Makefile->StateSnapshot); this->Makefile->PushPolicyBarrier(); this->Makefile->PushFunctionBlockerBarrier(); @@ -1722,6 +1727,8 @@ public: { this->Makefile->PopFunctionBlockerBarrier(this->ReportError); this->Makefile->PopPolicyBarrier(this->ReportError); + this->Makefile->StateSnapshot = this->Makefile->StateSnapshot.GetState() + ->Pop(this->Makefile->StateSnapshot); #if defined(CMAKE_BUILD_WITH_CMAKE) this->GG->GetFileLockPool().PopFileScope(); #endif @@ -4841,6 +4848,8 @@ cmMakefile::PolicyPushPop::PolicyPushPop(cmMakefile* m, bool weak, cmPolicies::PolicyMap const& pm): Makefile(m), ReportError(true) { + this->Makefile->StateSnapshot = this->Makefile->StateSnapshot.GetState() + ->CreatePolicyScopeSnapshot(this->Makefile->StateSnapshot); this->Makefile->PushPolicyBarrier(); this->Makefile->PushPolicy(weak, pm); } @@ -4850,6 +4859,8 @@ cmMakefile::PolicyPushPop::~PolicyPushPop() { this->Makefile->PopPolicy(); this->Makefile->PopPolicyBarrier(this->ReportError); + this->Makefile->StateSnapshot = this->Makefile->StateSnapshot.GetState() + ->Pop(this->Makefile->StateSnapshot); } //---------------------------------------------------------------------------- diff --git a/Source/cmState.cxx b/Source/cmState.cxx index a7df040a6..09446bb08 100644 --- a/Source/cmState.cxx +++ b/Source/cmState.cxx @@ -809,6 +809,15 @@ cmState::CreateInlineListFileSnapshot(cmState::Snapshot originSnapshot, return cmState::Snapshot(this, pos); } +cmState::Snapshot +cmState::CreatePolicyScopeSnapshot(cmState::Snapshot originSnapshot) +{ + PositionType pos = this->SnapshotData.Extend(originSnapshot.Position, + *originSnapshot.Position); + pos->SnapshotType = PolicyScopeType; + return cmState::Snapshot(this, pos); +} + cmState::Snapshot cmState::Pop(cmState::Snapshot originSnapshot) { PositionType pos = originSnapshot.Position; @@ -959,13 +968,22 @@ cmState::Snapshot cmState::Snapshot::GetCallStackParent() const assert(this->Position != this->State->SnapshotData.Root()); Snapshot snapshot; - if (this->Position->SnapshotType == cmState::BuildsystemDirectoryType) + PositionType parentPos = this->Position; + while(parentPos->SnapshotType == cmState::PolicyScopeType) + { + ++parentPos; + } + if (parentPos->SnapshotType == cmState::BuildsystemDirectoryType) { return snapshot; } - PositionType parentPos = this->Position; ++parentPos; + while(parentPos->SnapshotType == cmState::PolicyScopeType) + { + ++parentPos; + } + if (parentPos == this->State->SnapshotData.Root()) { return snapshot; diff --git a/Source/cmState.h b/Source/cmState.h index 23fbc79dc..63b60ef9b 100644 --- a/Source/cmState.h +++ b/Source/cmState.h @@ -37,7 +37,8 @@ public: FunctionCallType, MacroCallType, CallStackType, - InlineListFileType + InlineListFileType, + PolicyScopeType }; class Directory; @@ -148,6 +149,7 @@ public: const std::string& entryPointCommand, long entryPointLine, std::string const& fileName); + Snapshot CreatePolicyScopeSnapshot(Snapshot originSnapshot); Snapshot Pop(Snapshot originSnapshot); enum CacheEntryType{ BOOL=0, PATH, FILEPATH, STRING, INTERNAL,STATIC, From 65a5e0c671fc7d42525a6279aebf9a74de2c97a7 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Sun, 14 Jun 2015 01:38:57 +0200 Subject: [PATCH 7/9] cmLinkedTree: Add Clear API. --- Source/cmLinkedTree.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Source/cmLinkedTree.h b/Source/cmLinkedTree.h index df00b30ff..3bcb94050 100644 --- a/Source/cmLinkedTree.h +++ b/Source/cmLinkedTree.h @@ -155,6 +155,12 @@ public: return iterator(this, 1); } + void Clear() + { + this->UpPositions.clear(); + this->Data.clear(); + } + private: T& GetReference(PositionType pos) { From 52dbe654dea7562564be9d880540e6bc706998ba Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Sat, 1 Aug 2015 07:20:26 +0200 Subject: [PATCH 8/9] cmState: Record the end position of each directory. At generate time, variables and policies are determined from the end state of the cmMakefile. --- Source/cmState.cxx | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/Source/cmState.cxx b/Source/cmState.cxx index 09446bb08..1d24ec611 100644 --- a/Source/cmState.cxx +++ b/Source/cmState.cxx @@ -34,6 +34,8 @@ struct cmState::SnapshotDataType struct cmState::BuildsystemDirectoryStateType { + cmState::PositionType DirectoryEnd; + std::string Location; std::string OutputLocation; @@ -239,6 +241,9 @@ cmState::Snapshot cmState::Reset() this->GlobalProperties.clear(); this->PropertyDefinitions.clear(); + PositionType pos = this->SnapshotData.Truncate(); + this->ExecutionListFiles.Truncate(); + { cmLinkedTree::iterator it = this->BuildsystemDirectory.Truncate(); @@ -248,9 +253,8 @@ cmState::Snapshot cmState::Reset() it->CompileDefinitionsBacktraces.clear(); it->CompileOptions.clear(); it->CompileOptionsBacktraces.clear(); + it->DirectoryEnd = pos; } - PositionType pos = this->SnapshotData.Truncate(); - this->ExecutionListFiles.Truncate(); this->DefineProperty ("RULE_LAUNCH_COMPILE", cmProperty::DIRECTORY, @@ -721,6 +725,7 @@ cmState::Snapshot cmState::CreateBaseSnapshot() pos->IncludeDirectoryPosition = 0; pos->CompileDefinitionsPosition = 0; pos->CompileOptionsPosition = 0; + pos->BuildSystemDirectory->DirectoryEnd = pos; return cmState::Snapshot(this, pos); } @@ -741,6 +746,7 @@ cmState::CreateBuildsystemDirectorySnapshot(Snapshot originSnapshot, pos->ExecutionListFile = this->ExecutionListFiles.Extend( originSnapshot.Position->ExecutionListFile); + pos->BuildSystemDirectory->DirectoryEnd = pos; return cmState::Snapshot(this, pos); } @@ -757,6 +763,7 @@ cmState::CreateFunctionCallSnapshot(cmState::Snapshot originSnapshot, pos->SnapshotType = FunctionCallType; pos->ExecutionListFile = this->ExecutionListFiles.Extend( originSnapshot.Position->ExecutionListFile, fileName); + pos->BuildSystemDirectory->DirectoryEnd = pos; return cmState::Snapshot(this, pos); } @@ -774,6 +781,7 @@ cmState::CreateMacroCallSnapshot(cmState::Snapshot originSnapshot, pos->SnapshotType = MacroCallType; pos->ExecutionListFile = this->ExecutionListFiles.Extend( originSnapshot.Position->ExecutionListFile, fileName); + pos->BuildSystemDirectory->DirectoryEnd = pos; return cmState::Snapshot(this, pos); } @@ -790,6 +798,7 @@ cmState::CreateCallStackSnapshot(cmState::Snapshot originSnapshot, pos->SnapshotType = CallStackType; pos->ExecutionListFile = this->ExecutionListFiles.Extend( originSnapshot.Position->ExecutionListFile, fileName); + pos->BuildSystemDirectory->DirectoryEnd = pos; return cmState::Snapshot(this, pos); } @@ -806,6 +815,7 @@ cmState::CreateInlineListFileSnapshot(cmState::Snapshot originSnapshot, pos->SnapshotType = InlineListFileType; pos->ExecutionListFile = this->ExecutionListFiles.Extend( originSnapshot.Position->ExecutionListFile, fileName); + pos->BuildSystemDirectory->DirectoryEnd = pos; return cmState::Snapshot(this, pos); } @@ -815,6 +825,7 @@ cmState::CreatePolicyScopeSnapshot(cmState::Snapshot originSnapshot) PositionType pos = this->SnapshotData.Extend(originSnapshot.Position, *originSnapshot.Position); pos->SnapshotType = PolicyScopeType; + pos->BuildSystemDirectory->DirectoryEnd = pos; return cmState::Snapshot(this, pos); } @@ -829,6 +840,7 @@ cmState::Snapshot cmState::Pop(cmState::Snapshot originSnapshot) prevPos->BuildSystemDirectory->CompileDefinitions.size(); prevPos->CompileOptionsPosition = prevPos->BuildSystemDirectory->CompileOptions.size(); + prevPos->BuildSystemDirectory->DirectoryEnd = prevPos; return Snapshot(this, prevPos); } From 757a1f54085af4645ee1946329e24538162ac054 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Sun, 26 Jul 2015 13:04:09 +0200 Subject: [PATCH 9/9] cmState: Move PolicyState from cmMakefile. Implement lexical scope checking in terms of the state stack instead of barriers. --- Source/cmMakefile.cxx | 93 ++++----------------------------- Source/cmMakefile.h | 13 ----- Source/cmState.cxx | 116 ++++++++++++++++++++++++++++++++++++++++++ Source/cmState.h | 10 ++++ 4 files changed, 135 insertions(+), 97 deletions(-) diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx index 9fb3d0697..a0a36ecf6 100644 --- a/Source/cmMakefile.cxx +++ b/Source/cmMakefile.cxx @@ -192,9 +192,6 @@ cmMakefile::cmMakefile(cmLocalGenerator* localGenerator) this->StateSnapshot = this->StateSnapshot.GetState() ->CreatePolicyScopeSnapshot(this->StateSnapshot); - // Protect the directory-level policies. - this->PushPolicyBarrier(); - // Enter a policy level for this directory. this->PushPolicy(); @@ -239,11 +236,6 @@ cmMakefile::~cmMakefile() cmDeleteAll(this->FinalPassCommands); cmDeleteAll(this->FunctionBlockers); this->FunctionBlockers.clear(); - if (this->PolicyStack.size() != 1) - { - cmSystemTools::Error("Internal CMake Error, Policy Stack has not been" - " popped properly"); - } } //---------------------------------------------------------------------------- @@ -479,7 +471,6 @@ cmMakefile::IncludeScope::IncludeScope(cmMakefile* mf, this->Makefile->ContextStack.back()->Name, this->Makefile->ContextStack.back()->Line, filenametoread); - this->Makefile->PushPolicyBarrier(); if(!this->NoPolicyScope) { // Check CMP0011 to determine the policy scope type. @@ -519,7 +510,8 @@ cmMakefile::IncludeScope::~IncludeScope() // one we pushed above. If the entry is empty, then the included // script did not set any policies that might affect the includer so // we do not need to enforce the policy. - if(this->CheckCMP0011 && this->Makefile->PolicyStack.back().IsEmpty()) + if(this->CheckCMP0011 + && !this->Makefile->StateSnapshot.HasDefinedPolicyCMP0011()) { this->CheckCMP0011 = false; } @@ -535,9 +527,6 @@ cmMakefile::IncludeScope::~IncludeScope() } } this->Makefile->PopPolicyBarrier(this->ReportError); - this->Makefile->StateSnapshot = - this->Makefile->GetState()->Pop(this->Makefile->StateSnapshot); - assert(this->Makefile->StateSnapshot.IsValid()); this->Makefile->PopFunctionBlockerBarrier(this->ReportError); } @@ -646,19 +635,12 @@ public: this->Makefile->StateSnapshot, name, line, filenametoread); assert(this->Makefile->StateSnapshot.IsValid()); - this->Makefile->PushPolicyBarrier(); - this->Makefile->PushFunctionBlockerBarrier(); } ~ListFileScope() { this->Makefile->PopPolicyBarrier(this->ReportError); - - this->Makefile->StateSnapshot = - this->Makefile->GetState()->Pop(this->Makefile->StateSnapshot); - assert(this->Makefile->StateSnapshot.IsValid()); - this->Makefile->PopFunctionBlockerBarrier(this->ReportError); } @@ -1630,7 +1612,6 @@ void cmMakefile::PushFunctionScope(std::string const& fileName, this->ContextStack.back()->Name, this->ContextStack.back()->Line, fileName); assert(this->StateSnapshot.IsValid()); - this->PushPolicyBarrier(); this->Internal->PushDefinitions(); @@ -1650,8 +1631,6 @@ void cmMakefile::PopFunctionScope(bool reportError) this->PopPolicy(); this->PopPolicyBarrier(reportError); - this->StateSnapshot = this->GetState()->Pop(this->StateSnapshot); - assert(this->StateSnapshot.IsValid()); this->PopFunctionBlockerBarrier(reportError); @@ -1675,7 +1654,6 @@ void cmMakefile::PushMacroScope(std::string const& fileName, this->ContextStack.back()->Name, this->ContextStack.back()->Line, fileName); assert(this->StateSnapshot.IsValid()); - this->PushPolicyBarrier(); this->PushFunctionBlockerBarrier(); @@ -1687,9 +1665,6 @@ void cmMakefile::PopMacroScope(bool reportError) this->PopPolicy(); this->PopPolicyBarrier(reportError); - this->StateSnapshot = this->GetState()->Pop(this->StateSnapshot); - assert(this->StateSnapshot.IsValid()); - this->PopFunctionBlockerBarrier(reportError); } @@ -1710,7 +1685,6 @@ public: this->Makefile->StateSnapshot.SetListFile(currentStart); this->Makefile->StateSnapshot = this->Makefile->StateSnapshot.GetState() ->CreatePolicyScopeSnapshot(this->Makefile->StateSnapshot); - this->Makefile->PushPolicyBarrier(); this->Makefile->PushFunctionBlockerBarrier(); this->GG = mf->GetGlobalGenerator(); @@ -1727,8 +1701,6 @@ public: { this->Makefile->PopFunctionBlockerBarrier(this->ReportError); this->Makefile->PopPolicyBarrier(this->ReportError); - this->Makefile->StateSnapshot = this->Makefile->StateSnapshot.GetState() - ->Pop(this->Makefile->StateSnapshot); #if defined(CMAKE_BUILD_WITH_CMAKE) this->GG->GetFileLockPool().PopFileScope(); #endif @@ -4759,30 +4731,7 @@ const char* cmMakefile::GetDefineFlagsCMP0059() const cmPolicies::PolicyStatus cmMakefile::GetPolicyStatus(cmPolicies::PolicyID id) const { - cmPolicies::PolicyStatus status = cmPolicies::GetPolicyStatus(id); - - if(status == cmPolicies::REQUIRED_ALWAYS || - status == cmPolicies::REQUIRED_IF_USED) - { - return status; - } - - cmLocalGenerator* lg = this->LocalGenerator; - while(lg) - { - cmMakefile const* mf = lg->GetMakefile(); - for(PolicyStackType::const_reverse_iterator psi = - mf->PolicyStack.rbegin(); psi != mf->PolicyStack.rend(); ++psi) - { - if(psi->IsDefined(id)) - { - status = psi->Get(id); - return status; - } - } - lg = lg->GetParent(); - } - return status; + return this->StateSnapshot.GetPolicy(id); } //---------------------------------------------------------------------------- @@ -4831,15 +4780,7 @@ bool cmMakefile::SetPolicy(cmPolicies::PolicyID id, return false; } - // Update the policy stack from the top to the top-most strong entry. - bool previous_was_weak = true; - for(PolicyStackType::reverse_iterator psi = this->PolicyStack.rbegin(); - previous_was_weak && psi != this->PolicyStack.rend(); ++psi) - { - psi->Set(id, status); - previous_was_weak = psi->Weak; - } - + this->StateSnapshot.SetPolicy(id, status); return true; } @@ -4850,7 +4791,6 @@ cmMakefile::PolicyPushPop::PolicyPushPop(cmMakefile* m, bool weak, { this->Makefile->StateSnapshot = this->Makefile->StateSnapshot.GetState() ->CreatePolicyScopeSnapshot(this->Makefile->StateSnapshot); - this->Makefile->PushPolicyBarrier(); this->Makefile->PushPolicy(weak, pm); } @@ -4859,43 +4799,28 @@ cmMakefile::PolicyPushPop::~PolicyPushPop() { this->Makefile->PopPolicy(); this->Makefile->PopPolicyBarrier(this->ReportError); - this->Makefile->StateSnapshot = this->Makefile->StateSnapshot.GetState() - ->Pop(this->Makefile->StateSnapshot); } //---------------------------------------------------------------------------- void cmMakefile::PushPolicy(bool weak, cmPolicies::PolicyMap const& pm) { - // Allocate a new stack entry. - this->PolicyStack.push_back(PolicyStackEntry(pm, weak)); + this->StateSnapshot.PushPolicy(pm, weak); } //---------------------------------------------------------------------------- void cmMakefile::PopPolicy() { - if(this->PolicyStack.size() > this->PolicyBarriers.back()) - { - this->PolicyStack.pop_back(); - } - else + if (!this->StateSnapshot.PopPolicy()) { this->IssueMessage(cmake::FATAL_ERROR, "cmake_policy POP without matching PUSH"); } } -//---------------------------------------------------------------------------- -void cmMakefile::PushPolicyBarrier() -{ - this->PolicyBarriers.push_back(this->PolicyStack.size()); -} - //---------------------------------------------------------------------------- void cmMakefile::PopPolicyBarrier(bool reportError) { - // Remove any extra entries pushed on the barrier. - PolicyStackType::size_type barrier = this->PolicyBarriers.back(); - while(this->PolicyStack.size() > barrier) + while (!this->StateSnapshot.CanPopPolicyScope()) { if(reportError) { @@ -4906,8 +4831,8 @@ void cmMakefile::PopPolicyBarrier(bool reportError) this->PopPolicy(); } - // Remove the barrier. - this->PolicyBarriers.pop_back(); + this->StateSnapshot = this->GetState()->Pop(this->StateSnapshot); + assert(this->StateSnapshot.IsValid()); } //---------------------------------------------------------------------------- diff --git a/Source/cmMakefile.h b/Source/cmMakefile.h index 1e5c301e9..173914e2e 100644 --- a/Source/cmMakefile.h +++ b/Source/cmMakefile.h @@ -909,7 +909,6 @@ private: void PushPolicy(bool weak = false, cmPolicies::PolicyMap const& pm = cmPolicies::PolicyMap()); void PopPolicy(); - void PushPolicyBarrier(); void PopPolicyBarrier(bool reportError = true); friend class cmCMakePolicyCommand; class IncludeScope; @@ -919,18 +918,6 @@ private: class BuildsystemFileScope; friend class BuildsystemFileScope; - // stack of policy settings - struct PolicyStackEntry: public cmPolicies::PolicyMap - { - typedef cmPolicies::PolicyMap derived; - PolicyStackEntry(bool w = false): derived(), Weak(w) {} - PolicyStackEntry(derived const& d, bool w = false): derived(d), Weak(w) {} - PolicyStackEntry(PolicyStackEntry const& r): derived(r), Weak(r.Weak) {} - bool Weak; - }; - typedef std::vector PolicyStackType; - PolicyStackType PolicyStack; - std::vector PolicyBarriers; // CMP0053 == old cmake::MessageType ExpandVariablesInStringOld( diff --git a/Source/cmState.cxx b/Source/cmState.cxx index 1d24ec611..f42586114 100644 --- a/Source/cmState.cxx +++ b/Source/cmState.cxx @@ -21,6 +21,9 @@ struct cmState::SnapshotDataType { cmState::PositionType DirectoryParent; + cmLinkedTree::iterator Policies; + cmLinkedTree::iterator PolicyRoot; + cmLinkedTree::iterator PolicyScope; cmState::SnapshotType SnapshotType; cmLinkedTree::iterator ExecutionListFile; cmLinkedTree::iterator @@ -32,6 +35,15 @@ struct cmState::SnapshotDataType std::vector::size_type CompileOptionsPosition; }; +struct cmState::PolicyStackEntry: public cmPolicies::PolicyMap +{ + typedef cmPolicies::PolicyMap derived; + PolicyStackEntry(bool w = false): derived(), Weak(w) {} + PolicyStackEntry(derived const& d, bool w): derived(d), Weak(w) {} + PolicyStackEntry(PolicyStackEntry const& r): derived(r), Weak(r.Weak) {} + bool Weak; +}; + struct cmState::BuildsystemDirectoryStateType { cmState::PositionType DirectoryEnd; @@ -256,6 +268,13 @@ cmState::Snapshot cmState::Reset() it->DirectoryEnd = pos; } + this->PolicyStack.Clear(); + pos->Policies = this->PolicyStack.Root(); + pos->PolicyRoot = this->PolicyStack.Root(); + pos->PolicyScope = this->PolicyStack.Root(); + assert(pos->Policies.IsValid()); + assert(pos->PolicyRoot.IsValid()); + this->DefineProperty ("RULE_LAUNCH_COMPILE", cmProperty::DIRECTORY, "", "", true); @@ -726,6 +745,11 @@ cmState::Snapshot cmState::CreateBaseSnapshot() pos->CompileDefinitionsPosition = 0; pos->CompileOptionsPosition = 0; pos->BuildSystemDirectory->DirectoryEnd = pos; + pos->Policies = this->PolicyStack.Root(); + pos->PolicyRoot = this->PolicyStack.Root(); + pos->PolicyScope = this->PolicyStack.Root(); + assert(pos->Policies.IsValid()); + assert(pos->PolicyRoot.IsValid()); return cmState::Snapshot(this, pos); } @@ -747,6 +771,11 @@ cmState::CreateBuildsystemDirectorySnapshot(Snapshot originSnapshot, this->ExecutionListFiles.Extend( originSnapshot.Position->ExecutionListFile); pos->BuildSystemDirectory->DirectoryEnd = pos; + pos->Policies = originSnapshot.Position->Policies; + pos->PolicyRoot = originSnapshot.Position->Policies; + pos->PolicyScope = originSnapshot.Position->Policies; + assert(pos->Policies.IsValid()); + assert(pos->PolicyRoot.IsValid()); return cmState::Snapshot(this, pos); } @@ -764,6 +793,7 @@ cmState::CreateFunctionCallSnapshot(cmState::Snapshot originSnapshot, pos->ExecutionListFile = this->ExecutionListFiles.Extend( originSnapshot.Position->ExecutionListFile, fileName); pos->BuildSystemDirectory->DirectoryEnd = pos; + pos->PolicyScope = originSnapshot.Position->Policies; return cmState::Snapshot(this, pos); } @@ -782,6 +812,7 @@ cmState::CreateMacroCallSnapshot(cmState::Snapshot originSnapshot, pos->ExecutionListFile = this->ExecutionListFiles.Extend( originSnapshot.Position->ExecutionListFile, fileName); pos->BuildSystemDirectory->DirectoryEnd = pos; + pos->PolicyScope = originSnapshot.Position->Policies; return cmState::Snapshot(this, pos); } @@ -799,6 +830,7 @@ cmState::CreateCallStackSnapshot(cmState::Snapshot originSnapshot, pos->ExecutionListFile = this->ExecutionListFiles.Extend( originSnapshot.Position->ExecutionListFile, fileName); pos->BuildSystemDirectory->DirectoryEnd = pos; + pos->PolicyScope = originSnapshot.Position->Policies; return cmState::Snapshot(this, pos); } @@ -816,6 +848,7 @@ cmState::CreateInlineListFileSnapshot(cmState::Snapshot originSnapshot, pos->ExecutionListFile = this->ExecutionListFiles.Extend( originSnapshot.Position->ExecutionListFile, fileName); pos->BuildSystemDirectory->DirectoryEnd = pos; + pos->PolicyScope = originSnapshot.Position->Policies; return cmState::Snapshot(this, pos); } @@ -826,6 +859,7 @@ cmState::CreatePolicyScopeSnapshot(cmState::Snapshot originSnapshot) *originSnapshot.Position); pos->SnapshotType = PolicyScopeType; pos->BuildSystemDirectory->DirectoryEnd = pos; + pos->PolicyScope = originSnapshot.Position->Policies; return cmState::Snapshot(this, pos); } @@ -1005,6 +1039,88 @@ cmState::Snapshot cmState::Snapshot::GetCallStackParent() const return snapshot; } +void cmState::Snapshot::PushPolicy(cmPolicies::PolicyMap entry, bool weak) +{ + PositionType pos = this->Position; + pos->Policies = + this->State->PolicyStack.Extend(pos->Policies, + PolicyStackEntry(entry, weak)); +} + +bool cmState::Snapshot::PopPolicy() +{ + PositionType pos = this->Position; + if (pos->Policies == pos->PolicyScope) + { + return false; + } + ++pos->Policies; + return true; +} + +bool cmState::Snapshot::CanPopPolicyScope() +{ + return this->Position->Policies == this->Position->PolicyScope; +} + +void cmState::Snapshot::SetPolicy(cmPolicies::PolicyID id, + cmPolicies::PolicyStatus status) +{ + // Update the policy stack from the top to the top-most strong entry. + bool previous_was_weak = true; + for(cmLinkedTree::iterator psi = this->Position->Policies; + previous_was_weak && psi != this->Position->PolicyRoot; ++psi) + { + psi->Set(id, status); + previous_was_weak = psi->Weak; + } +} + +cmPolicies::PolicyStatus +cmState::Snapshot::GetPolicy(cmPolicies::PolicyID id) const +{ + cmPolicies::PolicyStatus status = cmPolicies::GetPolicyStatus(id); + + if(status == cmPolicies::REQUIRED_ALWAYS || + status == cmPolicies::REQUIRED_IF_USED) + { + return status; + } + + cmLinkedTree::iterator dir = + this->Position->BuildSystemDirectory; + + while (true) + { + assert(dir.IsValid()); + cmLinkedTree::iterator leaf = + dir->DirectoryEnd->Policies; + cmLinkedTree::iterator root = + dir->DirectoryEnd->PolicyRoot; + for( ; leaf != root; ++leaf) + { + if(leaf->IsDefined(id)) + { + status = leaf->Get(id); + return status; + } + } + cmState::PositionType e = dir->DirectoryEnd; + cmState::PositionType p = e->DirectoryParent; + if (p == this->State->SnapshotData.Root()) + { + break; + } + dir = p->BuildSystemDirectory; + } + return status; +} + +bool cmState::Snapshot::HasDefinedPolicyCMP0011() +{ + return !this->Position->Policies->IsEmpty(); +} + static const std::string cmPropertySentinal = std::string(); template diff --git a/Source/cmState.h b/Source/cmState.h index 63b60ef9b..07aa2a55b 100644 --- a/Source/cmState.h +++ b/Source/cmState.h @@ -17,6 +17,7 @@ #include "cmPropertyMap.h" #include "cmLinkedTree.h" #include "cmAlgorithms.h" +#include "cmPolicies.h" class cmake; class cmCommand; @@ -24,6 +25,7 @@ class cmCommand; class cmState { struct SnapshotDataType; + struct PolicyStackEntry; struct BuildsystemDirectoryStateType; typedef cmLinkedTree::iterator PositionType; friend class Snapshot; @@ -61,6 +63,13 @@ public: void InitializeFromParent(); + void SetPolicy(cmPolicies::PolicyID id, cmPolicies::PolicyStatus status); + cmPolicies::PolicyStatus GetPolicy(cmPolicies::PolicyID id) const; + bool HasDefinedPolicyCMP0011(); + void PushPolicy(cmPolicies::PolicyMap entry, bool weak); + bool PopPolicy(); + bool CanPopPolicyScope(); + cmState* GetState() const; Directory GetDirectory() const; @@ -257,6 +266,7 @@ private: cmLinkedTree ExecutionListFiles; + cmLinkedTree PolicyStack; cmLinkedTree SnapshotData; std::vector SourceDirectoryComponents;