]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/Workspace/DscBuildData.py
BaseTools: Various typo
[mirror_edk2.git] / BaseTools / Source / Python / Workspace / DscBuildData.py
index ff41af13723435753a9e4764acd95878d8eef0d3..1fd1639ab6dd32ff5003e7f9f2cfacde8a2fb1cd 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 - 2018, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2008 - 2019, 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
@@ -39,11 +39,28 @@ from Common.Parsing import IsValidWord
 from Common.VariableAttributes import VariableAttributes\r
 import Common.GlobalData as GlobalData\r
 import subprocess\r
+from functools import reduce\r
 from Common.Misc import SaveFileOnChange\r
 from Workspace.BuildClassObject import PlatformBuildClassObject, StructurePcd, PcdClassObject, ModuleBuildClassObject\r
 from collections import OrderedDict, defaultdict\r
 from .BuildClassObject import ArrayIndex\r
 \r
+def _IsFieldValueAnArray (Value):\r
+    Value = Value.strip()\r
+    if Value.startswith(TAB_GUID) and Value.endswith(')'):\r
+        return True\r
+    if Value.startswith('L"') and Value.endswith('"')  and len(list(Value[2:-1])) > 1:\r
+        return True\r
+    if Value[0] == '"' and Value[-1] == '"' and len(list(Value[1:-1])) > 1:\r
+        return True\r
+    if Value[0] == '{' and Value[-1] == '}':\r
+        return True\r
+    if Value.startswith("L'") and Value.endswith("'") and len(list(Value[2:-1])) > 1:\r
+        return True\r
+    if Value[0] == "'" and Value[-1] == "'" and len(list(Value[1:-1])) > 1:\r
+        return True\r
+    return False\r
+\r
 PcdValueInitName = 'PcdValueInit'\r
 \r
 PcdMainCHeader = '''\r
@@ -139,7 +156,14 @@ def GetDependencyList(FileStack, SearchPathList):
                 continue\r
 \r
             if FileContent[0] == 0xff or FileContent[0] == 0xfe:\r
-                FileContent = unicode(FileContent, "utf-16")\r
+                FileContent = FileContent.decode('utf-16')\r
+                IncludedFileList = gIncludePattern.findall(FileContent)\r
+            else:\r
+                try:\r
+                    FileContent = str(FileContent)\r
+                    IncludedFileList = gIncludePattern.findall(FileContent)\r
+                except:\r
+                    pass\r
             IncludedFileList = gIncludePattern.findall(FileContent)\r
 \r
             for Inc in IncludedFileList:\r
@@ -319,7 +343,7 @@ class DscBuildData(PlatformBuildClassObject):
 \r
     ## Retrieve all information in [Defines] section\r
     #\r
-    #   (Retriving all [Defines] information in one-shot is just to save time.)\r
+    #   (Retrieving all [Defines] information in one-shot is just to save time.)\r
     #\r
     def _GetHeaderInfo(self):\r
         RecordList = self._RawData[MODEL_META_DATA_HEADER, self._Arch]\r
@@ -706,18 +730,29 @@ class DscBuildData(PlatformBuildClassObject):
             GlobalData.gDefaultStores = sorted(self.DefaultStores.keys())\r
         return self.DefaultStores\r
 \r
+    def OverrideDuplicateModule(self):\r
+        RecordList = self._RawData[MODEL_META_DATA_COMPONENT, self._Arch]\r
+        Macros = self._Macros\r
+        Components = {}\r
+        for Record in RecordList:\r
+            ModuleId = Record[6]\r
+            file_guid = self._RawData[MODEL_META_DATA_HEADER, self._Arch, None, ModuleId]\r
+            file_guid_str = file_guid[0][2] if file_guid else "NULL"\r
+            ModuleFile = PathClass(NormPath(Record[0], Macros), GlobalData.gWorkspace, Arch=self._Arch)\r
+            if self._Arch != TAB_ARCH_COMMON and (file_guid_str,str(ModuleFile)) in Components:\r
+                self._RawData.DisableOverrideComponent(Components[(file_guid_str,str(ModuleFile))])\r
+            Components[(file_guid_str,str(ModuleFile))] = ModuleId\r
+        self._RawData._PostProcessed = False\r
     ## Retrieve [Components] section information\r
     @property\r
     def Modules(self):\r
         if self._Modules is not None:\r
             return self._Modules\r
-\r
+        self.OverrideDuplicateModule()\r
         self._Modules = OrderedDict()\r
         RecordList = self._RawData[MODEL_META_DATA_COMPONENT, self._Arch]\r
         Macros = self._Macros\r
         for Record in RecordList:\r
-            DuplicatedFile = False\r
-\r
             ModuleFile = PathClass(NormPath(Record[0], Macros), GlobalData.gWorkspace, Arch=self._Arch)\r
             ModuleId = Record[6]\r
             LineNo = Record[7]\r
@@ -727,10 +762,6 @@ class DscBuildData(PlatformBuildClassObject):
             if ErrorCode != 0:\r
                 EdkLogger.error('build', ErrorCode, File=self.MetaFile, Line=LineNo,\r
                                 ExtraData=ErrorInfo)\r
-            # Check duplication\r
-            # If arch is COMMON, no duplicate module is checked since all modules in all component sections are selected\r
-            if self._Arch != TAB_ARCH_COMMON and ModuleFile in self._Modules:\r
-                DuplicatedFile = True\r
 \r
             Module = ModuleBuildClassObject()\r
             Module.MetaFile = ModuleFile\r
@@ -793,8 +824,6 @@ class DscBuildData(PlatformBuildClassObject):
                     Module.BuildOptions[ToolChainFamily, ToolChain] = OptionString + " " + Option\r
 \r
             RecordList = self._RawData[MODEL_META_DATA_HEADER, self._Arch, None, ModuleId]\r
-            if DuplicatedFile and not RecordList:\r
-                EdkLogger.error('build', FILE_DUPLICATED, File=self.MetaFile, ExtraData=str(ModuleFile), Line=LineNo)\r
             if RecordList:\r
                 if len(RecordList) != 1:\r
                     EdkLogger.error('build', OPTION_UNKNOWN, 'Only FILE_GUID can be listed in <Defines> section.',\r
@@ -1102,7 +1131,7 @@ class DscBuildData(PlatformBuildClassObject):
             IsArray = False\r
             TokenCName += '.' + FieldName\r
         if PcdValue.startswith('H'):\r
-            if FieldName and IsFieldValueAnArray(PcdValue[1:]):\r
+            if FieldName and _IsFieldValueAnArray(PcdValue[1:]):\r
                 PcdDatumType = TAB_VOID\r
                 IsArray = True\r
             if FieldName and not IsArray:\r
@@ -1113,7 +1142,7 @@ class DscBuildData(PlatformBuildClassObject):
                 EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s",  %s' %\r
                                 (TokenSpaceGuidCName, TokenCName, PcdValue, Value))\r
         elif PcdValue.startswith("L'") or PcdValue.startswith("'"):\r
-            if FieldName and IsFieldValueAnArray(PcdValue):\r
+            if FieldName and _IsFieldValueAnArray(PcdValue):\r
                 PcdDatumType = TAB_VOID\r
                 IsArray = True\r
             if FieldName and not IsArray:\r
@@ -1125,7 +1154,7 @@ class DscBuildData(PlatformBuildClassObject):
                                 (TokenSpaceGuidCName, TokenCName, PcdValue, Value))\r
         elif PcdValue.startswith('L'):\r
             PcdValue = 'L"' + PcdValue[1:] + '"'\r
-            if FieldName and IsFieldValueAnArray(PcdValue):\r
+            if FieldName and _IsFieldValueAnArray(PcdValue):\r
                 PcdDatumType = TAB_VOID\r
                 IsArray = True\r
             if FieldName and not IsArray:\r
@@ -1154,7 +1183,7 @@ class DscBuildData(PlatformBuildClassObject):
                     Num = int(PcdValue, Base)\r
                 except:\r
                     PcdValue = '"' + PcdValue + '"'\r
-                if IsFieldValueAnArray(PcdValue):\r
+                if _IsFieldValueAnArray(PcdValue):\r
                     PcdDatumType = TAB_VOID\r
                     IsArray = True\r
                 if not IsArray:\r
@@ -1490,9 +1519,9 @@ class DscBuildData(PlatformBuildClassObject):
                         else:\r
                             str_pcd_obj_str.DefaultFromDSC = {skuname:{defaultstore: str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.get(defaultstore, str_pcd_obj.SkuInfoList[skuname].DefaultValue) for defaultstore in DefaultStores} for skuname in str_pcd_obj.SkuInfoList}\r
                     S_pcd_set[Pcd] = str_pcd_obj_str\r
-        self.FilterStrcturePcd(S_pcd_set)\r
         if S_pcd_set:\r
-            GlobalData.gStructurePcd[self.Arch] = S_pcd_set\r
+            GlobalData.gStructurePcd[self.Arch] = S_pcd_set.copy()\r
+        self.FilterStrcturePcd(S_pcd_set)\r
         for stru_pcd in S_pcd_set.values():\r
             for skuid in SkuIds:\r
                 if skuid in stru_pcd.SkuOverrideValues:\r
@@ -1584,7 +1613,7 @@ class DscBuildData(PlatformBuildClassObject):
                 elif TAB_DEFAULT in pcd.SkuInfoList and TAB_COMMON in pcd.SkuInfoList:\r
                     del pcd.SkuInfoList[TAB_COMMON]\r
 \r
-        map(self.FilterSkuSettings, [Pcds[pcdkey] for pcdkey in Pcds if Pcds[pcdkey].Type in DynamicPcdType])\r
+        list(map(self.FilterSkuSettings, [Pcds[pcdkey] for pcdkey in Pcds if Pcds[pcdkey].Type in DynamicPcdType]))\r
         return Pcds\r
     @cached_property\r
     def PlatformUsedPcds(self):\r
@@ -1593,7 +1622,7 @@ class DscBuildData(PlatformBuildClassObject):
             FdfInfList = GlobalData.gFdfParser.Profile.InfList\r
         FdfModuleList = [PathClass(NormPath(Inf), GlobalData.gWorkspace, Arch=self._Arch) for Inf in FdfInfList]\r
         AllModulePcds = set()\r
-        ModuleSet = set(self._Modules.keys() + FdfModuleList)\r
+        ModuleSet = set(list(self._Modules.keys()) + FdfModuleList)\r
         for ModuleFile in ModuleSet:\r
             ModuleData = self._Bdb[ModuleFile, self._Arch, self._Target, self._Toolchain]\r
             AllModulePcds = AllModulePcds | ModuleData.PcdsName\r
@@ -1655,7 +1684,7 @@ class DscBuildData(PlatformBuildClassObject):
             else:\r
                 PcdValueDict[PcdCName, TokenSpaceGuid] = {SkuName:(PcdValue, DatumType, MaxDatumSize)}\r
 \r
-        for ((PcdCName, TokenSpaceGuid), PcdSetting) in PcdValueDict.iteritems():\r
+        for ((PcdCName, TokenSpaceGuid), PcdSetting) in PcdValueDict.items():\r
             if self.SkuIdMgr.SystemSkuId in PcdSetting:\r
                 PcdValue, DatumType, MaxDatumSize = PcdSetting[self.SkuIdMgr.SystemSkuId]\r
             elif TAB_DEFAULT in PcdSetting:\r
@@ -1721,7 +1750,7 @@ class DscBuildData(PlatformBuildClassObject):
         except:\r
             EdkLogger.error('Build', COMMAND_FAILURE, 'Can not execute command: %s' % Command)\r
         Result = Process.communicate()\r
-        return Process.returncode, Result[0], Result[1]\r
+        return Process.returncode, Result[0].decode(encoding='utf-8', errors='ignore'), Result[1].decode(encoding='utf-8', errors='ignore')\r
 \r
     @staticmethod\r
     def IntToCString(Value, ValueSize):\r
@@ -1759,7 +1788,7 @@ class DscBuildData(PlatformBuildClassObject):
                 continue\r
             for FieldName in FieldList:\r
                 FieldName = "." + FieldName\r
-                IsArray = IsFieldValueAnArray(FieldList[FieldName.strip(".")][0])\r
+                IsArray = _IsFieldValueAnArray(FieldList[FieldName.strip(".")][0])\r
                 if IsArray and not (FieldList[FieldName.strip(".")][0].startswith('{GUID') and FieldList[FieldName.strip(".")][0].endswith('}')):\r
                     try:\r
                         Value = ValueExpressionEx(FieldList[FieldName.strip(".")][0], TAB_VOID, self._GuidDict)(True)\r
@@ -1767,7 +1796,8 @@ class DscBuildData(PlatformBuildClassObject):
                         EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
                                         (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName.strip('.'))), FieldList[FieldName.strip(".")][1], FieldList[FieldName.strip(".")][2]))\r
                     Value, ValueSize = ParseFieldValue(Value)\r
-                    CApp = CApp + '  __FLEXIBLE_SIZE(*Size, %s, %s, %d / __ARRAY_ELEMENT_SIZE(%s, %s) + ((%d %% __ARRAY_ELEMENT_SIZE(%s, %s)) ? 1 : 0));  // From %s Line %d Value %s \n' % (Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), FieldList[FieldName.strip(".")][1], FieldList[FieldName.strip(".")][2], FieldList[FieldName.strip(".")][0]);\r
+                    if not Pcd.IsArray:\r
+                        CApp = CApp + '  __FLEXIBLE_SIZE(*Size, %s, %s, %d / __ARRAY_ELEMENT_SIZE(%s, %s) + ((%d %% __ARRAY_ELEMENT_SIZE(%s, %s)) ? 1 : 0));  // From %s Line %d Value %s \n' % (Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), FieldList[FieldName.strip(".")][1], FieldList[FieldName.strip(".")][2], FieldList[FieldName.strip(".")][0]);\r
                 else:\r
                     NewFieldName = ''\r
                     FieldName_ori = FieldName.strip('.')\r
@@ -1776,7 +1806,7 @@ class DscBuildData(PlatformBuildClassObject):
                         ArrayIndex = int(FieldName.split('[', 1)[1].split(']', 1)[0])\r
                         FieldName = FieldName.split(']', 1)[1]\r
                     FieldName = NewFieldName + FieldName\r
-                    while '[' in FieldName:\r
+                    while '[' in FieldName and not Pcd.IsArray:\r
                         FieldName = FieldName.rsplit('[', 1)[0]\r
                         CApp = CApp + '  __FLEXIBLE_SIZE(*Size, %s, %s, %d); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName.strip("."), ArrayIndex + 1, FieldList[FieldName_ori][1], FieldList[FieldName_ori][2], FieldList[FieldName_ori][0])\r
         for skuname in Pcd.SkuOverrideValues:\r
@@ -1790,7 +1820,7 @@ class DscBuildData(PlatformBuildClassObject):
                             continue\r
                         for FieldName in FieldList:\r
                             FieldName = "." + FieldName\r
-                            IsArray = IsFieldValueAnArray(FieldList[FieldName.strip(".")][0])\r
+                            IsArray = _IsFieldValueAnArray(FieldList[FieldName.strip(".")][0])\r
                             if IsArray and not (FieldList[FieldName.strip(".")][0].startswith('{GUID') and FieldList[FieldName.strip(".")][0].endswith('}')):\r
                                 try:\r
                                     Value = ValueExpressionEx(FieldList[FieldName.strip(".")][0], TAB_VOID, self._GuidDict)(True)\r
@@ -1798,7 +1828,8 @@ class DscBuildData(PlatformBuildClassObject):
                                     EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
                                                     (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName.strip('.'))), FieldList[FieldName.strip(".")][1], FieldList[FieldName.strip(".")][2]))\r
                                 Value, ValueSize = ParseFieldValue(Value)\r
-                                CApp = CApp + '  __FLEXIBLE_SIZE(*Size, %s, %s, %d / __ARRAY_ELEMENT_SIZE(%s, %s) + ((%d %% __ARRAY_ELEMENT_SIZE(%s, %s)) ? 1 : 0)); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), FieldList[FieldName.strip(".")][1], FieldList[FieldName.strip(".")][2], FieldList[FieldName.strip(".")][0]);\r
+                                if not Pcd.IsArray:\r
+                                    CApp = CApp + '  __FLEXIBLE_SIZE(*Size, %s, %s, %d / __ARRAY_ELEMENT_SIZE(%s, %s) + ((%d %% __ARRAY_ELEMENT_SIZE(%s, %s)) ? 1 : 0)); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), FieldList[FieldName.strip(".")][1], FieldList[FieldName.strip(".")][2], FieldList[FieldName.strip(".")][0]);\r
                             else:\r
                                 NewFieldName = ''\r
                                 FieldName_ori = FieldName.strip('.')\r
@@ -1807,14 +1838,14 @@ class DscBuildData(PlatformBuildClassObject):
                                     ArrayIndex = int(FieldName.split('[', 1)[1].split(']', 1)[0])\r
                                     FieldName = FieldName.split(']', 1)[1]\r
                                 FieldName = NewFieldName + FieldName\r
-                                while '[' in FieldName:\r
+                                while '[' in FieldName and not Pcd.IsArray:\r
                                     FieldName = FieldName.rsplit('[', 1)[0]\r
                                     CApp = CApp + '  __FLEXIBLE_SIZE(*Size, %s, %s, %d); // From %s Line %d Value %s \n' % (Pcd.DatumType, FieldName.strip("."), ArrayIndex + 1, FieldList[FieldName_ori][1], FieldList[FieldName_ori][2], FieldList[FieldName_ori][0])\r
         if Pcd.PcdFieldValueFromFdf:\r
             CApp = CApp + "// From fdf \n"\r
         for FieldName in Pcd.PcdFieldValueFromFdf:\r
             FieldName = "." + FieldName\r
-            IsArray = IsFieldValueAnArray(Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][0])\r
+            IsArray = _IsFieldValueAnArray(Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][0])\r
             if IsArray and not (Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][0].startswith('{GUID') and Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][0].endswith('}')):\r
                 try:\r
                     Value = ValueExpressionEx(Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][0], TAB_VOID, self._GuidDict)(True)\r
@@ -1822,7 +1853,8 @@ class DscBuildData(PlatformBuildClassObject):
                     EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
                                     (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName.strip('.'))), Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][1], Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][2]))\r
                 Value, ValueSize = ParseFieldValue(Value)\r
-                CApp = CApp + '  __FLEXIBLE_SIZE(*Size, %s, %s, %d / __ARRAY_ELEMENT_SIZE(%s, %s) + ((%d %% __ARRAY_ELEMENT_SIZE(%s, %s)) ? 1 : 0)); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][1], Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][2], Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][0]);\r
+                if not Pcd.IsArray:\r
+                    CApp = CApp + '  __FLEXIBLE_SIZE(*Size, %s, %s, %d / __ARRAY_ELEMENT_SIZE(%s, %s) + ((%d %% __ARRAY_ELEMENT_SIZE(%s, %s)) ? 1 : 0)); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][1], Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][2], Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][0]);\r
             else:\r
                 NewFieldName = ''\r
                 FieldName_ori = FieldName.strip('.')\r
@@ -1838,7 +1870,7 @@ class DscBuildData(PlatformBuildClassObject):
             CApp = CApp + "// From Command Line \n"\r
         for FieldName in Pcd.PcdFieldValueFromComm:\r
             FieldName = "." + FieldName\r
-            IsArray = IsFieldValueAnArray(Pcd.PcdFieldValueFromComm[FieldName.strip(".")][0])\r
+            IsArray = _IsFieldValueAnArray(Pcd.PcdFieldValueFromComm[FieldName.strip(".")][0])\r
             if IsArray and not (Pcd.PcdFieldValueFromComm[FieldName.strip(".")][0].startswith('{GUID') and Pcd.PcdFieldValueFromComm[FieldName.strip(".")][0].endswith('}')):\r
                 try:\r
                     Value = ValueExpressionEx(Pcd.PcdFieldValueFromComm[FieldName.strip(".")][0], TAB_VOID, self._GuidDict)(True)\r
@@ -1846,7 +1878,8 @@ class DscBuildData(PlatformBuildClassObject):
                     EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
                                     (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName.strip('.'))), Pcd.PcdFieldValueFromComm[FieldName.strip(".")][1], Pcd.PcdFieldValueFromComm[FieldName.strip(".")][2]))\r
                 Value, ValueSize = ParseFieldValue(Value)\r
-                CApp = CApp + '  __FLEXIBLE_SIZE(*Size, %s, %s, %d / __ARRAY_ELEMENT_SIZE(%s, %s) + ((%d %% __ARRAY_ELEMENT_SIZE(%s, %s)) ? 1 : 0)); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), Pcd.PcdFieldValueFromComm[FieldName.strip(".")][1], Pcd.PcdFieldValueFromComm[FieldName.strip(".")][2], Pcd.PcdFieldValueFromComm[FieldName.strip(".")][0]);\r
+                if not Pcd.IsArray:\r
+                    CApp = CApp + '  __FLEXIBLE_SIZE(*Size, %s, %s, %d / __ARRAY_ELEMENT_SIZE(%s, %s) + ((%d %% __ARRAY_ELEMENT_SIZE(%s, %s)) ? 1 : 0)); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), Pcd.PcdFieldValueFromComm[FieldName.strip(".")][1], Pcd.PcdFieldValueFromComm[FieldName.strip(".")][2], Pcd.PcdFieldValueFromComm[FieldName.strip(".")][0]);\r
             else:\r
                 NewFieldName = ''\r
                 FieldName_ori = FieldName.strip('.')\r
@@ -1855,7 +1888,7 @@ class DscBuildData(PlatformBuildClassObject):
                     ArrayIndex = int(FieldName.split('[', 1)[1].split(']', 1)[0])\r
                     FieldName = FieldName.split(']', 1)[1]\r
                 FieldName = NewFieldName + FieldName\r
-                while '[' in FieldName:\r
+                while '[' in FieldName and not Pcd.IsArray:\r
                     FieldName = FieldName.rsplit('[', 1)[0]\r
                     CApp = CApp + '  __FLEXIBLE_SIZE(*Size, %s, %s, %d); // From %s Line %d Value %s \n' % (Pcd.DatumType, FieldName.strip("."), ArrayIndex + 1, Pcd.PcdFieldValueFromComm[FieldName_ori][1], Pcd.PcdFieldValueFromComm[FieldName_ori][2], Pcd.PcdFieldValueFromComm[FieldName_ori][0])\r
         if Pcd.GetPcdMaxSize():\r
@@ -1886,10 +1919,11 @@ class DscBuildData(PlatformBuildClassObject):
                 PcdDefValue = Pcd.DefaultValue\r
             if lastoneisEmpty:\r
                 if "{CODE(" not in PcdDefValue:\r
-                    sizebasevalue_plus = "(%s / sizeof(%s) + 1)" % ((DscBuildData.GetStructurePcdMaxSize(Pcd), "".join(r_datatype)))\r
-                    sizebasevalue = "(%s / sizeof(%s))" % ((DscBuildData.GetStructurePcdMaxSize(Pcd), "".join(r_datatype)))\r
+                    sizebasevalue_plus = "(%s / sizeof(%s) + 1)" % ((DscBuildData.GetStructurePcdMaxSize(Pcd), Pcd.BaseDatumType))\r
+                    sizebasevalue = "(%s / sizeof(%s))" % ((DscBuildData.GetStructurePcdMaxSize(Pcd), Pcd.BaseDatumType))\r
                     sizeof = "sizeof(%s)" % Pcd.BaseDatumType\r
-                    CApp = '  Size = %s %% %s ? %s : %s ;\n' % ( (DscBuildData.GetStructurePcdMaxSize(Pcd), sizeof, sizebasevalue_plus, sizebasevalue))\r
+                    CApp = '  int ArraySize = %s %% %s ? %s : %s ;\n' % ( (DscBuildData.GetStructurePcdMaxSize(Pcd), sizeof, sizebasevalue_plus, sizebasevalue))\r
+                    CApp += '  Size = ArraySize * sizeof(%s); \n' % Pcd.BaseDatumType\r
                 else:\r
                     CApp = "  Size = 0;\n"\r
             else:\r
@@ -1907,7 +1941,7 @@ class DscBuildData(PlatformBuildClassObject):
         if index:\r
             indicator = "(Pcd"\r
             if len(pcd_capacity)>2:\r
-                for i in xrange(0,len(index_elements)):\r
+                for i in range(0,len(index_elements)):\r
                     index_ele = index_elements[i]\r
                     index_num = index_ele.strip("[").strip("]").strip()\r
                     if i == len(index_elements) -2:\r
@@ -1940,7 +1974,7 @@ class DscBuildData(PlatformBuildClassObject):
         CApp = CApp + '  UINT32  FieldSize;\n'\r
         CApp = CApp + '  CHAR8   *Value;\n'\r
         DefaultValueFromDec = Pcd.DefaultValueFromDec\r
-        IsArray = IsFieldValueAnArray(Pcd.DefaultValueFromDec)\r
+        IsArray = _IsFieldValueAnArray(Pcd.DefaultValueFromDec)\r
         if IsArray:\r
             try:\r
                 DefaultValueFromDec = ValueExpressionEx(Pcd.DefaultValueFromDec, TAB_VOID)(True)\r
@@ -1949,9 +1983,7 @@ class DscBuildData(PlatformBuildClassObject):
                                 (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, DefaultValueFromDec))\r
         DefaultValueFromDec = StringToArray(DefaultValueFromDec)\r
         Value, ValueSize = ParseFieldValue (DefaultValueFromDec)\r
-        if isinstance(Value, str):\r
-            CApp = CApp + '  Pcd = %s; // From DEC Default Value %s\n' % (Value, Pcd.DefaultValueFromDec)\r
-        elif IsArray:\r
+        if IsArray:\r
         #\r
         # Use memcpy() to copy value into field\r
         #\r
@@ -1960,12 +1992,14 @@ class DscBuildData(PlatformBuildClassObject):
             else:\r
                 CApp = CApp + '  Value     = %s; // From DEC Default Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), Pcd.DefaultValueFromDec)\r
                 CApp = CApp + '  memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
+        elif isinstance(Value, str):\r
+            CApp = CApp + '  Pcd = %s; // From DEC Default Value %s\n' % (Value, Pcd.DefaultValueFromDec)\r
         for index in Pcd.DefaultValues:\r
             FieldList = Pcd.DefaultValues[index]\r
             if not FieldList:\r
                 continue\r
             for FieldName in FieldList:\r
-                IsArray = IsFieldValueAnArray(FieldList[FieldName][0])\r
+                IsArray = _IsFieldValueAnArray(FieldList[FieldName][0])\r
                 if IsArray:\r
                     try:\r
                         FieldList[FieldName][0] = ValueExpressionEx(FieldList[FieldName][0], TAB_VOID, self._GuidDict)(True)\r
@@ -1979,9 +2013,7 @@ class DscBuildData(PlatformBuildClassObject):
                     EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " % (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName)), FieldList[FieldName][1], FieldList[FieldName][2]))\r
 \r
                 indicator = self.GetIndicator(index, FieldName,Pcd)\r
-                if isinstance(Value, str):\r
-                    CApp = CApp + '  %s = %s; // From %s Line %d Value %s\n' % (indicator, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
-                elif IsArray:\r
+                if IsArray:\r
                     #\r
                     # Use memcpy() to copy value into field\r
                     #\r
@@ -1990,7 +2022,8 @@ class DscBuildData(PlatformBuildClassObject):
                     CApp = CApp + '  __STATIC_ASSERT((__FIELD_SIZE(%s, %s) >= %d) || (__FIELD_SIZE(%s, %s) == 0), "Input buffer exceeds the buffer array"); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName, ValueSize, Pcd.DatumType, FieldName, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
                     CApp = CApp + '  memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize)\r
                     CApp = CApp + '  memcpy (&%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (indicator, ValueSize, ValueSize)\r
-\r
+                elif isinstance(Value, str):\r
+                    CApp = CApp + '  %s = %s; // From %s Line %d Value %s\n' % (indicator, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
                 else:\r
                     if '[' in FieldName and ']' in FieldName:\r
                         Index = int(FieldName.split('[')[1].split(']')[0])\r
@@ -2029,7 +2062,7 @@ class DscBuildData(PlatformBuildClassObject):
         pcddefaultvalue = self.GetPcdDscRawDefaultValue(Pcd, SkuName, DefaultStoreName)\r
         if pcddefaultvalue:\r
             FieldList = pcddefaultvalue\r
-            IsArray = IsFieldValueAnArray(FieldList)\r
+            IsArray = _IsFieldValueAnArray(FieldList)\r
             if IsArray:\r
                 if "{CODE(" not in FieldList:\r
                     try:\r
@@ -2080,7 +2113,7 @@ class DscBuildData(PlatformBuildClassObject):
             if (SkuName, DefaultStoreName) == (TAB_DEFAULT, TAB_DEFAULT_STORES_DEFAULT) or (( (SkuName, '') not in Pcd.ValueChain) and ( (SkuName, DefaultStoreName) not in Pcd.ValueChain )):\r
                 for FieldName in FieldList:\r
                     indicator = self.GetIndicator(index, FieldName,Pcd)\r
-                    IsArray = IsFieldValueAnArray(FieldList[FieldName][0])\r
+                    IsArray = _IsFieldValueAnArray(FieldList[FieldName][0])\r
                     if IsArray:\r
                         try:\r
                             FieldList[FieldName][0] = ValueExpressionEx(FieldList[FieldName][0], TAB_VOID, self._GuidDict)(True)\r
@@ -2129,7 +2162,7 @@ class DscBuildData(PlatformBuildClassObject):
             if not FieldList:\r
                 continue\r
             if pcddefaultvalue and FieldList == pcddefaultvalue:\r
-                IsArray = IsFieldValueAnArray(FieldList)\r
+                IsArray = _IsFieldValueAnArray(FieldList)\r
                 if IsArray:\r
                     try:\r
                         FieldList = ValueExpressionEx(FieldList, TAB_VOID)(True)\r
@@ -2148,7 +2181,7 @@ class DscBuildData(PlatformBuildClassObject):
                     CApp = CApp + '  memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
                 continue\r
             for FieldName in FieldList:\r
-                IsArray = IsFieldValueAnArray(FieldList[FieldName][0])\r
+                IsArray = _IsFieldValueAnArray(FieldList[FieldName][0])\r
                 if IsArray:\r
                     try:\r
                         FieldList[FieldName][0] = ValueExpressionEx(FieldList[FieldName][0], TAB_VOID, self._GuidDict)(True)\r
@@ -2197,7 +2230,7 @@ class DscBuildData(PlatformBuildClassObject):
             if not FieldList:\r
                 continue\r
             if pcddefaultvalue and FieldList == pcddefaultvalue:\r
-                IsArray = IsFieldValueAnArray(FieldList)\r
+                IsArray = _IsFieldValueAnArray(FieldList)\r
                 if IsArray:\r
                     try:\r
                         FieldList = ValueExpressionEx(FieldList, TAB_VOID)(True)\r
@@ -2216,7 +2249,7 @@ class DscBuildData(PlatformBuildClassObject):
                     CApp = CApp + '  memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
                 continue\r
             for FieldName in FieldList:\r
-                IsArray = IsFieldValueAnArray(FieldList[FieldName][0])\r
+                IsArray = _IsFieldValueAnArray(FieldList[FieldName][0])\r
                 if IsArray:\r
                     try:\r
                         FieldList[FieldName][0] = ValueExpressionEx(FieldList[FieldName][0], TAB_VOID, self._GuidDict)(True)\r
@@ -2538,7 +2571,7 @@ class DscBuildData(PlatformBuildClassObject):
         if BuildOptions:\r
             ArchBuildOptions = {arch:flags for arch,flags in BuildOptions.items() if arch != 'COMMON'}\r
             if len(ArchBuildOptions.keys()) == 1:\r
-                BuildOptions['COMMON'] |= (ArchBuildOptions.values()[0])\r
+                BuildOptions['COMMON'] |= (list(ArchBuildOptions.values())[0])\r
             elif len(ArchBuildOptions.keys()) > 1:\r
                 CommonBuildOptions = reduce(lambda x,y: x&y, ArchBuildOptions.values())\r
                 BuildOptions['COMMON'] |= CommonBuildOptions\r
@@ -2756,7 +2789,7 @@ class DscBuildData(PlatformBuildClassObject):
             elif TAB_DEFAULT in pcd.SkuInfoList and TAB_COMMON in pcd.SkuInfoList:\r
                 del pcd.SkuInfoList[TAB_COMMON]\r
 \r
-        map(self.FilterSkuSettings, Pcds.values())\r
+        list(map(self.FilterSkuSettings, Pcds.values()))\r
 \r
         return Pcds\r
 \r
@@ -2821,7 +2854,7 @@ class DscBuildData(PlatformBuildClassObject):
                     PcdObj.SkuInfoList[skuname].SkuId = skuid\r
                     PcdObj.SkuInfoList[skuname].SkuIdName = skuname\r
             if PcdType in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
-                PcdObj.DefaultValue = PcdObj.SkuInfoList.values()[0].HiiDefaultValue if self.SkuIdMgr.SkuUsageType == self.SkuIdMgr.SINGLE else PcdObj.SkuInfoList[TAB_DEFAULT].HiiDefaultValue\r
+                PcdObj.DefaultValue = list(PcdObj.SkuInfoList.values())[0].HiiDefaultValue if self.SkuIdMgr.SkuUsageType == self.SkuIdMgr.SINGLE else PcdObj.SkuInfoList[TAB_DEFAULT].HiiDefaultValue\r
             Pcds[PcdCName, TokenSpaceGuid]= PcdObj\r
         return Pcds\r
     ## Retrieve dynamic HII PCD settings\r
@@ -2942,7 +2975,6 @@ class DscBuildData(PlatformBuildClassObject):
                 Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName] = {}\r
             Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName][DefaultStore] = DefaultValue\r
         for pcd in Pcds.values():\r
-            SkuInfoObj = pcd.SkuInfoList.values()[0]\r
             pcdDecObject = self._DecPcds[pcd.TokenCName, pcd.TokenSpaceGuidCName]\r
             pcd.DatumType = pcdDecObject.DatumType\r
             # Only fix the value while no value provided in DSC file.\r
@@ -2953,6 +2985,7 @@ class DscBuildData(PlatformBuildClassObject):
                         sku.DefaultStoreDict[default_store]=pcdDecObject.DefaultValue\r
                     pcd.DefaultValue = pcdDecObject.DefaultValue\r
             if TAB_DEFAULT not in pcd.SkuInfoList and TAB_COMMON not in pcd.SkuInfoList:\r
+                SkuInfoObj = list(pcd.SkuInfoList.values())[0]\r
                 valuefromDec = pcdDecObject.DefaultValue\r
                 SkuInfo = SkuInfoClass(TAB_DEFAULT, '0', SkuInfoObj.VariableName, SkuInfoObj.VariableGuid, SkuInfoObj.VariableOffset, valuefromDec, VariableAttribute=SkuInfoObj.VariableAttribute, DefaultStore={DefaultStore:valuefromDec})\r
                 pcd.SkuInfoList[TAB_DEFAULT] = SkuInfo\r
@@ -2982,7 +3015,7 @@ class DscBuildData(PlatformBuildClassObject):
             invalidpcd = ",".join(invalidhii)\r
             EdkLogger.error('build', PCD_VARIABLE_INFO_ERROR, Message='The same HII PCD must map to the same EFI variable for all SKUs', File=self.MetaFile, ExtraData=invalidpcd)\r
 \r
-        map(self.FilterSkuSettings, Pcds.values())\r
+        list(map(self.FilterSkuSettings, Pcds.values()))\r
 \r
         return Pcds\r
 \r
@@ -3080,7 +3113,6 @@ class DscBuildData(PlatformBuildClassObject):
                 Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName] = {}\r
             Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName][TAB_DEFAULT_STORES_DEFAULT] = InitialValue\r
         for pcd in Pcds.values():\r
-            SkuInfoObj = pcd.SkuInfoList.values()[0]\r
             pcdDecObject = self._DecPcds[pcd.TokenCName, pcd.TokenSpaceGuidCName]\r
             pcd.DatumType = pcdDecObject.DatumType\r
             # Only fix the value while no value provided in DSC file.\r
@@ -3088,6 +3120,7 @@ class DscBuildData(PlatformBuildClassObject):
                 if not sku.DefaultValue:\r
                     sku.DefaultValue = pcdDecObject.DefaultValue\r
             if TAB_DEFAULT not in pcd.SkuInfoList and TAB_COMMON not in pcd.SkuInfoList:\r
+                SkuInfoObj = list(pcd.SkuInfoList.values())[0]\r
                 valuefromDec = pcdDecObject.DefaultValue\r
                 SkuInfo = SkuInfoClass(TAB_DEFAULT, '0', '', '', '', '', SkuInfoObj.VpdOffset, valuefromDec)\r
                 pcd.SkuInfoList[TAB_DEFAULT] = SkuInfo\r
@@ -3107,7 +3140,7 @@ class DscBuildData(PlatformBuildClassObject):
                 for sku in pcd.SkuInfoList.values():\r
                     sku.DefaultValue = StringToArray(sku.DefaultValue) if sku.DefaultValue.startswith(('L"',"L'")) else sku.DefaultValue\r
 \r
-        map(self.FilterSkuSettings, Pcds.values())\r
+        list(map(self.FilterSkuSettings, Pcds.values()))\r
         return Pcds\r
 \r
     ## Add external modules\r