| 
					
				 | 
			
			
				@@ -78,7 +78,7 @@ void InheritVector(std::vector<T>& child, const std::vector<T>& parent) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 template <class T> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ReadFileResult VisitPreset( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   T& preset, std::map<std::string, cmCMakePresetsFile::PresetPair<T>>& presets, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  std::map<std::string, CycleStatus> cycleStatus) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  std::map<std::string, CycleStatus> cycleStatus, int version) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   switch (cycleStatus[preset.Name]) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     case CycleStatus::InProgress: 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -108,7 +108,7 @@ ReadFileResult VisitPreset( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       return ReadFileResult::USER_PRESET_INHERITANCE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    auto result = VisitPreset(parentPreset, presets, cycleStatus); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    auto result = VisitPreset(parentPreset, presets, cycleStatus, version); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (result != ReadFileResult::READ_OK) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       return result; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -128,7 +128,7 @@ ReadFileResult VisitPreset( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     preset.ConditionEvaluator.reset(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  CHECK_OK(preset.VisitPresetAfterInherit()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  CHECK_OK(preset.VisitPresetAfterInherit(version)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   cycleStatus[preset.Name] = CycleStatus::Verified; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   return ReadFileResult::READ_OK; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -136,7 +136,8 @@ ReadFileResult VisitPreset( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 template <class T> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ReadFileResult ComputePresetInheritance( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  std::map<std::string, cmCMakePresetsFile::PresetPair<T>>& presets) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  std::map<std::string, cmCMakePresetsFile::PresetPair<T>>& presets, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const cmCMakePresetsFile& file) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   std::map<std::string, CycleStatus> cycleStatus; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   for (auto const& it : presets) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -144,7 +145,9 @@ ReadFileResult ComputePresetInheritance( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   for (auto& it : presets) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    auto result = VisitPreset<T>(it.second.Unexpanded, presets, cycleStatus); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    auto& preset = it.second.Unexpanded; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    auto result = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      VisitPreset<T>(preset, presets, cycleStatus, file.GetVersion(preset)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (result != ReadFileResult::READ_OK) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       return result; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -667,16 +670,19 @@ cmCMakePresetsFile::ConfigurePreset::VisitPresetBeforeInherit() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 cmCMakePresetsFile::ReadFileResult 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-cmCMakePresetsFile::ConfigurePreset::VisitPresetAfterInherit() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+cmCMakePresetsFile::ConfigurePreset::VisitPresetAfterInherit(int version) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   auto& preset = *this; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (!preset.Hidden) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (preset.Generator.empty()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      return ReadFileResult::INVALID_PRESET; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (preset.BinaryDir.empty()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      return ReadFileResult::INVALID_PRESET; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (version < 3) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if (preset.Generator.empty()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return ReadFileResult::INVALID_PRESET; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if (preset.BinaryDir.empty()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return ReadFileResult::INVALID_PRESET; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (preset.WarnDev == false && preset.ErrorDev == true) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       return ReadFileResult::INVALID_PRESET; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -712,7 +718,7 @@ cmCMakePresetsFile::BuildPreset::VisitPresetInherit( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 cmCMakePresetsFile::ReadFileResult 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-cmCMakePresetsFile::BuildPreset::VisitPresetAfterInherit() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+cmCMakePresetsFile::BuildPreset::VisitPresetAfterInherit(int /* version */) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   auto& preset = *this; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (!preset.Hidden && preset.ConfigurePreset.empty()) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -822,7 +828,7 @@ cmCMakePresetsFile::TestPreset::VisitPresetInherit( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 cmCMakePresetsFile::ReadFileResult 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-cmCMakePresetsFile::TestPreset::VisitPresetAfterInherit() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+cmCMakePresetsFile::TestPreset::VisitPresetAfterInherit(int /* version */) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   auto& preset = *this; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (!preset.Hidden && preset.ConfigurePreset.empty()) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -883,9 +889,9 @@ cmCMakePresetsFile::ReadProjectPresetsInternal(bool allowNoFiles) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         : ReadFileResult::FILE_NOT_FOUND; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  CHECK_OK(ComputePresetInheritance(this->ConfigurePresets)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  CHECK_OK(ComputePresetInheritance(this->BuildPresets)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  CHECK_OK(ComputePresetInheritance(this->TestPresets)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  CHECK_OK(ComputePresetInheritance(this->ConfigurePresets, *this)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  CHECK_OK(ComputePresetInheritance(this->BuildPresets, *this)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  CHECK_OK(ComputePresetInheritance(this->TestPresets, *this)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   for (auto& it : this->ConfigurePresets) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (!ExpandMacros(*this, it.second.Unexpanded, it.second.Expanded)) { 
			 |