]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/Workspace/WorkspaceDatabase.py
Sync BaseTool trunk (version r2670) into EDKII BaseTools.
[mirror_edk2.git] / BaseTools / Source / Python / Workspace / WorkspaceDatabase.py
index 71e98a94bea556533cc350df3cbaee22872929f5..6ebb7ee87d5e4ed3d264a1da13de76323b341f25 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # This file is used to create a database used by build tool\r
 #\r
-# Copyright (c) 2008 - 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2008 - 2014, Intel Corporation. All rights reserved.<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
@@ -34,6 +34,10 @@ from MetaDataTable import *
 from MetaFileTable import *\r
 from MetaFileParser import *\r
 from BuildClassObject import *\r
+from WorkspaceCommon import GetDeclaredPcd\r
+from Common.Misc import AnalyzeDscPcd\r
+import re\r
+from Common.Parsing import IsValidWord\r
 \r
 ## Platform build information from DSC file\r
 #\r
@@ -68,7 +72,7 @@ class DscBuildData(PlatformBuildClassObject):
         #TAB_DSC_DEFINES_OUTPUT_DIRECTORY        :   "_OutputDirectory",\r
         #TAB_DSC_DEFINES_SUPPORTED_ARCHITECTURES :   "_SupArchList",\r
         #TAB_DSC_DEFINES_BUILD_TARGETS           :   "_BuildTargets",\r
-        #TAB_DSC_DEFINES_SKUID_IDENTIFIER        :   "_SkuName",\r
+        TAB_DSC_DEFINES_SKUID_IDENTIFIER        :   "_SkuName",\r
         #TAB_DSC_DEFINES_FLASH_DEFINITION        :   "_FlashDefinition",\r
         TAB_DSC_DEFINES_BUILD_NUMBER            :   "_BuildNumber",\r
         TAB_DSC_DEFINES_MAKEFILE_NAME           :   "_MakefileName",\r
@@ -124,6 +128,8 @@ class DscBuildData(PlatformBuildClassObject):
         self._SupArchList       = None\r
         self._BuildTargets      = None\r
         self._SkuName           = None\r
+        self._SkuIdentifier     = None\r
+        self._PcdInfoFlag       = None\r
         self._FlashDefinition   = None\r
         self._BuildNumber       = None\r
         self._MakefileName      = None\r
@@ -134,6 +140,7 @@ class DscBuildData(PlatformBuildClassObject):
         self._LibraryInstances  = None\r
         self._LibraryClasses    = None\r
         self._Pcds              = None\r
+        self._DecPcds           = None\r
         self._BuildOptions      = None\r
         self._LoadFixAddress    = None\r
         self._RFCLanguages      = None\r
@@ -178,10 +185,9 @@ class DscBuildData(PlatformBuildClassObject):
         for Record in RecordList:\r
             Name = Record[1]\r
             # items defined _PROPERTY_ don't need additional processing\r
-            if Name in self:\r
-                self[Name] = Record[2]\r
+            \r
             # some special items in [Defines] section need special treatment\r
-            elif Name == TAB_DSC_DEFINES_OUTPUT_DIRECTORY:\r
+            if Name == TAB_DSC_DEFINES_OUTPUT_DIRECTORY:\r
                 self._OutputDirectory = NormPath(Record[2], self._Macros)\r
                 if ' ' in self._OutputDirectory:\r
                     EdkLogger.error("build", FORMAT_NOT_SUPPORTED, "No space is allowed in OUTPUT_DIRECTORY",\r
@@ -200,6 +206,9 @@ class DscBuildData(PlatformBuildClassObject):
             elif Name == TAB_DSC_DEFINES_SKUID_IDENTIFIER:\r
                 if self._SkuName == None:\r
                     self._SkuName = Record[2]\r
+                self._SkuIdentifier = Record[2]\r
+            elif Name == TAB_DSC_DEFINES_PCD_INFO_GENERATION:\r
+                self._PcdInfoFlag = Record[2]\r
             elif Name == TAB_FIX_LOAD_TOP_MEMORY_ADDRESS:\r
                 try:\r
                     self._LoadFixAddress = int (Record[2], 0)\r
@@ -244,6 +253,8 @@ class DscBuildData(PlatformBuildClassObject):
                 except:\r
                     EdkLogger.error("build", FORMAT_INVALID, "Invalid GUID format for VPD_TOOL_GUID", File=self.MetaFile)\r
                 self._VpdToolGuid = Record[2]                   \r
+            elif Name in self:\r
+                self[Name] = Record[2]                 \r
         # set _Header to non-None in order to avoid database re-querying\r
         self._Header = 'DUMMY'\r
 \r
@@ -262,7 +273,7 @@ class DscBuildData(PlatformBuildClassObject):
             if self._Header == None:\r
                 self._GetHeaderInfo()\r
             if self._Guid == None:\r
-                EdkLogger.error('build', ATTRIBUTE_NOT_AVAILABLE, "No FILE_GUID", File=self.MetaFile)\r
+                EdkLogger.error('build', ATTRIBUTE_NOT_AVAILABLE, "No PLATFORM_GUID", File=self.MetaFile)\r
         return self._Guid\r
 \r
     ## Retrieve platform version\r
@@ -271,7 +282,7 @@ class DscBuildData(PlatformBuildClassObject):
             if self._Header == None:\r
                 self._GetHeaderInfo()\r
             if self._Version == None:\r
-                self._Version = ''\r
+                EdkLogger.error('build', ATTRIBUTE_NOT_AVAILABLE, "No PLATFORM_VERSION", File=self.MetaFile)\r
         return self._Version\r
 \r
     ## Retrieve platform description file version\r
@@ -280,7 +291,7 @@ class DscBuildData(PlatformBuildClassObject):
             if self._Header == None:\r
                 self._GetHeaderInfo()\r
             if self._DscSpecification == None:\r
-                self._DscSpecification = ''\r
+                EdkLogger.error('build', ATTRIBUTE_NOT_AVAILABLE, "No DSC_SPECIFICATION", File=self.MetaFile)                \r
         return self._DscSpecification\r
 \r
     ## Retrieve OUTPUT_DIRECTORY\r
@@ -298,7 +309,7 @@ class DscBuildData(PlatformBuildClassObject):
             if self._Header == None:\r
                 self._GetHeaderInfo()\r
             if self._SupArchList == None:\r
-                self._SupArchList = ARCH_LIST\r
+                EdkLogger.error('build', ATTRIBUTE_NOT_AVAILABLE, "No SUPPORTED_ARCHITECTURES", File=self.MetaFile)\r
         return self._SupArchList\r
 \r
     ## Retrieve BUILD_TARGETS\r
@@ -307,24 +318,37 @@ class DscBuildData(PlatformBuildClassObject):
             if self._Header == None:\r
                 self._GetHeaderInfo()\r
             if self._BuildTargets == None:\r
-                self._BuildTargets = ['DEBUG', 'RELEASE', 'NOOPT']\r
+                EdkLogger.error('build', ATTRIBUTE_NOT_AVAILABLE, "No BUILD_TARGETS", File=self.MetaFile)\r
         return self._BuildTargets\r
-\r
+    \r
+    def _GetPcdInfoFlag(self):\r
+        if self._PcdInfoFlag == None or self._PcdInfoFlag.upper() == 'FALSE':\r
+            return False\r
+        elif self._PcdInfoFlag.upper() == 'TRUE':\r
+            return True\r
+        else:\r
+            return False\r
+            \r
+    def _GetSkuIdentifier(self):\r
+        if self._SkuName:\r
+            return self._SkuName\r
+        if self._SkuIdentifier == None:\r
+            if self._Header == None:\r
+                self._GetHeaderInfo()\r
+        return self._SkuIdentifier\r
     ## Retrieve SKUID_IDENTIFIER\r
     def _GetSkuName(self):\r
         if self._SkuName == None:\r
             if self._Header == None:\r
                 self._GetHeaderInfo()\r
-            if self._SkuName == None or self._SkuName not in self.SkuIds:\r
+            if (self._SkuName == None or self._SkuName not in self.SkuIds):\r
                 self._SkuName = 'DEFAULT'\r
         return self._SkuName\r
 \r
     ## Override SKUID_IDENTIFIER\r
     def _SetSkuName(self, Value):\r
-        if Value in self.SkuIds:\r
-            self._SkuName = Value\r
-            # Needs to re-retrieve the PCD information\r
-            self._Pcds = None\r
+        self._SkuName = Value\r
+        self._Pcds = None\r
 \r
     def _GetFdfFile(self):\r
         if self._FlashDefinition == None:\r
@@ -383,10 +407,21 @@ class DscBuildData(PlatformBuildClassObject):
                 self._LoadFixAddress = int (self._LoadFixAddress, 0)\r
             except:\r
                 EdkLogger.error("build", PARAMETER_INVALID, "FIX_LOAD_TOP_MEMORY_ADDRESS %s is not valid dec or hex string" % (self._LoadFixAddress))\r
-            if self._LoadFixAddress < 0:\r
-                EdkLogger.error("build", PARAMETER_INVALID, "FIX_LOAD_TOP_MEMORY_ADDRESS is set to the invalid negative value %s" % (self._LoadFixAddress))\r
-            if self._LoadFixAddress != 0xFFFFFFFFFFFFFFFF and self._LoadFixAddress % 0x1000 != 0:\r
-                EdkLogger.error("build", PARAMETER_INVALID, "FIX_LOAD_TOP_MEMORY_ADDRESS is set to the invalid unaligned 4K value %s" % (self._LoadFixAddress))\r
+         \r
+        #\r
+        # If command line defined, should override the value in DSC file.\r
+        #\r
+        if 'FIX_LOAD_TOP_MEMORY_ADDRESS' in GlobalData.gCommandLineDefines.keys():\r
+            try:\r
+                self._LoadFixAddress = int(GlobalData.gCommandLineDefines['FIX_LOAD_TOP_MEMORY_ADDRESS'], 0)\r
+            except:\r
+                EdkLogger.error("build", PARAMETER_INVALID, "FIX_LOAD_TOP_MEMORY_ADDRESS %s is not valid dec or hex string" % (GlobalData.gCommandLineDefines['FIX_LOAD_TOP_MEMORY_ADDRESS']))\r
+                \r
+        if self._LoadFixAddress < 0:\r
+            EdkLogger.error("build", PARAMETER_INVALID, "FIX_LOAD_TOP_MEMORY_ADDRESS is set to the invalid negative value 0x%x" % (self._LoadFixAddress))\r
+        if self._LoadFixAddress != 0xFFFFFFFFFFFFFFFF and self._LoadFixAddress % 0x1000 != 0:\r
+            EdkLogger.error("build", PARAMETER_INVALID, "FIX_LOAD_TOP_MEMORY_ADDRESS is set to the invalid unaligned 4K value 0x%x" % (self._LoadFixAddress))\r
+            \r
         return self._LoadFixAddress\r
 \r
     ## Retrieve RFCLanguage filter\r
@@ -429,7 +464,9 @@ class DscBuildData(PlatformBuildClassObject):
                                     File=self.MetaFile, Line=Record[-1])\r
                 self._SkuIds[Record[1]] = Record[0]\r
             if 'DEFAULT' not in self._SkuIds:\r
-                self._SkuIds['DEFAULT'] = 0\r
+                self._SkuIds['DEFAULT'] = '0'\r
+            if 'COMMON' not in self._SkuIds:\r
+                self._SkuIds['COMMON'] = '0'\r
         return self._SkuIds\r
 \r
     ## Retrieve [Components] section information\r
@@ -452,7 +489,8 @@ class DscBuildData(PlatformBuildClassObject):
                 EdkLogger.error('build', ErrorCode, File=self.MetaFile, Line=LineNo,\r
                                 ExtraData=ErrorInfo)\r
             # Check duplication\r
-            if ModuleFile in self._Modules:\r
+            # If arch is COMMON, no duplicate module is checked since all modules in all component sections are selected\r
+            if self._Arch != 'COMMON' and ModuleFile in self._Modules:\r
                 EdkLogger.error('build', FILE_DUPLICATED, File=self.MetaFile, ExtraData=str(ModuleFile), Line=LineNo)\r
 \r
             Module = ModuleBuildClassObject()\r
@@ -601,6 +639,46 @@ class DscBuildData(PlatformBuildClassObject):
                 self._LibraryClasses[Library.BaseName, ':dummy:'] = Library\r
         return self._LibraryClasses\r
 \r
+    def _ValidatePcd(self, PcdCName, TokenSpaceGuid, Setting, PcdType, LineNo):\r
+        if self._DecPcds == None:\r
+            self._DecPcds = GetDeclaredPcd(self, self._Bdb, self._Arch, self._Target, self._Toolchain)\r
+        if (PcdCName, TokenSpaceGuid) not in self._DecPcds:\r
+            EdkLogger.error('build', PARSER_ERROR,\r
+                            "Pcd (%s.%s) defined in DSC is not declared in DEC files." % (TokenSpaceGuid, PcdCName),\r
+                            File=self.MetaFile, Line=LineNo)\r
+        ValueList, IsValid, Index = AnalyzeDscPcd(Setting, PcdType, self._DecPcds[PcdCName, TokenSpaceGuid].DatumType)\r
+        if not IsValid and PcdType not in [MODEL_PCD_FEATURE_FLAG, MODEL_PCD_FIXED_AT_BUILD]:\r
+            EdkLogger.error('build', FORMAT_INVALID, "Pcd format incorrect.", File=self.MetaFile, Line=LineNo,\r
+                            ExtraData="%s.%s|%s" % (TokenSpaceGuid, PcdCName, Setting))\r
+        if ValueList[Index] and PcdType not in [MODEL_PCD_FEATURE_FLAG, MODEL_PCD_FIXED_AT_BUILD]:\r
+            try:\r
+                ValueList[Index] = ValueExpression(ValueList[Index], GlobalData.gPlatformPcds)(True)\r
+            except WrnExpression, Value:\r
+                ValueList[Index] = Value.result\r
+            except EvaluationException, Excpt:\r
+                if hasattr(Excpt, 'Pcd'):\r
+                    if Excpt.Pcd in GlobalData.gPlatformOtherPcds:\r
+                        EdkLogger.error('Parser', FORMAT_INVALID, "Cannot use this PCD (%s) in an expression as"\r
+                                        " it must be defined in a [PcdsFixedAtBuild] or [PcdsFeatureFlag] section"\r
+                                        " of the DSC file" % Excpt.Pcd,\r
+                                        File=self.MetaFile, Line=LineNo)\r
+                    else:\r
+                        EdkLogger.error('Parser', FORMAT_INVALID, "PCD (%s) is not defined in DSC file" % Excpt.Pcd,\r
+                                        File=self.MetaFile, Line=LineNo)\r
+                else:\r
+                    EdkLogger.error('Parser', FORMAT_INVALID, "Invalid expression: %s" % str(Excpt),\r
+                                    File=self.MetaFile, Line=LineNo)\r
+            if ValueList[Index] == 'True':\r
+                ValueList[Index] = '1'\r
+            elif ValueList[Index] == 'False':\r
+                ValueList[Index] = '0'\r
+        if ValueList[Index]:\r
+            Valid, ErrStr = CheckPcdDatum(self._DecPcds[PcdCName, TokenSpaceGuid].DatumType, ValueList[Index])\r
+            if not Valid:\r
+                EdkLogger.error('build', FORMAT_INVALID, ErrStr, File=self.MetaFile, Line=LineNo,\r
+                                ExtraData="%s.%s" % (TokenSpaceGuid, PcdCName))\r
+        return ValueList\r
+\r
     ## Retrieve all PCD settings in platform\r
     def _GetPcds(self):\r
         if self._Pcds == None:\r
@@ -646,19 +724,44 @@ class DscBuildData(PlatformBuildClassObject):
         # tdict is a special dict kind of type, used for selecting correct\r
         # PCD settings for certain ARCH\r
         #\r
+        \r
+        SkuObj = SkuClass(self.SkuIdentifier,self.SkuIds)\r
+        \r
         PcdDict = tdict(True, 3)\r
         PcdSet = set()\r
         # Find out all possible PCD candidates for self._Arch\r
         RecordList = self._RawData[Type, self._Arch]\r
+        PcdValueDict = sdict()\r
         for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, Dummy3, Dummy4 in RecordList:\r
-            PcdSet.add((PcdCName, TokenSpaceGuid))\r
-            PcdDict[Arch, PcdCName, TokenSpaceGuid] = Setting\r
-        # Remove redundant PCD candidates\r
-        for PcdCName, TokenSpaceGuid in PcdSet:\r
-            Setting = PcdDict[self._Arch, PcdCName, TokenSpaceGuid]\r
+            if SkuName in (SkuObj.SystemSkuId,'DEFAULT','COMMON'):\r
+                PcdSet.add((PcdCName, TokenSpaceGuid, SkuName,Dummy4))\r
+                PcdDict[Arch, PcdCName, TokenSpaceGuid,SkuName] = Setting\r
+        \r
+        #handle pcd value override        \r
+        for PcdCName, TokenSpaceGuid, SkuName,Dummy4 in PcdSet:\r
+            Setting = PcdDict[self._Arch, PcdCName, TokenSpaceGuid,SkuName]\r
             if Setting == None:\r
                 continue\r
-            PcdValue, DatumType, MaxDatumSize = AnalyzePcdData(Setting)\r
+            PcdValue, DatumType, MaxDatumSize = self._ValidatePcd(PcdCName, TokenSpaceGuid, Setting, Type, Dummy4)\r
+            if (PcdCName, TokenSpaceGuid) in PcdValueDict:\r
+                PcdValueDict[PcdCName, TokenSpaceGuid][SkuName] = (PcdValue,DatumType,MaxDatumSize) \r
+            else:\r
+                PcdValueDict[PcdCName, TokenSpaceGuid] = {SkuName:(PcdValue,DatumType,MaxDatumSize)}       \r
+        \r
+        PcdsKeys = PcdValueDict.keys()\r
+        for PcdCName,TokenSpaceGuid in PcdsKeys:\r
+            \r
+            PcdSetting = PcdValueDict[PcdCName, TokenSpaceGuid]\r
+            PcdValue = None\r
+            DatumType = None\r
+            MaxDatumSize = None\r
+            if 'COMMON' in PcdSetting:\r
+                PcdValue,DatumType,MaxDatumSize = PcdSetting['COMMON']\r
+            if 'DEFAULT' in PcdSetting:\r
+                PcdValue,DatumType,MaxDatumSize = PcdSetting['DEFAULT']\r
+            if SkuObj.SystemSkuId in PcdSetting:\r
+                PcdValue,DatumType,MaxDatumSize = PcdSetting[SkuObj.SystemSkuId]\r
+                \r
             Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject(\r
                                                 PcdCName,\r
                                                 TokenSpaceGuid,\r
@@ -680,6 +783,9 @@ class DscBuildData(PlatformBuildClassObject):
     #   @retval a dict object contains settings of given PCD type\r
     #\r
     def _GetDynamicPcd(self, Type):\r
+        \r
+        SkuObj = SkuClass(self.SkuIdentifier,self.SkuIds)\r
+        \r
         Pcds = sdict()\r
         #\r
         # tdict is a special dict kind of type, used for selecting correct\r
@@ -689,30 +795,67 @@ class DscBuildData(PlatformBuildClassObject):
         PcdList = []\r
         # Find out all possible PCD candidates for self._Arch\r
         RecordList = self._RawData[Type, self._Arch]\r
+        AvailableSkuIdSet = SkuObj.AvailableSkuIdSet.copy()\r
+        \r
+        AvailableSkuIdSet.update({'DEFAULT':0,'COMMON':0})\r
         for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, Dummy3, Dummy4 in RecordList:\r
-            PcdList.append((PcdCName, TokenSpaceGuid))\r
+            if SkuName not in AvailableSkuIdSet:\r
+                continue\r
+            \r
+            PcdList.append((PcdCName, TokenSpaceGuid, SkuName,Dummy4))\r
             PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid] = Setting\r
         # Remove redundant PCD candidates, per the ARCH and SKU\r
-        for PcdCName, TokenSpaceGuid in PcdList:\r
-            Setting = PcdDict[self._Arch, self.SkuName, PcdCName, TokenSpaceGuid]\r
+        for PcdCName, TokenSpaceGuid, SkuName, Dummy4 in PcdList:\r
+            \r
+            Setting = PcdDict[self._Arch, SkuName, PcdCName, TokenSpaceGuid]\r
             if Setting == None:\r
                 continue\r
                       \r
-            PcdValue, DatumType, MaxDatumSize = AnalyzePcdData(Setting)\r
-                \r
-            SkuInfo = SkuInfoClass(self.SkuName, self.SkuIds[self.SkuName], '', '', '', '', '', PcdValue)\r
-            Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject(\r
-                                                PcdCName,\r
-                                                TokenSpaceGuid,\r
-                                                self._PCD_TYPE_STRING_[Type],\r
-                                                DatumType,\r
-                                                PcdValue,\r
-                                                '',\r
-                                                MaxDatumSize,\r
-                                                {self.SkuName : SkuInfo},\r
-                                                False,\r
-                                                None\r
-                                                )\r
+            PcdValue, DatumType, MaxDatumSize = self._ValidatePcd(PcdCName, TokenSpaceGuid, Setting, Type, Dummy4)\r
+            SkuInfo = SkuInfoClass(SkuName, self.SkuIds[SkuName], '', '', '', '', '', PcdValue)\r
+            if (PcdCName,TokenSpaceGuid) in Pcds.keys(): \r
+                pcdObject = Pcds[PcdCName,TokenSpaceGuid]\r
+                pcdObject.SkuInfoList[SkuName] = SkuInfo\r
+                if MaxDatumSize.strip():\r
+                    CurrentMaxSize = int(MaxDatumSize.strip(),0)\r
+                else:\r
+                    CurrentMaxSize = 0\r
+                if pcdObject.MaxDatumSize:\r
+                    PcdMaxSize = int(pcdObject.MaxDatumSize,0)\r
+                else:\r
+                    PcdMaxSize = 0\r
+                if CurrentMaxSize > PcdMaxSize:\r
+                    pcdObject.MaxDatumSize = str(CurrentMaxSize)\r
+            else:               \r
+                Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject(\r
+                                                    PcdCName,\r
+                                                    TokenSpaceGuid,\r
+                                                    self._PCD_TYPE_STRING_[Type],\r
+                                                    DatumType,\r
+                                                    PcdValue,\r
+                                                    '',\r
+                                                    MaxDatumSize,\r
+                                                    {SkuName : SkuInfo},\r
+                                                    False,\r
+                                                    None\r
+                                                    )\r
+        \r
+        for pcd in Pcds.values():\r
+            pcdDecObject = self._DecPcds[pcd.TokenCName,pcd.TokenSpaceGuidCName]\r
+            if 'DEFAULT' not in pcd.SkuInfoList.keys() and 'COMMON' not in pcd.SkuInfoList.keys():                \r
+                valuefromDec = pcdDecObject.DefaultValue\r
+                SkuInfo = SkuInfoClass('DEFAULT', '0', '', '', '', '', '', valuefromDec)\r
+                pcd.SkuInfoList['DEFAULT'] = SkuInfo\r
+            elif 'DEFAULT' not in pcd.SkuInfoList.keys() and 'COMMON' in pcd.SkuInfoList.keys():\r
+                pcd.SkuInfoList['DEFAULT'] = pcd.SkuInfoList['COMMON']\r
+                del(pcd.SkuInfoList['COMMON'])\r
+            elif 'DEFAULT' in pcd.SkuInfoList.keys() and 'COMMON' in pcd.SkuInfoList.keys():\r
+                del(pcd.SkuInfoList['COMMON'])\r
+            if SkuObj.SkuUsageType == SkuObj.SINGLE:\r
+                if 'DEFAULT' in pcd.SkuInfoList.keys() and SkuObj.SystemSkuId not in pcd.SkuInfoList.keys():\r
+                    pcd.SkuInfoList[SkuObj.SystemSkuId] = pcd.SkuInfoList['DEFAULT']\r
+                del(pcd.SkuInfoList['DEFAULT'])\r
+               \r
         return Pcds\r
 \r
     ## Retrieve dynamic HII PCD settings\r
@@ -722,6 +865,9 @@ class DscBuildData(PlatformBuildClassObject):
     #   @retval a dict object contains settings of given PCD type\r
     #\r
     def _GetDynamicHiiPcd(self, Type):\r
+        \r
+        SkuObj = SkuClass(self.SkuIdentifier,self.SkuIds)\r
+        \r
         Pcds = sdict()\r
         #\r
         # tdict is a special dict kind of type, used for selecting correct\r
@@ -731,17 +877,51 @@ class DscBuildData(PlatformBuildClassObject):
         PcdSet = set()\r
         RecordList = self._RawData[Type, self._Arch]\r
         # Find out all possible PCD candidates for self._Arch\r
+        AvailableSkuIdSet = SkuObj.AvailableSkuIdSet.copy()\r
+        \r
+        AvailableSkuIdSet.update({'DEFAULT':0,'COMMON':0})\r
         for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, Dummy3, Dummy4 in RecordList:\r
-            PcdSet.add((PcdCName, TokenSpaceGuid))\r
+            if SkuName not in AvailableSkuIdSet:\r
+                continue\r
+            PcdSet.add((PcdCName, TokenSpaceGuid, SkuName,Dummy4))\r
             PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid] = Setting\r
         # Remove redundant PCD candidates, per the ARCH and SKU\r
-        for PcdCName, TokenSpaceGuid in PcdSet:\r
-            Setting = PcdDict[self._Arch, self.SkuName, PcdCName, TokenSpaceGuid]\r
+        for PcdCName, TokenSpaceGuid,SkuName, Dummy4 in PcdSet:\r
+            \r
+            Setting = PcdDict[self._Arch, SkuName, PcdCName, TokenSpaceGuid]\r
             if Setting == None:\r
                 continue\r
-            VariableName, VariableGuid, VariableOffset, DefaultValue = AnalyzeHiiPcdData(Setting)\r
-            SkuInfo = SkuInfoClass(self.SkuName, self.SkuIds[self.SkuName], VariableName, VariableGuid, VariableOffset, DefaultValue)\r
-            Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject(\r
+            VariableName, VariableGuid, VariableOffset, DefaultValue = self._ValidatePcd(PcdCName, TokenSpaceGuid, Setting, Type, Dummy4)\r
+            \r
+            ExceedMax = False\r
+            FormatCorrect = True\r
+            if VariableOffset.isdigit():\r
+                if int(VariableOffset,10) > 0xFFFF:\r
+                    ExceedMax = True\r
+            elif re.match(r'[\t\s]*0[xX][a-fA-F0-9]+$',VariableOffset):\r
+                if int(VariableOffset,16) > 0xFFFF:\r
+                    ExceedMax = True\r
+            # For Offset written in "A.B"\r
+            elif VariableOffset.find('.') > -1:\r
+                VariableOffsetList = VariableOffset.split(".")\r
+                if not (len(VariableOffsetList) == 2\r
+                        and IsValidWord(VariableOffsetList[0])\r
+                        and IsValidWord(VariableOffsetList[1])):\r
+                    FormatCorrect = False\r
+            else:\r
+                FormatCorrect = False\r
+            if not FormatCorrect:\r
+                EdkLogger.error('Build', FORMAT_INVALID, "Invalid syntax or format of the variable offset value is incorrect for %s." % ".".join((TokenSpaceGuid,PcdCName)))\r
+            \r
+            if ExceedMax:\r
+                EdkLogger.error('Build', OPTION_VALUE_INVALID, "The variable offset value must not exceed the maximum value of 0xFFFF (UINT16) for %s." % ".".join((TokenSpaceGuid,PcdCName)))\r
+            \r
+            SkuInfo = SkuInfoClass(SkuName, self.SkuIds[SkuName], VariableName, VariableGuid, VariableOffset, DefaultValue)\r
+            if (PcdCName,TokenSpaceGuid) in Pcds.keys():  \r
+                pcdObject = Pcds[PcdCName,TokenSpaceGuid]\r
+                pcdObject.SkuInfoList[SkuName] = SkuInfo\r
+            else:\r
+                Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject(\r
                                                 PcdCName,\r
                                                 TokenSpaceGuid,\r
                                                 self._PCD_TYPE_STRING_[Type],\r
@@ -749,10 +929,51 @@ class DscBuildData(PlatformBuildClassObject):
                                                 DefaultValue,\r
                                                 '',\r
                                                 '',\r
-                                                {self.SkuName : SkuInfo},\r
+                                                {SkuName : SkuInfo},\r
                                                 False,\r
                                                 None\r
                                                 )\r
+                \r
+\r
+        for pcd in Pcds.values():\r
+            SkuInfoObj = pcd.SkuInfoList.values()[0]\r
+            pcdDecObject = self._DecPcds[pcd.TokenCName,pcd.TokenSpaceGuidCName]\r
+            # Only fix the value while no value provided in DSC file.\r
+            for sku in pcd.SkuInfoList.values():\r
+                if (sku.HiiDefaultValue == "" or sku.HiiDefaultValue==None):\r
+                    sku.HiiDefaultValue = pcdDecObject.DefaultValue\r
+            if 'DEFAULT' not in pcd.SkuInfoList.keys() and 'COMMON' not in pcd.SkuInfoList.keys():              \r
+                valuefromDec = pcdDecObject.DefaultValue\r
+                SkuInfo = SkuInfoClass('DEFAULT', '0', SkuInfoObj.VariableName, SkuInfoObj.VariableGuid, SkuInfoObj.VariableOffset, valuefromDec)\r
+                pcd.SkuInfoList['DEFAULT'] = SkuInfo\r
+            elif 'DEFAULT' not in pcd.SkuInfoList.keys() and 'COMMON' in pcd.SkuInfoList.keys():\r
+                pcd.SkuInfoList['DEFAULT'] = pcd.SkuInfoList['COMMON']\r
+                del(pcd.SkuInfoList['COMMON'])\r
+            elif 'DEFAULT' in pcd.SkuInfoList.keys() and 'COMMON' in pcd.SkuInfoList.keys():\r
+                del(pcd.SkuInfoList['COMMON'])\r
+                \r
+            if SkuObj.SkuUsageType == SkuObj.SINGLE:\r
+                if 'DEFAULT' in pcd.SkuInfoList.keys() and SkuObj.SystemSkuId not in pcd.SkuInfoList.keys():\r
+                    pcd.SkuInfoList[SkuObj.SystemSkuId] = pcd.SkuInfoList['DEFAULT']\r
+                del(pcd.SkuInfoList['DEFAULT'])\r
+            \r
+            \r
+            if pcd.MaxDatumSize.strip(): \r
+                MaxSize = int(pcd.MaxDatumSize,0)\r
+            else:\r
+                MaxSize = 0\r
+            if pcdDecObject.DatumType == 'VOID*':\r
+                for (skuname,skuobj) in pcd.SkuInfoList.items():\r
+                    datalen = 0\r
+                    if skuobj.HiiDefaultValue.startswith("L"):\r
+                        datalen = (len(skuobj.HiiDefaultValue)- 3 + 1) * 2\r
+                    elif skuobj.HiiDefaultValue.startswith("{"):\r
+                        datalen = len(skuobj.HiiDefaultValue.split(","))\r
+                    else:\r
+                        datalen = len(skuobj.HiiDefaultValue) -2 + 1 \r
+                    if datalen>MaxSize:\r
+                        MaxSize = datalen\r
+                pcd.MaxDatumSize = str(MaxSize)\r
         return Pcds\r
 \r
     ## Retrieve dynamic VPD PCD settings\r
@@ -762,6 +983,9 @@ class DscBuildData(PlatformBuildClassObject):
     #   @retval a dict object contains settings of given PCD type\r
     #\r
     def _GetDynamicVpdPcd(self, Type):\r
+        \r
+        SkuObj = SkuClass(self.SkuIdentifier,self.SkuIds)\r
+        \r
         Pcds = sdict()\r
         #\r
         # tdict is a special dict kind of type, used for selecting correct\r
@@ -771,12 +995,18 @@ class DscBuildData(PlatformBuildClassObject):
         PcdList = []\r
         # Find out all possible PCD candidates for self._Arch\r
         RecordList = self._RawData[Type, self._Arch]\r
+        AvailableSkuIdSet = SkuObj.AvailableSkuIdSet.copy()\r
+        \r
+        AvailableSkuIdSet.update({'DEFAULT':0,'COMMON':0})\r
         for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, Dummy3, Dummy4 in RecordList:\r
-            PcdList.append((PcdCName, TokenSpaceGuid))\r
+            if SkuName not in AvailableSkuIdSet:\r
+                continue\r
+\r
+            PcdList.append((PcdCName, TokenSpaceGuid,SkuName, Dummy4))\r
             PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid] = Setting\r
         # Remove redundant PCD candidates, per the ARCH and SKU\r
-        for PcdCName, TokenSpaceGuid in PcdList:\r
-            Setting = PcdDict[self._Arch, self.SkuName, PcdCName, TokenSpaceGuid]\r
+        for PcdCName, TokenSpaceGuid, SkuName,Dummy4 in PcdList:\r
+            Setting = PcdDict[self._Arch, SkuName, PcdCName, TokenSpaceGuid]\r
             if Setting == None:\r
                 continue\r
             #\r
@@ -785,10 +1015,23 @@ class DscBuildData(PlatformBuildClassObject):
             # At this point, we put all the data into the PcdClssObject for we don't know the PCD's datumtype\r
             # until the DEC parser has been called.\r
             # \r
-            VpdOffset, MaxDatumSize, InitialValue = AnalyzeVpdPcdData(Setting)\r
-\r
-            SkuInfo = SkuInfoClass(self.SkuName, self.SkuIds[self.SkuName], '', '', '', '', VpdOffset, InitialValue)\r
-            Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject(\r
+            VpdOffset, MaxDatumSize, InitialValue = self._ValidatePcd(PcdCName, TokenSpaceGuid, Setting, Type, Dummy4)\r
+            SkuInfo = SkuInfoClass(SkuName, self.SkuIds[SkuName], '', '', '', '', VpdOffset, InitialValue)\r
+            if (PcdCName,TokenSpaceGuid) in Pcds.keys():  \r
+                pcdObject = Pcds[PcdCName,TokenSpaceGuid]\r
+                pcdObject.SkuInfoList[SkuName] = SkuInfo\r
+                if MaxDatumSize.strip():\r
+                    CurrentMaxSize = int(MaxDatumSize.strip(),0)\r
+                else:\r
+                    CurrentMaxSize = 0\r
+                if pcdObject.MaxDatumSize:\r
+                    PcdMaxSize = int(pcdObject.MaxDatumSize,0)\r
+                else:\r
+                    PcdMaxSize = 0\r
+                if CurrentMaxSize > PcdMaxSize:\r
+                    pcdObject.MaxDatumSize = str(CurrentMaxSize)\r
+            else:\r
+                Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject(\r
                                                 PcdCName,\r
                                                 TokenSpaceGuid,\r
                                                 self._PCD_TYPE_STRING_[Type],\r
@@ -796,10 +1039,27 @@ class DscBuildData(PlatformBuildClassObject):
                                                 '',\r
                                                 '',\r
                                                 MaxDatumSize,\r
-                                                {self.SkuName : SkuInfo},\r
+                                                {SkuName : SkuInfo},\r
                                                 False,\r
                                                 None\r
                                                 )\r
+        for pcd in Pcds.values():\r
+            SkuInfoObj = pcd.SkuInfoList.values()[0]\r
+            pcdDecObject = self._DecPcds[pcd.TokenCName,pcd.TokenSpaceGuidCName]\r
+            if 'DEFAULT' not in pcd.SkuInfoList.keys() and 'COMMON' not in pcd.SkuInfoList.keys():\r
+                valuefromDec = pcdDecObject.DefaultValue\r
+                SkuInfo = SkuInfoClass('DEFAULT', '0', '', '', '','',SkuInfoObj.VpdOffset, valuefromDec)\r
+                pcd.SkuInfoList['DEFAULT'] = SkuInfo\r
+            elif 'DEFAULT' not in pcd.SkuInfoList.keys() and 'COMMON' in pcd.SkuInfoList.keys():\r
+                pcd.SkuInfoList['DEFAULT'] = pcd.SkuInfoList['COMMON']\r
+                del(pcd.SkuInfoList['COMMON'])\r
+            elif 'DEFAULT' in pcd.SkuInfoList.keys() and 'COMMON' in pcd.SkuInfoList.keys():\r
+                del(pcd.SkuInfoList['COMMON'])\r
+            if SkuObj.SkuUsageType == SkuObj.SINGLE:\r
+                if 'DEFAULT' in pcd.SkuInfoList.keys() and SkuObj.SystemSkuId not in pcd.SkuInfoList.keys():\r
+                    pcd.SkuInfoList[SkuObj.SystemSkuId] = pcd.SkuInfoList['DEFAULT']\r
+                del(pcd.SkuInfoList['DEFAULT'])\r
+            \r
         return Pcds\r
 \r
     ## Add external modules\r
@@ -841,6 +1101,8 @@ class DscBuildData(PlatformBuildClassObject):
     SupArchList         = property(_GetSupArch)\r
     BuildTargets        = property(_GetBuildTarget)\r
     SkuName             = property(_GetSkuName, _SetSkuName)\r
+    SkuIdentifier       = property(_GetSkuIdentifier)\r
+    PcdInfoFlag         = property(_GetPcdInfoFlag)\r
     FlashDefinition     = property(_GetFdfFile)\r
     BuildNumber         = property(_GetBuildNumber)\r
     MakefileName        = property(_GetMakefileName)\r
@@ -1303,6 +1565,8 @@ class InfBuildData(ModuleBuildClassObject):
 \r
     ## Set all internal used members of InfBuildData to None\r
     def _Clear(self):\r
+        self._HeaderComments = None\r
+        self._TailComments = None\r
         self._Header_               = None\r
         self._AutoGenVersion        = None\r
         self._BaseName              = None\r
@@ -1329,11 +1593,16 @@ class InfBuildData(ModuleBuildClassObject):
         self._LibraryClasses        = None\r
         self._Libraries             = None\r
         self._Protocols             = None\r
+        self._ProtocolComments = None\r
         self._Ppis                  = None\r
+        self._PpiComments = None\r
         self._Guids                 = None\r
+        self._GuidsUsedByPcd = sdict()\r
+        self._GuidComments = None\r
         self._Includes              = None\r
         self._Packages              = None\r
         self._Pcds                  = None\r
+        self._PcdComments = None\r
         self._BuildOptions          = None\r
         self._Depex                 = None\r
         self._DepexExpression       = None\r
@@ -1343,10 +1612,10 @@ class InfBuildData(ModuleBuildClassObject):
     def _GetMacros(self):\r
         if self.__Macros == None:\r
             self.__Macros = {}\r
-            # EDK_GLOBAL defined macros can be applied to EDK modoule\r
+            # EDK_GLOBAL defined macros can be applied to EDK module\r
             if self.AutoGenVersion < 0x00010005:\r
                 self.__Macros.update(GlobalData.gEdkGlobal)\r
-            self.__Macros.update(GlobalData.gGlobalDefines)\r
+                self.__Macros.update(GlobalData.gGlobalDefines)\r
         return self.__Macros\r
 \r
     ## Get architecture\r
@@ -1383,7 +1652,20 @@ class InfBuildData(ModuleBuildClassObject):
             return\r
         self._Platform = Value\r
         self._Clear()\r
-\r
+    def _GetHeaderComments(self):\r
+        if not self._HeaderComments:\r
+            self._HeaderComments = []\r
+            RecordList = self._RawData[MODEL_META_DATA_HEADER_COMMENT]\r
+            for Record in RecordList:\r
+                self._HeaderComments.append(Record[0])\r
+        return self._HeaderComments\r
+    def _GetTailComments(self):\r
+        if not self._TailComments:\r
+            self._TailComments = []\r
+            RecordList = self._RawData[MODEL_META_DATA_TAIL_COMMENT]\r
+            for Record in RecordList:\r
+                self._TailComments.append(Record[0])\r
+        return self._TailComments\r
     ## Retrieve all information in [Defines] section\r
     #\r
     #   (Retriving all [Defines] information in one-shot is just to save time.)\r
@@ -1760,8 +2042,6 @@ class InfBuildData(ModuleBuildClassObject):
             self._Sources = []\r
             RecordList = self._RawData[MODEL_EFI_SOURCE_FILE, self._Arch, self._Platform]\r
             Macros = self._Macros\r
-            Macros["EDK_SOURCE"] = GlobalData.gEcpSource\r
-            Macros['PROCESSOR'] = self._Arch\r
             for Record in RecordList:\r
                 LineNo = Record[-1]\r
                 ToolChainFamily = Record[1]\r
@@ -1769,6 +2049,8 @@ class InfBuildData(ModuleBuildClassObject):
                 ToolCode = Record[3]\r
                 FeatureFlag = Record[4]\r
                 if self.AutoGenVersion < 0x00010005:\r
+                    Macros["EDK_SOURCE"] = GlobalData.gEcpSource\r
+                    Macros['PROCESSOR'] = self._Arch\r
                     # old module source files (Edk)\r
                     File = PathClass(NormPath(Record[0], Macros), self._ModuleDir, self._SourceOverridePath,\r
                                      '', False, self._Arch, ToolChainFamily, '', TagName, ToolCode)\r
@@ -1818,10 +2100,14 @@ class InfBuildData(ModuleBuildClassObject):
                     self._Libraries.append(LibraryName)\r
         return self._Libraries\r
 \r
+    def _GetProtocolComments(self):\r
+        self._GetProtocols()\r
+        return self._ProtocolComments\r
     ## Retrieve protocols consumed/produced by this module\r
     def _GetProtocols(self):\r
         if self._Protocols == None:\r
             self._Protocols = sdict()\r
+            self._ProtocolComments = sdict()\r
             RecordList = self._RawData[MODEL_EFI_PROTOCOL, self._Arch, self._Platform]\r
             for Record in RecordList:\r
                 CName = Record[0]\r
@@ -1832,12 +2118,21 @@ class InfBuildData(ModuleBuildClassObject):
                                     "Value of Protocol [%s] is not found under [Protocols] section in" % CName,\r
                                     ExtraData=PackageList, File=self.MetaFile, Line=Record[-1])\r
                 self._Protocols[CName] = Value\r
+                CommentRecords = self._RawData[MODEL_META_DATA_COMMENT, self._Arch, self._Platform, Record[5]]\r
+                Comments = []\r
+                for CmtRec in CommentRecords:\r
+                    Comments.append(CmtRec[0])\r
+                self._ProtocolComments[CName] = Comments\r
         return self._Protocols\r
 \r
+    def _GetPpiComments(self):\r
+        self._GetPpis()\r
+        return self._PpiComments\r
     ## Retrieve PPIs consumed/produced by this module\r
     def _GetPpis(self):\r
         if self._Ppis == None:\r
             self._Ppis = sdict()\r
+            self._PpiComments = sdict()\r
             RecordList = self._RawData[MODEL_EFI_PPI, self._Arch, self._Platform]\r
             for Record in RecordList:\r
                 CName = Record[0]\r
@@ -1848,12 +2143,21 @@ class InfBuildData(ModuleBuildClassObject):
                                     "Value of PPI [%s] is not found under [Ppis] section in " % CName,\r
                                     ExtraData=PackageList, File=self.MetaFile, Line=Record[-1])\r
                 self._Ppis[CName] = Value\r
+                CommentRecords = self._RawData[MODEL_META_DATA_COMMENT, self._Arch, self._Platform, Record[5]]\r
+                Comments = []\r
+                for CmtRec in CommentRecords:\r
+                    Comments.append(CmtRec[0])\r
+                self._PpiComments[CName] = Comments\r
         return self._Ppis\r
 \r
+    def _GetGuidComments(self):\r
+        self._GetGuids()\r
+        return self._GuidComments\r
     ## Retrieve GUIDs consumed/produced by this module\r
     def _GetGuids(self):\r
         if self._Guids == None:\r
             self._Guids = sdict()\r
+            self._GuidComments = sdict()\r
             RecordList = self._RawData[MODEL_EFI_GUID, self._Arch, self._Platform]\r
             for Record in RecordList:\r
                 CName = Record[0]\r
@@ -1864,6 +2168,11 @@ class InfBuildData(ModuleBuildClassObject):
                                     "Value of Guid [%s] is not found under [Guids] section in" % CName,\r
                                     ExtraData=PackageList, File=self.MetaFile, Line=Record[-1])\r
                 self._Guids[CName] = Value\r
+                CommentRecords = self._RawData[MODEL_META_DATA_COMMENT, self._Arch, self._Platform, Record[5]]\r
+                Comments = []\r
+                for CmtRec in CommentRecords:\r
+                    Comments.append(CmtRec[0])\r
+                self._GuidComments[CName] = Comments\r
         return self._Guids\r
 \r
     ## Retrieve include paths necessary for this module (for Edk.x style of modules)\r
@@ -1931,10 +2240,15 @@ class InfBuildData(ModuleBuildClassObject):
                 self._Packages.append(Package)\r
         return self._Packages\r
 \r
+    ## Retrieve PCD comments\r
+    def _GetPcdComments(self):\r
+        self._GetPcds()\r
+        return self._PcdComments\r
     ## Retrieve PCDs used in this module\r
     def _GetPcds(self):\r
         if self._Pcds == None:\r
             self._Pcds = sdict()\r
+            self._PcdComments = sdict()\r
             self._Pcds.update(self._GetPcd(MODEL_PCD_FIXED_AT_BUILD))\r
             self._Pcds.update(self._GetPcd(MODEL_PCD_PATCHABLE_IN_MODULE))\r
             self._Pcds.update(self._GetPcd(MODEL_PCD_FEATURE_FLAG))\r
@@ -2032,13 +2346,15 @@ class InfBuildData(ModuleBuildClassObject):
                 self._DepexExpression[Arch, ModuleType] = DepexExpression[Arch, ModuleType]\r
         return self._DepexExpression\r
 \r
+    def GetGuidsUsedByPcd(self):\r
+        return self._GuidsUsedByPcd\r
     ## Retrieve PCD for given type\r
     def _GetPcd(self, Type):\r
         Pcds = sdict()\r
         PcdDict = tdict(True, 4)\r
         PcdList = []\r
         RecordList = self._RawData[Type, self._Arch, self._Platform]\r
-        for TokenSpaceGuid, PcdCName, Setting, Arch, Platform, Dummy1, LineNo in RecordList:\r
+        for TokenSpaceGuid, PcdCName, Setting, Arch, Platform, Id, LineNo in RecordList:\r
             PcdDict[Arch, Platform, PcdCName, TokenSpaceGuid] = (Setting, LineNo)\r
             PcdList.append((PcdCName, TokenSpaceGuid))\r
             # get the guid value\r
@@ -2050,6 +2366,12 @@ class InfBuildData(ModuleBuildClassObject):
                                     "Value of Guid [%s] is not found under [Guids] section in" % TokenSpaceGuid,\r
                                     ExtraData=PackageList, File=self.MetaFile, Line=LineNo)\r
                 self.Guids[TokenSpaceGuid] = Value\r
+                self._GuidsUsedByPcd[TokenSpaceGuid] = Value\r
+            CommentRecords = self._RawData[MODEL_META_DATA_COMMENT, self._Arch, self._Platform, Id]\r
+            Comments = []\r
+            for CmtRec in CommentRecords:\r
+                Comments.append(CmtRec[0])\r
+            self._PcdComments[TokenSpaceGuid, PcdCName] = Comments\r
 \r
         # resolve PCD type, value, datum info, etc. by getting its definition from package\r
         for PcdCName, TokenSpaceGuid in PcdList:\r
@@ -2070,6 +2392,9 @@ class InfBuildData(ModuleBuildClassObject):
                     False,\r
                     self.Guids[TokenSpaceGuid]\r
                     )\r
+            if Type == MODEL_PCD_PATCHABLE_IN_MODULE and ValueList[1]:\r
+                # Patch PCD: TokenSpace.PcdCName|Value|Offset\r
+                Pcd.Offset = ValueList[1]\r
 \r
             # get necessary info from package declaring this PCD\r
             for Package in self.Packages:\r
@@ -2161,10 +2486,21 @@ class InfBuildData(ModuleBuildClassObject):
 \r
         return Pcds\r
 \r
-    _Macros                 = property(_GetMacros)\r
-    Arch                    = property(_GetArch, _SetArch)\r
-    Platform                = property(_GetPlatform, _SetPlatform)\r
+    ## check whether current module is binary module\r
+    def _IsBinaryModule(self):\r
+        if self.Binaries and not self.Sources:\r
+            return True\r
+        elif GlobalData.gIgnoreSource:\r
+            return True\r
+        else:\r
+            return False\r
+\r
+    _Macros = property(_GetMacros)\r
+    Arch = property(_GetArch, _SetArch)\r
+    Platform = property(_GetPlatform, _SetPlatform)\r
 \r
+    HeaderComments = property(_GetHeaderComments)\r
+    TailComments = property(_GetTailComments)\r
     AutoGenVersion          = property(_GetInfVersion)\r
     BaseName                = property(_GetBaseName)\r
     ModuleType              = property(_GetModuleType)\r
@@ -2189,14 +2525,19 @@ class InfBuildData(ModuleBuildClassObject):
     LibraryClasses          = property(_GetLibraryClassUses)\r
     Libraries               = property(_GetLibraryNames)\r
     Protocols               = property(_GetProtocols)\r
+    ProtocolComments = property(_GetProtocolComments)\r
     Ppis                    = property(_GetPpis)\r
+    PpiComments = property(_GetPpiComments)\r
     Guids                   = property(_GetGuids)\r
+    GuidComments = property(_GetGuidComments)\r
     Includes                = property(_GetIncludes)\r
     Packages                = property(_GetPackages)\r
     Pcds                    = property(_GetPcds)\r
+    PcdComments = property(_GetPcdComments)\r
     BuildOptions            = property(_GetBuildOptions)\r
     Depex                   = property(_GetDepex)\r
     DepexExpression         = property(_GetDepexExpression)\r
+    IsBinaryModule = property(_IsBinaryModule)\r
 \r
 ## Database\r
 #\r