]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/Workspace/WorkspaceDatabase.py
BaseTools/build: Expand PREBUILD/POSTBUILD DSC actions
[mirror_edk2.git] / BaseTools / Source / Python / Workspace / WorkspaceDatabase.py
index b2c4d6e4dafbf7657b2ef202eaebb0b9adbdc3f1..fe2c7c17c4699b3d03ad6202f39b2744411c7a43 100644 (file)
@@ -1,7 +1,8 @@
 ## @file\r
 # This file is used to create a database used by build tool\r
 #\r
-# Copyright (c) 2008 - 2016, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2008 - 2017, Intel Corporation. All rights reserved.<BR>\r
+# (C) Copyright 2016 Hewlett Packard Enterprise Development LP<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
@@ -230,9 +231,21 @@ class DscBuildData(PlatformBuildClassObject):
                     EdkLogger.error('build', ErrorCode, File=self.MetaFile, Line=Record[-1],\r
                                     ExtraData=ErrorInfo)\r
             elif Name == TAB_DSC_PREBUILD:\r
-                self._Prebuild = PathClass(NormPath(Record[2], self._Macros), GlobalData.gWorkspace)\r
+                PrebuildValue = Record[2]\r
+                if Record[2][0] == '"':\r
+                    if Record[2][-1] != '"':\r
+                        EdkLogger.error('build', FORMAT_INVALID, 'Missing double quotes in the end of %s statement.' % TAB_DSC_PREBUILD,\r
+                                    File=self.MetaFile, Line=Record[-1])\r
+                    PrebuildValue = Record[2][1:-1]\r
+                self._Prebuild = PrebuildValue\r
             elif Name == TAB_DSC_POSTBUILD:\r
-                self._Postbuild = PathClass(NormPath(Record[2], self._Macros), GlobalData.gWorkspace)\r
+                PostbuildValue = Record[2]\r
+                if Record[2][0] == '"':\r
+                    if Record[2][-1] != '"':\r
+                        EdkLogger.error('build', FORMAT_INVALID, 'Missing double quotes in the end of %s statement.' % TAB_DSC_POSTBUILD,\r
+                                    File=self.MetaFile, Line=Record[-1])\r
+                    PostbuildValue = Record[2][1:-1]\r
+                self._Postbuild = PostbuildValue\r
             elif Name == TAB_DSC_DEFINES_SUPPORTED_ARCHITECTURES:\r
                 self._SupArchList = GetSplitValueList(Record[2], TAB_VALUE_SPLIT)\r
             elif Name == TAB_DSC_DEFINES_BUILD_TARGETS:\r
@@ -543,6 +556,7 @@ class DscBuildData(PlatformBuildClassObject):
         Macros["EDK_SOURCE"] = GlobalData.gEcpSource\r
         for Record in RecordList:\r
             DuplicatedFile = False\r
+\r
             ModuleFile = PathClass(NormPath(Record[0], Macros), GlobalData.gWorkspace, Arch=self._Arch)\r
             ModuleId = Record[5]\r
             LineNo = Record[6]\r
@@ -800,9 +814,10 @@ class DscBuildData(PlatformBuildClassObject):
             options = sdict()\r
             self._ModuleTypeOptions[Edk, ModuleType] = options\r
             DriverType = '%s.%s' % (Edk, ModuleType)\r
+            CommonDriverType = '%s.%s' % ('COMMON', ModuleType)\r
             RecordList = self._RawData[MODEL_META_DATA_BUILD_OPTION, self._Arch, DriverType]\r
             for ToolChainFamily, ToolChain, Option, Arch, Type, Dummy3, Dummy4 in RecordList:\r
-                if Type == DriverType:\r
+                if Type == DriverType or Type == CommonDriverType:\r
                     Key = (ToolChainFamily, ToolChain, Edk)\r
                     if Key not in options or not ToolChain.endswith('_FLAGS') or Option.startswith('='):\r
                         options[Key] = Option\r
@@ -1326,6 +1341,10 @@ class DecBuildData(PackageBuildClassObject):
         self._LibraryClasses    = None\r
         self._Pcds              = None\r
         self.__Macros           = None\r
+        self._PrivateProtocols  = None\r
+        self._PrivatePpis       = None\r
+        self._PrivateGuids      = None\r
+        self._PrivateIncludes   = None\r
 \r
     ## Get current effective macros\r
     def _GetMacros(self):\r
@@ -1400,21 +1419,38 @@ class DecBuildData(PackageBuildClassObject):
             # protocol defition for given ARCH\r
             #\r
             ProtocolDict = tdict(True)\r
+            PrivateProtocolDict = tdict(True)\r
             NameList = []\r
+            PrivateNameList = []\r
+            PublicNameList = []\r
             # find out all protocol definitions for specific and 'common' arch\r
             RecordList = self._RawData[MODEL_EFI_PROTOCOL, self._Arch]\r
-            for Name, Guid, Dummy, Arch, ID, LineNo in RecordList:\r
+            for Name, Guid, Dummy, Arch, PrivateFlag, ID, LineNo in RecordList:\r
+                if PrivateFlag == 'PRIVATE':\r
+                    if Name not in PrivateNameList:\r
+                        PrivateNameList.append(Name)\r
+                        PrivateProtocolDict[Arch, Name] = Guid\r
+                    if Name in PublicNameList:\r
+                        EdkLogger.error('build', OPTION_CONFLICT, "Can't determine %s's attribute, it is both defined as Private and non-Private attribute in DEC file." % Name, File=self.MetaFile, Line=LineNo)\r
+                else:\r
+                    if Name not in PublicNameList:\r
+                        PublicNameList.append(Name)\r
+                    if Name in PrivateNameList:\r
+                        EdkLogger.error('build', OPTION_CONFLICT, "Can't determine %s's attribute, it is both defined as Private and non-Private attribute in DEC file." % Name, File=self.MetaFile, Line=LineNo)\r
                 if Name not in NameList:\r
                     NameList.append(Name)\r
                 ProtocolDict[Arch, Name] = Guid\r
             # use sdict to keep the order\r
             self._Protocols = sdict()\r
+            self._PrivateProtocols = sdict()\r
             for Name in NameList:\r
                 #\r
                 # limit the ARCH to self._Arch, if no self._Arch found, tdict\r
                 # will automatically turn to 'common' ARCH for trying\r
                 #\r
                 self._Protocols[Name] = ProtocolDict[self._Arch, Name]\r
+            for Name in PrivateNameList:\r
+                self._PrivateProtocols[Name] = PrivateProtocolDict[self._Arch, Name]\r
         return self._Protocols\r
 \r
     ## Retrieve PPI definitions (name/value pairs)\r
@@ -1425,21 +1461,38 @@ class DecBuildData(PackageBuildClassObject):
             # PPI defition for given ARCH\r
             #\r
             PpiDict = tdict(True)\r
+            PrivatePpiDict = tdict(True)\r
             NameList = []\r
+            PrivateNameList = []\r
+            PublicNameList = []\r
             # find out all PPI definitions for specific arch and 'common' arch\r
             RecordList = self._RawData[MODEL_EFI_PPI, self._Arch]\r
-            for Name, Guid, Dummy, Arch, ID, LineNo in RecordList:\r
+            for Name, Guid, Dummy, Arch, PrivateFlag, ID, LineNo in RecordList:\r
+                if PrivateFlag == 'PRIVATE':\r
+                    if Name not in PrivateNameList:\r
+                        PrivateNameList.append(Name)\r
+                        PrivatePpiDict[Arch, Name] = Guid\r
+                    if Name in PublicNameList:\r
+                        EdkLogger.error('build', OPTION_CONFLICT, "Can't determine %s's attribute, it is both defined as Private and non-Private attribute in DEC file." % Name, File=self.MetaFile, Line=LineNo)\r
+                else:\r
+                    if Name not in PublicNameList:\r
+                        PublicNameList.append(Name)\r
+                    if Name in PrivateNameList:\r
+                        EdkLogger.error('build', OPTION_CONFLICT, "Can't determine %s's attribute, it is both defined as Private and non-Private attribute in DEC file." % Name, File=self.MetaFile, Line=LineNo)\r
                 if Name not in NameList:\r
                     NameList.append(Name)\r
                 PpiDict[Arch, Name] = Guid\r
             # use sdict to keep the order\r
             self._Ppis = sdict()\r
+            self._PrivatePpis = sdict()\r
             for Name in NameList:\r
                 #\r
                 # limit the ARCH to self._Arch, if no self._Arch found, tdict\r
                 # will automatically turn to 'common' ARCH for trying\r
                 #\r
                 self._Ppis[Name] = PpiDict[self._Arch, Name]\r
+            for Name in PrivateNameList:\r
+                self._PrivatePpis[Name] = PrivatePpiDict[self._Arch, Name]\r
         return self._Ppis\r
 \r
     ## Retrieve GUID definitions (name/value pairs)\r
@@ -1450,27 +1503,46 @@ class DecBuildData(PackageBuildClassObject):
             # GUID defition for given ARCH\r
             #\r
             GuidDict = tdict(True)\r
+            PrivateGuidDict = tdict(True)\r
             NameList = []\r
+            PrivateNameList = []\r
+            PublicNameList = []\r
             # find out all protocol definitions for specific and 'common' arch\r
             RecordList = self._RawData[MODEL_EFI_GUID, self._Arch]\r
-            for Name, Guid, Dummy, Arch, ID, LineNo in RecordList:\r
+            for Name, Guid, Dummy, Arch, PrivateFlag, ID, LineNo in RecordList:\r
+                if PrivateFlag == 'PRIVATE':\r
+                    if Name not in PrivateNameList:\r
+                        PrivateNameList.append(Name)\r
+                        PrivateGuidDict[Arch, Name] = Guid\r
+                    if Name in PublicNameList:\r
+                        EdkLogger.error('build', OPTION_CONFLICT, "Can't determine %s's attribute, it is both defined as Private and non-Private attribute in DEC file." % Name, File=self.MetaFile, Line=LineNo)\r
+                else:\r
+                    if Name not in PublicNameList:\r
+                        PublicNameList.append(Name)\r
+                    if Name in PrivateNameList:\r
+                        EdkLogger.error('build', OPTION_CONFLICT, "Can't determine %s's attribute, it is both defined as Private and non-Private attribute in DEC file." % Name, File=self.MetaFile, Line=LineNo)\r
                 if Name not in NameList:\r
                     NameList.append(Name)\r
                 GuidDict[Arch, Name] = Guid\r
             # use sdict to keep the order\r
             self._Guids = sdict()\r
+            self._PrivateGuids = sdict()\r
             for Name in NameList:\r
                 #\r
                 # limit the ARCH to self._Arch, if no self._Arch found, tdict\r
                 # will automatically turn to 'common' ARCH for trying\r
                 #\r
                 self._Guids[Name] = GuidDict[self._Arch, Name]\r
+            for Name in PrivateNameList:\r
+                self._PrivateGuids[Name] = PrivateGuidDict[self._Arch, Name]\r
         return self._Guids\r
 \r
     ## Retrieve public include paths declared in this package\r
     def _GetInclude(self):\r
         if self._Includes == None:\r
             self._Includes = []\r
+            self._PrivateIncludes = []\r
+            PublicInclues = []\r
             RecordList = self._RawData[MODEL_EFI_INCLUDE, self._Arch]\r
             Macros = self._Macros\r
             Macros["EDK_SOURCE"] = GlobalData.gEcpSource\r
@@ -1485,6 +1557,17 @@ class DecBuildData(PackageBuildClassObject):
                 # avoid duplicate include path\r
                 if File not in self._Includes:\r
                     self._Includes.append(File)\r
+                if Record[4] == 'PRIVATE':\r
+                    if File not in self._PrivateIncludes:\r
+                        self._PrivateIncludes.append(File)\r
+                    if File in PublicInclues:\r
+                        EdkLogger.error('build', OPTION_CONFLICT, "Can't determine %s's attribute, it is both defined as Private and non-Private attribute in DEC file." % File, File=self.MetaFile, Line=LineNo)\r
+                else:\r
+                    if File not in PublicInclues:\r
+                        PublicInclues.append(File)\r
+                    if File in self._PrivateIncludes:\r
+                        EdkLogger.error('build', OPTION_CONFLICT, "Can't determine %s's attribute, it is both defined as Private and non-Private attribute in DEC file." % File, File=self.MetaFile, Line=LineNo)\r
+\r
         return self._Includes\r
 \r
     ## Retrieve library class declarations (not used in build at present)\r
@@ -1498,7 +1581,7 @@ class DecBuildData(PackageBuildClassObject):
             LibraryClassSet = set()\r
             RecordList = self._RawData[MODEL_EFI_LIBRARY_CLASS, self._Arch]\r
             Macros = self._Macros\r
-            for LibraryClass, File, Dummy, Arch, ID, LineNo in RecordList:\r
+            for LibraryClass, File, Dummy, Arch, PrivateFlag, ID, LineNo in RecordList:\r
                 File = PathClass(NormPath(File, Macros), self._PackageDir, Arch=self._Arch)\r
                 # check the file validation\r
                 ErrorCode, ErrorInfo = File.Validate()\r
@@ -1534,7 +1617,7 @@ class DecBuildData(PackageBuildClassObject):
         PcdSet = set()\r
         # find out all PCDs of the 'type'\r
         RecordList = self._RawData[Type, self._Arch]\r
-        for TokenSpaceGuid, PcdCName, Setting, Arch, Dummy1, Dummy2 in RecordList:\r
+        for TokenSpaceGuid, PcdCName, Setting, Arch, PrivateFlag, Dummy1, Dummy2 in RecordList:\r
             PcdDict[Arch, PcdCName, TokenSpaceGuid] = Setting\r
             PcdSet.add((PcdCName, TokenSpaceGuid))\r
 \r
@@ -1811,6 +1894,7 @@ class InfBuildData(ModuleBuildClassObject):
                 if self._Defs == None:\r
                     self._Defs = sdict()\r
                 self._Defs[Name] = Value\r
+                self._Macros[Name] = Value\r
             # some special items in [Defines] section need special treatment\r
             elif Name in ('EFI_SPECIFICATION_VERSION', 'UEFI_SPECIFICATION_VERSION', 'EDK_RELEASE_VERSION', 'PI_SPECIFICATION_VERSION'):\r
                 if Name in ('EFI_SPECIFICATION_VERSION', 'UEFI_SPECIFICATION_VERSION'):\r
@@ -1871,6 +1955,7 @@ class InfBuildData(ModuleBuildClassObject):
                 if self._Defs == None:\r
                     self._Defs = sdict()\r
                 self._Defs[Name] = Value\r
+                self._Macros[Name] = Value\r
 \r
         #\r
         # Retrieve information in sections specific to Edk.x modules\r
@@ -1892,9 +1977,18 @@ class InfBuildData(ModuleBuildClassObject):
             if (self._Specification == None) or (not 'PI_SPECIFICATION_VERSION' in self._Specification) or (int(self._Specification['PI_SPECIFICATION_VERSION'], 16) < 0x0001000A):\r
                 if self._ModuleType == SUP_MODULE_SMM_CORE:\r
                     EdkLogger.error("build", FORMAT_NOT_SUPPORTED, "SMM_CORE module type can't be used in the module with PI_SPECIFICATION_VERSION less than 0x0001000A", File=self.MetaFile)\r
+            if (self._Specification == None) or (not 'PI_SPECIFICATION_VERSION' in self._Specification) or (int(self._Specification['PI_SPECIFICATION_VERSION'], 16) < 0x00010032):\r
+                if self._ModuleType == SUP_MODULE_MM_CORE_STANDALONE:\r
+                    EdkLogger.error("build", FORMAT_NOT_SUPPORTED, "MM_CORE_STANDALONE module type can't be used in the module with PI_SPECIFICATION_VERSION less than 0x00010032", File=self.MetaFile)\r
+                if self._ModuleType == SUP_MODULE_MM_STANDALONE:\r
+                    EdkLogger.error("build", FORMAT_NOT_SUPPORTED, "MM_STANDALONE module type can't be used in the module with PI_SPECIFICATION_VERSION less than 0x00010032", File=self.MetaFile)\r
             if self._Defs and 'PCI_DEVICE_ID' in self._Defs and 'PCI_VENDOR_ID' in self._Defs \\r
-               and 'PCI_CLASS_CODE' in self._Defs:\r
+               and 'PCI_CLASS_CODE' in self._Defs and 'PCI_REVISION' in self._Defs:\r
                 self._BuildType = 'UEFI_OPTIONROM'\r
+                if 'PCI_COMPRESS' in self._Defs:\r
+                    if self._Defs['PCI_COMPRESS'] not in ('TRUE', 'FALSE'):\r
+                        EdkLogger.error("build", FORMAT_INVALID, "Expected TRUE/FALSE for PCI_COMPRESS: %s" %self.MetaFile)\r
+\r
             elif self._Defs and 'UEFI_HII_RESOURCE_SECTION' in self._Defs \\r
                and self._Defs['UEFI_HII_RESOURCE_SECTION'] == 'TRUE':\r
                 self._BuildType = 'UEFI_HII'\r
@@ -2273,7 +2367,7 @@ class InfBuildData(ModuleBuildClassObject):
             RecordList = self._RawData[MODEL_EFI_PROTOCOL, self._Arch, self._Platform]\r
             for Record in RecordList:\r
                 CName = Record[0]\r
-                Value = ProtocolValue(CName, self.Packages)\r
+                Value = ProtocolValue(CName, self.Packages, self.MetaFile.Path)\r
                 if Value == None:\r
                     PackageList = "\n\t".join([str(P) for P in self.Packages])\r
                     EdkLogger.error('build', RESOURCE_NOT_AVAILABLE,\r
@@ -2298,7 +2392,7 @@ class InfBuildData(ModuleBuildClassObject):
             RecordList = self._RawData[MODEL_EFI_PPI, self._Arch, self._Platform]\r
             for Record in RecordList:\r
                 CName = Record[0]\r
-                Value = PpiValue(CName, self.Packages)\r
+                Value = PpiValue(CName, self.Packages, self.MetaFile.Path)\r
                 if Value == None:\r
                     PackageList = "\n\t".join([str(P) for P in self.Packages])\r
                     EdkLogger.error('build', RESOURCE_NOT_AVAILABLE,\r
@@ -2323,7 +2417,7 @@ class InfBuildData(ModuleBuildClassObject):
             RecordList = self._RawData[MODEL_EFI_GUID, self._Arch, self._Platform]\r
             for Record in RecordList:\r
                 CName = Record[0]\r
-                Value = GuidValue(CName, self.Packages)\r
+                Value = GuidValue(CName, self.Packages, self.MetaFile.Path)\r
                 if Value == None:\r
                     PackageList = "\n\t".join([str(P) for P in self.Packages])\r
                     EdkLogger.error('build', RESOURCE_NOT_AVAILABLE,\r
@@ -2492,11 +2586,11 @@ class InfBuildData(ModuleBuildClassObject):
                         DepexList.append(Module.Guid)\r
                     else:\r
                         # get the GUID value now\r
-                        Value = ProtocolValue(Token, self.Packages)\r
+                        Value = ProtocolValue(Token, self.Packages, self.MetaFile.Path)\r
                         if Value == None:\r
-                            Value = PpiValue(Token, self.Packages)\r
+                            Value = PpiValue(Token, self.Packages, self.MetaFile.Path)\r
                             if Value == None:\r
-                                Value = GuidValue(Token, self.Packages)\r
+                                Value = GuidValue(Token, self.Packages, self.MetaFile.Path)\r
                         if Value == None:\r
                             PackageList = "\n\t".join([str(P) for P in self.Packages])\r
                             EdkLogger.error('build', RESOURCE_NOT_AVAILABLE,\r
@@ -2539,7 +2633,7 @@ class InfBuildData(ModuleBuildClassObject):
             PcdList.append((PcdCName, TokenSpaceGuid))\r
             # get the guid value\r
             if TokenSpaceGuid not in self.Guids:\r
-                Value = GuidValue(TokenSpaceGuid, self.Packages)\r
+                Value = GuidValue(TokenSpaceGuid, self.Packages, self.MetaFile.Path)\r
                 if Value == None:\r
                     PackageList = "\n\t".join([str(P) for P in self.Packages])\r
                     EdkLogger.error('build', RESOURCE_NOT_AVAILABLE,\r
@@ -2555,6 +2649,7 @@ class InfBuildData(ModuleBuildClassObject):
 \r
         # resolve PCD type, value, datum info, etc. by getting its definition from package\r
         for PcdCName, TokenSpaceGuid in PcdList:\r
+            PcdRealName = PcdCName\r
             Setting, LineNo = PcdDict[self._Arch, self.Platform, PcdCName, TokenSpaceGuid]\r
             if Setting == None:\r
                 continue\r
@@ -2576,6 +2671,27 @@ class InfBuildData(ModuleBuildClassObject):
                 # Patch PCD: TokenSpace.PcdCName|Value|Offset\r
                 Pcd.Offset = ValueList[1]\r
 \r
+            if (PcdRealName, TokenSpaceGuid) in GlobalData.MixedPcd:\r
+                for Package in self.Packages:\r
+                    for key in Package.Pcds:\r
+                        if (Package.Pcds[key].TokenCName, Package.Pcds[key].TokenSpaceGuidCName) == (PcdRealName, TokenSpaceGuid):\r
+                            for item in GlobalData.MixedPcd[(PcdRealName, TokenSpaceGuid)]:\r
+                                Pcd_Type = item[0].split('_')[-1]\r
+                                if Pcd_Type == Package.Pcds[key].Type:\r
+                                    Value = Package.Pcds[key]\r
+                                    Value.TokenCName = Package.Pcds[key].TokenCName + '_' + Pcd_Type\r
+                                    if len(key) == 2:\r
+                                        newkey = (Value.TokenCName, key[1])\r
+                                    elif len(key) == 3:\r
+                                        newkey = (Value.TokenCName, key[1], key[2])\r
+                                    del Package.Pcds[key]\r
+                                    Package.Pcds[newkey] = Value\r
+                                    break\r
+                                else:\r
+                                    pass\r
+                        else:\r
+                            pass\r
+\r
             # get necessary info from package declaring this PCD\r
             for Package in self.Packages:\r
                 #\r
@@ -2589,11 +2705,32 @@ class InfBuildData(ModuleBuildClassObject):
                 if Type == MODEL_PCD_DYNAMIC:\r
                     Pcd.Pending = True\r
                     for T in ["FixedAtBuild", "PatchableInModule", "FeatureFlag", "Dynamic", "DynamicEx"]:\r
-                        if (PcdCName, TokenSpaceGuid, T) in Package.Pcds:\r
-                            PcdType = T\r
+                        if (PcdRealName, TokenSpaceGuid) in GlobalData.MixedPcd:\r
+                            for item in GlobalData.MixedPcd[(PcdRealName, TokenSpaceGuid)]:\r
+                                if str(item[0]).endswith(T) and (item[0], item[1], T) in Package.Pcds:\r
+                                    PcdType = T\r
+                                    PcdCName = item[0]\r
+                                    break\r
+                                else:\r
+                                    pass\r
                             break\r
+                        else:\r
+                            if (PcdRealName, TokenSpaceGuid, T) in Package.Pcds:\r
+                                PcdType = T\r
+                                break\r
+\r
                 else:\r
                     Pcd.Pending = False\r
+                    if (PcdRealName, TokenSpaceGuid) in GlobalData.MixedPcd:\r
+                        for item in GlobalData.MixedPcd[(PcdRealName, TokenSpaceGuid)]:\r
+                            Pcd_Type = item[0].split('_')[-1]\r
+                            if Pcd_Type == PcdType:\r
+                                PcdCName = item[0]\r
+                                break\r
+                            else:\r
+                                pass\r
+                    else:\r
+                        pass\r
 \r
                 if (PcdCName, TokenSpaceGuid, PcdType) in Package.Pcds:\r
                     PcdInPackage = Package.Pcds[PcdCName, TokenSpaceGuid, PcdType]\r
@@ -2607,7 +2744,7 @@ class InfBuildData(ModuleBuildClassObject):
                         EdkLogger.error(\r
                                 'build',\r
                                 FORMAT_INVALID,\r
-                                "No TokenValue for PCD [%s.%s] in [%s]!" % (TokenSpaceGuid, PcdCName, str(Package)),\r
+                                "No TokenValue for PCD [%s.%s] in [%s]!" % (TokenSpaceGuid, PcdRealName, str(Package)),\r
                                 File=self.MetaFile, Line=LineNo,\r
                                 ExtraData=None\r
                                 )                        \r
@@ -2620,7 +2757,7 @@ class InfBuildData(ModuleBuildClassObject):
                             EdkLogger.error(\r
                                     'build',\r
                                     FORMAT_INVALID,\r
-                                    "The format of TokenValue [%s] of PCD [%s.%s] in [%s] is invalid:" % (Pcd.TokenValue, TokenSpaceGuid, PcdCName, str(Package)),\r
+                                    "The format of TokenValue [%s] of PCD [%s.%s] in [%s] is invalid:" % (Pcd.TokenValue, TokenSpaceGuid, PcdRealName, str(Package)),\r
                                     File=self.MetaFile, Line=LineNo,\r
                                     ExtraData=None\r
                                     )\r
@@ -2635,7 +2772,7 @@ class InfBuildData(ModuleBuildClassObject):
                                 EdkLogger.error(\r
                                             'build',\r
                                             FORMAT_INVALID,\r
-                                            "The format of TokenValue [%s] of PCD [%s.%s] in [%s] is invalid, as a decimal it should between: 0 - 4294967295!" % (Pcd.TokenValue, TokenSpaceGuid, PcdCName, str(Package)),\r
+                                            "The format of TokenValue [%s] of PCD [%s.%s] in [%s] is invalid, as a decimal it should between: 0 - 4294967295!" % (Pcd.TokenValue, TokenSpaceGuid, PcdRealName, str(Package)),\r
                                             File=self.MetaFile, Line=LineNo,\r
                                             ExtraData=None\r
                                             )\r
@@ -2643,7 +2780,7 @@ class InfBuildData(ModuleBuildClassObject):
                             EdkLogger.error(\r
                                         'build',\r
                                         FORMAT_INVALID,\r
-                                        "The format of TokenValue [%s] of PCD [%s.%s] in [%s] is invalid, it should be hexadecimal or decimal!" % (Pcd.TokenValue, TokenSpaceGuid, PcdCName, str(Package)),\r
+                                        "The format of TokenValue [%s] of PCD [%s.%s] in [%s] is invalid, it should be hexadecimal or decimal!" % (Pcd.TokenValue, TokenSpaceGuid, PcdRealName, str(Package)),\r
                                         File=self.MetaFile, Line=LineNo,\r
                                         ExtraData=None\r
                                         )\r
@@ -2658,7 +2795,7 @@ class InfBuildData(ModuleBuildClassObject):
                 EdkLogger.error(\r
                             'build',\r
                             FORMAT_INVALID,\r
-                            "PCD [%s.%s] in [%s] is not found in dependent packages:" % (TokenSpaceGuid, PcdCName, self.MetaFile),\r
+                            "PCD [%s.%s] in [%s] is not found in dependent packages:" % (TokenSpaceGuid, PcdRealName, self.MetaFile),\r
                             File=self.MetaFile, Line=LineNo,\r
                             ExtraData="\t%s" % '\n\t'.join([str(P) for P in self.Packages])\r
                             )\r
@@ -2808,6 +2945,7 @@ class WorkspaceDatabase(object):
             MetaFile = self._FILE_PARSER_[FileType](\r
                                 FilePath, \r
                                 FileType, \r
+                                Arch,\r
                                 MetaFileStorage(self.WorkspaceDb.Cur, FilePath, FileType)\r
                                 )\r
             # alwasy do post-process, in case of macros change\r
@@ -3004,10 +3142,9 @@ determine whether database file is out of date!\n")
         return PlatformList\r
 \r
     def _MapPlatform(self, Dscfile):\r
-        try:\r
-            Platform = self.BuildObject[PathClass(Dscfile), 'COMMON']\r
-        except:\r
-            Platform = None\r
+        Platform = self.BuildObject[PathClass(Dscfile), 'COMMON']\r
+        if Platform == None:\r
+            EdkLogger.error('build', PARSER_ERROR, "Failed to parser DSC file: %s" % Dscfile)\r
         return Platform\r
 \r
     PlatformList = property(_GetPlatformList)\r