]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/Workspace/MetaFileParser.py
BaseTools: Nested !include support in DSC and FDF files
[mirror_edk2.git] / BaseTools / Source / Python / Workspace / MetaFileParser.py
index 53b44f44033b47c10db8b229fbf518781582353a..fe1f7fd6f642bf76effea2e4d34a4ff1c1fa2184 100644 (file)
@@ -1,7 +1,8 @@
 ## @file\r
 # This file is used to parse meta files\r
 #\r
-# Copyright (c) 2008 - 2014, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2008 - 2015, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2015, Hewlett Packard Enterprise Development, L.P.<BR>\r
 # This program and the accompanying materials\r
 # are licensed and made available under the terms and conditions of the BSD License\r
 # which accompanies this distribution.  The full text of the license may be found at\r
@@ -376,7 +377,8 @@ class MetaFileParser(object):
                 File=self.MetaFile,\r
                 Line=self._LineIndex + 1\r
                 )\r
-\r
+    def GetValidExpression(self, TokenSpaceGuid, PcdCName):\r
+        return self._Table.GetValidExpression(TokenSpaceGuid, PcdCName)\r
     def _GetMacros(self):\r
         Macros = {}\r
         Macros.update(self._FileLocalMacros)\r
@@ -814,6 +816,7 @@ class DscParser(MetaFileParser):
         "PLATFORM_VERSION",\r
         "SKUID_IDENTIFIER",\r
         "PCD_INFO_GENERATION",\r
+        "PCD_VAR_CHECK_GENERATION",\r
         "SUPPORTED_ARCHITECTURES",\r
         "BUILD_TARGETS",\r
         "OUTPUT_DIRECTORY",\r
@@ -1008,11 +1011,6 @@ class DscParser(MetaFileParser):
                                 File=self.MetaFile, Line=self._LineIndex + 1,\r
                                 ExtraData=self._CurrentLine)\r
             self._DirectiveStack.append((ItemType, self._LineIndex + 1, self._CurrentLine))\r
-        elif self._From > 0:\r
-            EdkLogger.error('Parser', FORMAT_INVALID,\r
-                            "No '!include' allowed in included file",\r
-                            ExtraData=self._CurrentLine, File=self.MetaFile,\r
-                            Line=self._LineIndex + 1)\r
 \r
         #\r
         # Model, Value1, Value2, Value3, Arch, ModuleType, BelongsToItem=-1, BelongsToFile=-1,\r
@@ -1338,18 +1336,6 @@ class DscParser(MetaFileParser):
             self._SubsectionType = MODEL_UNKNOWN\r
 \r
     def __RetrievePcdValue(self):\r
-        Records = self._RawTable.Query(MODEL_PCD_FEATURE_FLAG, BelongsToItem= -1.0)\r
-        for TokenSpaceGuid, PcdName, Value, Dummy2, Dummy3, ID, Line in Records:\r
-            Name = TokenSpaceGuid + '.' + PcdName\r
-            ValList, Valid, Index = AnalyzeDscPcd(Value, MODEL_PCD_FEATURE_FLAG)\r
-            self._Symbols[Name] = ValList[Index]\r
-\r
-        Records = self._RawTable.Query(MODEL_PCD_FIXED_AT_BUILD, BelongsToItem= -1.0)\r
-        for TokenSpaceGuid, PcdName, Value, Dummy2, Dummy3, ID, Line in Records:\r
-            Name = TokenSpaceGuid + '.' + PcdName\r
-            ValList, Valid, Index = AnalyzeDscPcd(Value, MODEL_PCD_FIXED_AT_BUILD)\r
-            self._Symbols[Name] = ValList[Index]\r
-\r
         Content = open(str(self.MetaFile), 'r').readlines()\r
         GlobalData.gPlatformOtherPcds['DSCFILE'] = str(self.MetaFile)\r
         for PcdType in (MODEL_PCD_PATCHABLE_IN_MODULE, MODEL_PCD_DYNAMIC_DEFAULT, MODEL_PCD_DYNAMIC_HII,\r
@@ -1489,6 +1475,12 @@ class DscParser(MetaFileParser):
             Parser = DscParser(IncludedFile1, self._FileType, IncludedFileTable,\r
                                Owner=Owner, From=Owner)\r
 \r
+            # Does not allow lower level included file to include upper level included file\r
+            if Parser._From != Owner and int(Owner) > int (Parser._From):\r
+                EdkLogger.error('parser', FILE_ALREADY_EXIST, File=self._FileWithError,\r
+                    Line=self._LineIndex + 1, ExtraData="{0} is already included at a higher level.".format(IncludedFile1))\r
+\r
+\r
             # set the parser status with current status\r
             Parser._SectionName = self._SectionName\r
             Parser._SectionType = self._SectionType\r
@@ -1542,7 +1534,9 @@ class DscParser(MetaFileParser):
         if ValList[Index] == 'False':\r
             ValList[Index] = '0'\r
 \r
-        GlobalData.gPlatformPcds[TAB_SPLIT.join(self._ValueList[0:2])] = PcdValue\r
+        if (not self._DirectiveEvalStack) or (False not in self._DirectiveEvalStack):\r
+            GlobalData.gPlatformPcds[TAB_SPLIT.join(self._ValueList[0:2])] = PcdValue\r
+            self._Symbols[TAB_SPLIT.join(self._ValueList[0:2])] = PcdValue\r
         self._ValueList[2] = '|'.join(ValList)\r
 \r
     def __ProcessComponent(self):\r