]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/Workspace/DscBuildData.py
BaseTools: Enable the flag to treat dynamic pcd as dynamicEx
[mirror_edk2.git] / BaseTools / Source / Python / Workspace / DscBuildData.py
index 1d7a6a11b8a2f6a38dcdea4313a153a216abac10..4d5b1ad4d90a1f241d1dc7e255c01e79363a9008 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 - 2019, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2008 - 2020, Intel Corporation. All rights reserved.<BR>\r
 # (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>\r
 # SPDX-License-Identifier: BSD-2-Clause-Patent\r
 #\r
@@ -19,15 +19,15 @@ from Common.Misc import *
 from types import *\r
 from Common.Expression import *\r
 from CommonDataClass.CommonClass import SkuInfoClass\r
-from Common.TargetTxtClassObject import TargetTxtClassObject\r
-from Common.ToolDefClassObject import ToolDefClassObject\r
+from Common.TargetTxtClassObject import TargetTxtDict\r
+from Common.ToolDefClassObject import ToolDefDict\r
 from .MetaDataTable import *\r
 from .MetaFileTable import *\r
 from .MetaFileParser import *\r
 \r
 from .WorkspaceCommon import GetDeclaredPcd\r
 from Common.Misc import AnalyzeDscPcd\r
-from Common.Misc import ProcessDuplicatedInf,RemoveCComments\r
+from Common.Misc import ProcessDuplicatedInf,RemoveCComments,ArrayIndex\r
 import re\r
 from Common.Parsing import IsValidWord\r
 from Common.VariableAttributes import VariableAttributes\r
@@ -37,7 +37,6 @@ from functools import reduce
 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
@@ -56,6 +55,7 @@ def _IsFieldValueAnArray (Value):
     return False\r
 \r
 PcdValueInitName = 'PcdValueInit'\r
+PcdValueCommonName = 'PcdValueCommon'\r
 \r
 PcdMainCHeader = '''\r
 /**\r
@@ -92,9 +92,6 @@ WindowsCFLAGS = 'CFLAGS = $(CFLAGS) /wd4200 /wd4034 /wd4101 '
 LinuxCFLAGS = 'BUILD_CFLAGS += -Wno-pointer-to-int-cast -Wno-unused-variable '\r
 PcdMakefileEnd = '''\r
 !INCLUDE $(BASE_TOOLS_PATH)\Source\C\Makefiles\ms.common\r
-\r
-LIBS = $(LIB_PATH)\Common.lib\r
-\r
 !INCLUDE $(BASE_TOOLS_PATH)\Source\C\Makefiles\ms.app\r
 '''\r
 \r
@@ -182,20 +179,6 @@ def GetDependencyList(FileStack, SearchPathList):
     return DependencyList\r
 \r
 class DscBuildData(PlatformBuildClassObject):\r
-    # dict used to convert PCD type in database to string used by build tool\r
-    _PCD_TYPE_STRING_ = {\r
-        MODEL_PCD_FIXED_AT_BUILD        :   TAB_PCDS_FIXED_AT_BUILD,\r
-        MODEL_PCD_PATCHABLE_IN_MODULE   :   TAB_PCDS_PATCHABLE_IN_MODULE,\r
-        MODEL_PCD_FEATURE_FLAG          :   TAB_PCDS_FEATURE_FLAG,\r
-        MODEL_PCD_DYNAMIC               :   TAB_PCDS_DYNAMIC,\r
-        MODEL_PCD_DYNAMIC_DEFAULT       :   TAB_PCDS_DYNAMIC,\r
-        MODEL_PCD_DYNAMIC_HII           :   TAB_PCDS_DYNAMIC_HII,\r
-        MODEL_PCD_DYNAMIC_VPD           :   TAB_PCDS_DYNAMIC_VPD,\r
-        MODEL_PCD_DYNAMIC_EX            :   TAB_PCDS_DYNAMIC_EX,\r
-        MODEL_PCD_DYNAMIC_EX_DEFAULT    :   TAB_PCDS_DYNAMIC_EX,\r
-        MODEL_PCD_DYNAMIC_EX_HII        :   TAB_PCDS_DYNAMIC_EX_HII,\r
-        MODEL_PCD_DYNAMIC_EX_VPD        :   TAB_PCDS_DYNAMIC_EX_VPD,\r
-    }\r
 \r
     # dict used to convert part of [Defines] to members of DscBuildData directly\r
     _PROPERTY_ = {\r
@@ -245,7 +228,7 @@ class DscBuildData(PlatformBuildClassObject):
         self.WorkspaceDir = os.getenv("WORKSPACE") if os.getenv("WORKSPACE") else ""\r
         self.DefaultStores = None\r
         self.SkuIdMgr = SkuClass(self.SkuName, self.SkuIds)\r
-\r
+        self.UpdatePcdTypeDict()\r
     @property\r
     def OutputPath(self):\r
         if os.getenv("WORKSPACE"):\r
@@ -414,6 +397,9 @@ 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 == TAB_DSC_DEFINES_PCD_DYNAMIC_AS_DYNAMICEX:\r
+                if TAB_DSC_DEFINES_PCD_DYNAMIC_AS_DYNAMICEX not in gCommandLineDefines:\r
+                    gCommandLineDefines[TAB_DSC_DEFINES_PCD_DYNAMIC_AS_DYNAMICEX] = Record[2].strip()\r
             elif Name in self:\r
                 self[Name] = Record[2]\r
         # set _Header to non-None in order to avoid database re-querying\r
@@ -720,6 +706,24 @@ class DscBuildData(PlatformBuildClassObject):
                 self._RawData.DisableOverrideComponent(Components[(file_guid_str,str(ModuleFile))])\r
             Components[(file_guid_str,str(ModuleFile))] = ModuleId\r
         self._RawData._PostProcessed = False\r
+\r
+    ## Retrieve packages this Platform depends on\r
+    @cached_property\r
+    def Packages(self):\r
+        RetVal = set()\r
+        RecordList = self._RawData[MODEL_META_DATA_PACKAGE, self._Arch]\r
+        Macros = self._Macros\r
+        for Record in RecordList:\r
+            File = PathClass(NormPath(Record[0], Macros), GlobalData.gWorkspace, Arch=self._Arch)\r
+            # check the file validation\r
+            ErrorCode, ErrorInfo = File.Validate('.dec')\r
+            if ErrorCode != 0:\r
+                LineNo = Record[-1]\r
+                EdkLogger.error('build', ErrorCode, ExtraData=ErrorInfo, File=self.MetaFile, Line=LineNo)\r
+            # parse this package now. we need it to get protocol/ppi/guid value\r
+            RetVal.add(self._Bdb[File, self._Arch, self._Target, self._Toolchain])\r
+        return RetVal\r
+\r
     ## Retrieve [Components] section information\r
     @property\r
     def Modules(self):\r
@@ -740,9 +744,10 @@ class DscBuildData(PlatformBuildClassObject):
                 EdkLogger.error('build', ErrorCode, File=self.MetaFile, Line=LineNo,\r
                                 ExtraData=ErrorInfo)\r
 \r
+            ModuleBuildData = self._Bdb[ModuleFile, self._Arch, self._Target, self._Toolchain]\r
             Module = ModuleBuildClassObject()\r
             Module.MetaFile = ModuleFile\r
-\r
+            Module.Guid = ModuleBuildData.Guid\r
             # get module private library instance\r
             RecordList = self._RawData[MODEL_EFI_LIBRARY_CLASS, self._Arch, None, ModuleId]\r
             for Record in RecordList:\r
@@ -763,7 +768,7 @@ class DscBuildData(PlatformBuildClassObject):
                 Module.LibraryClasses[LibraryClass] = LibraryPath\r
                 if LibraryPath not in self.LibraryInstances:\r
                     self.LibraryInstances.append(LibraryPath)\r
-\r
+            S_PcdSet = []\r
             # get module private PCD setting\r
             for Type in [MODEL_PCD_FIXED_AT_BUILD, MODEL_PCD_PATCHABLE_IN_MODULE, \\r
                          MODEL_PCD_FEATURE_FLAG, MODEL_PCD_DYNAMIC, MODEL_PCD_DYNAMIC_EX]:\r
@@ -777,20 +782,31 @@ class DscBuildData(PlatformBuildClassObject):
                     else:\r
                         MaxDatumSize = ''\r
                     TypeString = self._PCD_TYPE_STRING_[Type]\r
-                    Pcd = PcdClassObject(\r
-                            PcdCName,\r
-                            TokenSpaceGuid,\r
-                            TypeString,\r
-                            '',\r
-                            DefaultValue,\r
-                            '',\r
-                            MaxDatumSize,\r
-                            {},\r
-                            False,\r
-                            None\r
-                            )\r
-                    Module.Pcds[PcdCName, TokenSpaceGuid] = Pcd\r
 \r
+                    TCName,PCName,DimensionAttr,Field = self.ParsePcdNameStruct(TokenSpaceGuid, PcdCName)\r
+\r
+                    if ("." in TokenSpaceGuid or "[" in PcdCName):\r
+                        S_PcdSet.append([ TCName,PCName,DimensionAttr,Field, ModuleBuildData.Guid, "", Dummy5, AnalyzePcdExpression(Setting)[0]])\r
+                        DefaultValue = ''\r
+                    if ( PCName,TCName) not in Module.Pcds:\r
+                        Pcd = PcdClassObject(\r
+                                PCName,\r
+                                TCName,\r
+                                TypeString,\r
+                                '',\r
+                                DefaultValue,\r
+                                '',\r
+                                MaxDatumSize,\r
+                                {},\r
+                                False,\r
+                                None,\r
+                                IsDsc=True)\r
+                        Module.Pcds[PCName, TCName] = Pcd\r
+\r
+            Module.StrPcdSet = S_PcdSet\r
+            for TCName,PCName, _,_,_,_,_,_ in S_PcdSet:\r
+                if (PCName,TCName) in Module.Pcds:\r
+                    Module.StrPcdOverallValue[(PCName,TCName)] = Module.Pcds[(PCName,TCName)].DefaultValue, self.MetaFile,Dummy5\r
             # get module private build options\r
             RecordList = self._RawData[MODEL_META_DATA_BUILD_OPTION, self._Arch, None, ModuleId]\r
             for ToolChainFamily, ToolChain, Option, Dummy1, Dummy2, Dummy3, Dummy4, Dummy5 in RecordList:\r
@@ -807,7 +823,9 @@ class DscBuildData(PlatformBuildClassObject):
                                     File=self.MetaFile, ExtraData=str(ModuleFile), Line=LineNo)\r
                 ModuleFile = ProcessDuplicatedInf(ModuleFile, RecordList[0][2], GlobalData.gWorkspace)\r
                 ModuleFile.Arch = self._Arch\r
-\r
+                Module.Guid = RecordList[0][2]\r
+                for item in Module.StrPcdSet:\r
+                    item[4] = RecordList[0][2]\r
             self._Modules[ModuleFile] = Module\r
         return self._Modules\r
 \r
@@ -897,7 +915,8 @@ class DscBuildData(PlatformBuildClassObject):
                     continue\r
                 ModuleData = self._Bdb[ModuleFile, self._Arch, self._Target, self._Toolchain]\r
                 PkgSet.update(ModuleData.Packages)\r
-\r
+            if self.Packages:\r
+                PkgSet.update(self.Packages)\r
             self._DecPcds, self._GuidDict = GetDeclaredPcd(self, self._Bdb, self._Arch, self._Target, self._Toolchain, PkgSet)\r
             self._GuidDict.update(GlobalData.gPlatformPcds)\r
 \r
@@ -944,8 +963,12 @@ class DscBuildData(PlatformBuildClassObject):
                                 ExtraData="%s.%s" % (TokenSpaceGuid, PcdCName))\r
             if PcdType in (MODEL_PCD_DYNAMIC_DEFAULT, MODEL_PCD_DYNAMIC_EX_DEFAULT, MODEL_PCD_FIXED_AT_BUILD, MODEL_PCD_PATCHABLE_IN_MODULE):\r
                 if self._DecPcds[PcdCName, TokenSpaceGuid].DatumType.strip() != ValueList[1].strip():\r
-                    EdkLogger.error('build', FORMAT_INVALID, "Pcd datumtype used in DSC file is not the same as its declaration in DEC file.", File=self.MetaFile, Line=LineNo,\r
-                                ExtraData="%s.%s|%s" % (TokenSpaceGuid, PcdCName, Setting))\r
+                    DecPcd = self._DecPcds[PcdCName, TokenSpaceGuid]\r
+                    EdkLogger.error('build', FORMAT_INVALID,\r
+                                    "Pcd datumtype used in DSC file is not the same as its declaration. DatumType:%s"%DecPcd.DatumType,\r
+                                    File=self.MetaFile, Line=LineNo,\r
+                                    ExtraData="Dsc:%s.%s|%s\n    Dec:%s.%s|%s|%s|%s" % (TokenSpaceGuid, PcdCName, Setting, TokenSpaceGuid, \\r
+                                    PcdCName, DecPcd.DefaultValue, DecPcd.DatumType, DecPcd.TokenValue))\r
         if (TokenSpaceGuid + '.' + PcdCName) in GlobalData.gPlatformPcds:\r
             if GlobalData.gPlatformPcds[TokenSpaceGuid + '.' + PcdCName] != ValueList[Index]:\r
                 GlobalData.gPlatformPcds[TokenSpaceGuid + '.' + PcdCName] = ValueList[Index]\r
@@ -1072,13 +1095,10 @@ class DscBuildData(PlatformBuildClassObject):
                 GlobalData.BuildOptionPcd[i] = (TokenSpaceGuidCName, TokenCName, FieldName, pcdvalue, ("build command options", 1))\r
 \r
         if GlobalData.BuildOptionPcd:\r
+            inf_objs = [item for item in self._Bdb._CACHE_.values() if item.Arch == self.Arch and item.MetaFile.Ext.lower() == '.inf']\r
             for pcd in GlobalData.BuildOptionPcd:\r
                 (TokenSpaceGuidCName, TokenCName, FieldName, pcdvalue, _) = pcd\r
-                for BuildData in self._Bdb._CACHE_.values():\r
-                    if BuildData.Arch != self.Arch:\r
-                        continue\r
-                    if BuildData.MetaFile.Ext == '.dec' or BuildData.MetaFile.Ext == '.dsc':\r
-                        continue\r
+                for BuildData in inf_objs:\r
                     for key in BuildData.Pcds:\r
                         PcdItem = BuildData.Pcds[key]\r
                         if (TokenSpaceGuidCName, TokenCName) == (PcdItem.TokenSpaceGuidCName, PcdItem.TokenCName) and FieldName =="":\r
@@ -1221,7 +1241,27 @@ class DscBuildData(PlatformBuildClassObject):
                         if ' ' + Option not in self._BuildOptions[CurKey]:\r
                             self._BuildOptions[CurKey] += ' ' + Option\r
         return self._BuildOptions\r
+    def GetBuildOptionsByPkg(self, Module, ModuleType):\r
 \r
+        local_pkg = os.path.split(Module.LocalPkg())[0]\r
+        if self._ModuleTypeOptions is None:\r
+            self._ModuleTypeOptions = OrderedDict()\r
+        if ModuleType not in self._ModuleTypeOptions:\r
+            options = OrderedDict()\r
+            self._ModuleTypeOptions[ ModuleType] = options\r
+            RecordList = self._RawData[MODEL_META_DATA_BUILD_OPTION, self._Arch]\r
+            for ToolChainFamily, ToolChain, Option, Dummy1, Dummy2, Dummy3, Dummy4, Dummy5 in RecordList:\r
+                if Dummy2 not in (TAB_COMMON,local_pkg.upper(),"EDKII"):\r
+                    continue\r
+                Type = Dummy3\r
+                if Type.upper() == ModuleType.upper():\r
+                    Key = (ToolChainFamily, ToolChain)\r
+                    if Key not in options or not ToolChain.endswith('_FLAGS') or Option.startswith('='):\r
+                        options[Key] = Option\r
+                    else:\r
+                        if ' ' + Option not in options[Key]:\r
+                            options[Key] += ' ' + Option\r
+        return self._ModuleTypeOptions[ModuleType]\r
     def GetBuildOptionsByModuleType(self, Edk, ModuleType):\r
         if self._ModuleTypeOptions is None:\r
             self._ModuleTypeOptions = OrderedDict()\r
@@ -1350,11 +1390,11 @@ class DscBuildData(PlatformBuildClassObject):
                                         self._PCD_TYPE_STRING_[MODEL_PCD_FEATURE_FLAG],\r
                                         self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC],\r
                                         self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX]]:\r
-                        self.Pcds[Name, Guid] = copy.deepcopy(PcdInDec)\r
-                        self.Pcds[Name, Guid].DefaultValue = NoFiledValues[( Guid, Name)][0]\r
+                        self._Pcds[Name, Guid] = copy.deepcopy(PcdInDec)\r
+                        self._Pcds[Name, Guid].DefaultValue = NoFiledValues[( Guid, Name)][0]\r
                     if PcdInDec.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC],\r
                                         self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX]]:\r
-                        self.Pcds[Name, Guid].SkuInfoList = {TAB_DEFAULT:SkuInfoClass(TAB_DEFAULT, self.SkuIds[TAB_DEFAULT][0], '', '', '', '', '', NoFiledValues[( Guid, Name)][0])}\r
+                        self._Pcds[Name, Guid].SkuInfoList = {TAB_DEFAULT:SkuInfoClass(TAB_DEFAULT, self.SkuIds[TAB_DEFAULT][0], '', '', '', '', '', NoFiledValues[( Guid, Name)][0])}\r
         return AllPcds\r
 \r
     def OverrideByFdfOverAll(self,AllPcds):\r
@@ -1396,8 +1436,8 @@ class DscBuildData(PlatformBuildClassObject):
                     if PcdInDec.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD],\r
                                         self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE],\r
                                         self._PCD_TYPE_STRING_[MODEL_PCD_FEATURE_FLAG]]:\r
-                        self.Pcds[Name, Guid] = copy.deepcopy(PcdInDec)\r
-                        self.Pcds[Name, Guid].DefaultValue = Value\r
+                        self._Pcds[Name, Guid] = copy.deepcopy(PcdInDec)\r
+                        self._Pcds[Name, Guid].DefaultValue = Value\r
         return AllPcds\r
 \r
     def ParsePcdNameStruct(self,NamePart1,NamePart2):\r
@@ -1462,7 +1502,15 @@ class DscBuildData(PlatformBuildClassObject):
                                 File=self.MetaFile, Line = Dummy5)\r
 \r
                 S_PcdSet.append([ TCName,PCName,DimensionAttr,Field, SkuName, default_store, Dummy5, AnalyzePcdExpression(Setting)[0]])\r
-\r
+        ModuleScopeOverallValue = {}\r
+        for m in self.Modules.values():\r
+            mguid = m.Guid\r
+            if m.StrPcdSet:\r
+                S_PcdSet.extend(m.StrPcdSet)\r
+                mguid = m.StrPcdSet[0][4]\r
+            for (PCName,TCName) in m.StrPcdOverallValue:\r
+                Value, dsc_file, lineNo = m.StrPcdOverallValue[(PCName,TCName)]\r
+                ModuleScopeOverallValue.setdefault((PCName,TCName),{})[mguid] = Value, dsc_file, lineNo\r
         # handle pcd value override\r
         StrPcdSet = DscBuildData.GetStructurePcdInfo(S_PcdSet)\r
         S_pcd_set = OrderedDict()\r
@@ -1480,6 +1528,11 @@ class DscBuildData(PlatformBuildClassObject):
             for str_pcd_data in StrPcdSet[str_pcd]:\r
                 if str_pcd_data[4] in SkuIds:\r
                     str_pcd_obj_str.AddOverrideValue(str_pcd_data[3], str(str_pcd_data[7]), TAB_DEFAULT if str_pcd_data[4] == TAB_COMMON else str_pcd_data[4], TAB_DEFAULT_STORES_DEFAULT if str_pcd_data[5] == TAB_COMMON else str_pcd_data[5], self.MetaFile.File if self.WorkspaceDir not in self.MetaFile.File else self.MetaFile.File[len(self.WorkspaceDir) if self.WorkspaceDir.endswith(os.path.sep) else len(self.WorkspaceDir)+1:], LineNo=str_pcd_data[6],DimensionAttr = str_pcd_data[2])\r
+                elif GlobalData.gGuidPattern.match(str_pcd_data[4]):\r
+                    str_pcd_obj_str.AddComponentOverrideValue(str_pcd_data[3], str(str_pcd_data[7]), str_pcd_data[4].replace("-","S"), self.MetaFile.File if self.WorkspaceDir not in self.MetaFile.File else self.MetaFile.File[len(self.WorkspaceDir) if self.WorkspaceDir.endswith(os.path.sep) else len(self.WorkspaceDir)+1:], LineNo=str_pcd_data[6],DimensionAttr = str_pcd_data[2])\r
+                    PcdComponentValue = ModuleScopeOverallValue.get((str_pcd_obj_str.TokenCName,str_pcd_obj_str.TokenSpaceGuidCName))\r
+                    for module_guid in PcdComponentValue:\r
+                        str_pcd_obj_str.PcdValueFromComponents[module_guid.replace("-","S")] = PcdComponentValue[module_guid]\r
             S_pcd_set[str_pcd[1], str_pcd[0]] = str_pcd_obj_str\r
 \r
         # Add the Structure PCD that only defined in DEC, don't have override in DSC file\r
@@ -1538,7 +1591,10 @@ class DscBuildData(PlatformBuildClassObject):
                             stru_pcd.ValueChain.add((skuid, defaultstoreid))\r
         S_pcd_set = DscBuildData.OverrideByFdf(S_pcd_set,self.WorkspaceDir)\r
         S_pcd_set = DscBuildData.OverrideByComm(S_pcd_set)\r
+\r
+        # Create a tool to caculate structure pcd value\r
         Str_Pcd_Values = self.GenerateByteArrayValue(S_pcd_set)\r
+\r
         if Str_Pcd_Values:\r
             for (skuname, StoreName, PcdGuid, PcdName, PcdValue) in Str_Pcd_Values:\r
                 str_pcd_obj = S_pcd_set.get((PcdName, PcdGuid))\r
@@ -1556,6 +1612,14 @@ class DscBuildData(PlatformBuildClassObject):
                                         self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:\r
                     if skuname in (self.SkuIdMgr.SystemSkuId, TAB_DEFAULT, TAB_COMMON):\r
                         str_pcd_obj.DefaultValue = PcdValue\r
+                    else:\r
+                        #Module Scope Structure Pcd\r
+                        moduleguid = skuname.replace("S","-")\r
+                        if GlobalData.gGuidPattern.match(moduleguid):\r
+                            for component in self.Modules.values():\r
+                                if component.Guid == moduleguid:\r
+                                    component.Pcds[(PcdName, PcdGuid)].DefaultValue = PcdValue\r
+\r
                 else:\r
                     if skuname not in str_pcd_obj.SkuInfoList:\r
                         nextskuid = self.SkuIdMgr.GetNextSkuId(skuname)\r
@@ -1660,17 +1724,17 @@ class DscBuildData(PlatformBuildClassObject):
                     EdkLogger.error('build', FORMAT_INVALID, "The size value can't be set to negative value for %s." % ".".join((TokenSpaceGuid, PcdCName)),\r
                                     File=self.MetaFile, Line=Dummy4)\r
             if (PcdCName, TokenSpaceGuid) in PcdValueDict:\r
-                PcdValueDict[PcdCName, TokenSpaceGuid][SkuName] = (PcdValue, DatumType, MaxDatumSize)\r
+                PcdValueDict[PcdCName, TokenSpaceGuid][SkuName] = (PcdValue, DatumType, MaxDatumSize,Dummy4)\r
             else:\r
-                PcdValueDict[PcdCName, TokenSpaceGuid] = {SkuName:(PcdValue, DatumType, MaxDatumSize)}\r
+                PcdValueDict[PcdCName, TokenSpaceGuid] = {SkuName:(PcdValue, DatumType, MaxDatumSize,Dummy4)}\r
 \r
         for ((PcdCName, TokenSpaceGuid), PcdSetting) in PcdValueDict.items():\r
             if self.SkuIdMgr.SystemSkuId in PcdSetting:\r
-                PcdValue, DatumType, MaxDatumSize = PcdSetting[self.SkuIdMgr.SystemSkuId]\r
+                PcdValue, DatumType, MaxDatumSize,_ = PcdSetting[self.SkuIdMgr.SystemSkuId]\r
             elif TAB_DEFAULT in PcdSetting:\r
-                PcdValue, DatumType, MaxDatumSize = PcdSetting[TAB_DEFAULT]\r
+                PcdValue, DatumType, MaxDatumSize,_  = PcdSetting[TAB_DEFAULT]\r
             elif TAB_COMMON in PcdSetting:\r
-                PcdValue, DatumType, MaxDatumSize = PcdSetting[TAB_COMMON]\r
+                PcdValue, DatumType, MaxDatumSize,_  = PcdSetting[TAB_COMMON]\r
             else:\r
                 PcdValue = None\r
                 DatumType = None\r
@@ -1692,7 +1756,9 @@ class DscBuildData(PlatformBuildClassObject):
                 Settings = PcdValueDict[PcdCName, TokenSpaceGuid][SkuName]\r
                 if SkuName not in Pcds[PcdCName, TokenSpaceGuid].DscRawValue:\r
                     Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName] = {}\r
+                    Pcds[PcdCName, TokenSpaceGuid].DscRawValueInfo[SkuName] = {}\r
                 Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName][TAB_DEFAULT_STORES_DEFAULT] = Settings[0]\r
+                Pcds[PcdCName, TokenSpaceGuid].DscRawValueInfo[SkuName][TAB_DEFAULT_STORES_DEFAULT] = (self.MetaFile.File,Settings[3])\r
         return Pcds\r
 \r
     @staticmethod\r
@@ -1730,7 +1796,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].decode(encoding='utf-8', errors='ignore'), Result[1].decode(encoding='utf-8', errors='ignore')\r
+        return Process.returncode, Result[0].decode(errors='ignore'), Result[1].decode(errors='ignore')\r
 \r
     @staticmethod\r
     def IntToCString(Value, ValueSize):\r
@@ -1745,24 +1811,41 @@ class DscBuildData(PlatformBuildClassObject):
     def GenerateSizeFunction(self, Pcd):\r
         CApp = "// Default Value in Dec \n"\r
         CApp = CApp + "void Cal_%s_%s_Size(UINT32 *Size){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
-        if Pcd.IsArray():\r
+\r
+        if Pcd.IsArray() and Pcd.Capacity[-1] != "-1":\r
+            CApp += "  *Size = (sizeof (%s) > *Size ? sizeof (%s) : *Size);\n" % (Pcd.DatumType,Pcd.DatumType)\r
+        else:\r
+            if "{CODE(" in Pcd.DefaultValueFromDec:\r
+                CApp += "  *Size = (sizeof (%s_%s_INIT_Value) > *Size ? sizeof (%s_%s_INIT_Value) : *Size);\n" % (Pcd.TokenSpaceGuidCName,Pcd.TokenCName,Pcd.TokenSpaceGuidCName,Pcd.TokenCName)\r
             if Pcd.Type in PCD_DYNAMIC_TYPE_SET | PCD_DYNAMIC_EX_TYPE_SET:\r
                 for skuname in Pcd.SkuInfoList:\r
                     skuobj = Pcd.SkuInfoList[skuname]\r
                     if skuobj.VariableName:\r
                         for defaultstore in skuobj.DefaultStoreDict:\r
                             pcddef = self.GetPcdDscRawDefaultValue(Pcd,skuname,defaultstore)\r
-                            if pcddef and "{CODE(" in pcddef:\r
-                                CApp += "  *Size = (sizeof (%s_%s_%s_%s_Value) > *Size ? sizeof (%s_%s_%s_%s_Value) : *Size);\n" % (Pcd.TokenSpaceGuidCName,Pcd.TokenCName,skuname,defaultstore,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,skuname,defaultstore)\r
+                            if pcddef:\r
+                                if "{CODE(" in pcddef:\r
+                                    CApp += "  *Size = (sizeof (%s_%s_%s_%s_Value) > *Size ? sizeof (%s_%s_%s_%s_Value) : *Size);\n" % (Pcd.TokenSpaceGuidCName,Pcd.TokenCName,skuname,defaultstore,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,skuname,defaultstore)\r
+                                else:\r
+                                    CApp += "  *Size = %s > *Size ? %s : *Size;\n" % (self.GetStructurePcdMaxSize(Pcd),self.GetStructurePcdMaxSize(Pcd))\r
                     else:\r
                         pcddef = self.GetPcdDscRawDefaultValue(Pcd,skuname,TAB_DEFAULT_STORES_DEFAULT)\r
-                        if pcddef and "{CODE(" in pcddef:\r
-                            CApp += "  *Size = (sizeof (%s_%s_%s_%s_Value) > *Size ? sizeof (%s_%s_%s_%s_Value) : *Size);\n" % (Pcd.TokenSpaceGuidCName,Pcd.TokenCName,skuname,TAB_DEFAULT_STORES_DEFAULT,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,skuname,TAB_DEFAULT_STORES_DEFAULT)\r
+                        if pcddef:\r
+                            if  "{CODE(" in pcddef:\r
+                                CApp += "  *Size = (sizeof (%s_%s_%s_%s_Value) > *Size ? sizeof (%s_%s_%s_%s_Value) : *Size);\n" % (Pcd.TokenSpaceGuidCName,Pcd.TokenCName,skuname,TAB_DEFAULT_STORES_DEFAULT,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,skuname,TAB_DEFAULT_STORES_DEFAULT)\r
+                            else:\r
+                                CApp += "  *Size = %s > *Size ? %s : *Size;\n" % (self.GetStructurePcdMaxSize(Pcd),self.GetStructurePcdMaxSize(Pcd))\r
             else:\r
                 pcddef = self.GetPcdDscRawDefaultValue(Pcd,TAB_DEFAULT,TAB_DEFAULT_STORES_DEFAULT)\r
-                if pcddef and "{CODE(" in pcddef:\r
-                    CApp += "  *Size = (sizeof (%s_%s_%s_%s_Value) > *Size ? sizeof (%s_%s_%s_%s_Value) : *Size);\n" % (Pcd.TokenSpaceGuidCName,Pcd.TokenCName,TAB_DEFAULT,TAB_DEFAULT_STORES_DEFAULT,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,TAB_DEFAULT,TAB_DEFAULT_STORES_DEFAULT)\r
+                if pcddef:\r
+                    if "{CODE(" in pcddef:\r
+                        CApp += "  *Size = (sizeof (%s_%s_%s_%s_Value) > *Size ? sizeof (%s_%s_%s_%s_Value) : *Size);\n" % (Pcd.TokenSpaceGuidCName,Pcd.TokenCName,TAB_DEFAULT,TAB_DEFAULT_STORES_DEFAULT,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,TAB_DEFAULT,TAB_DEFAULT_STORES_DEFAULT)\r
+                    else:\r
+                        CApp += "  *Size = %s > *Size ? %s : *Size;\n" % (self.GetStructurePcdMaxSize(Pcd),self.GetStructurePcdMaxSize(Pcd))\r
+        ActualCap = []\r
         for index in Pcd.DefaultValues:\r
+            if index:\r
+                ActualCap.append(index)\r
             FieldList = Pcd.DefaultValues[index]\r
             if not FieldList:\r
                 continue\r
@@ -1783,18 +1866,20 @@ class DscBuildData(PlatformBuildClassObject):
                     FieldName_ori = FieldName.strip('.')\r
                     while '[' in  FieldName:\r
                         NewFieldName = NewFieldName + FieldName.split('[', 1)[0] + '[0]'\r
-                        ArrayIndex = int(FieldName.split('[', 1)[1].split(']', 1)[0])\r
+                        Array_Index = int(FieldName.split('[', 1)[1].split(']', 1)[0])\r
                         FieldName = FieldName.split(']', 1)[1]\r
                     FieldName = NewFieldName + 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
+                        CApp = CApp + '  __FLEXIBLE_SIZE(*Size, %s, %s, %d); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName.strip("."), Array_Index + 1, FieldList[FieldName_ori][1], FieldList[FieldName_ori][2], FieldList[FieldName_ori][0])\r
         for skuname in Pcd.SkuOverrideValues:\r
             if skuname == TAB_COMMON:\r
                 continue\r
             for defaultstorenameitem in Pcd.SkuOverrideValues[skuname]:\r
                 CApp = CApp + "// SkuName: %s,  DefaultStoreName: %s \n" % (skuname, defaultstorenameitem)\r
                 for index in Pcd.SkuOverrideValues[skuname][defaultstorenameitem]:\r
+                    if index:\r
+                        ActualCap.append(index)\r
                     for FieldList in [Pcd.SkuOverrideValues[skuname][defaultstorenameitem][index]]:\r
                         if not FieldList:\r
                             continue\r
@@ -1815,12 +1900,12 @@ class DscBuildData(PlatformBuildClassObject):
                                 FieldName_ori = FieldName.strip('.')\r
                                 while '[' in  FieldName:\r
                                     NewFieldName = NewFieldName + FieldName.split('[', 1)[0] + '[0]'\r
-                                    ArrayIndex = int(FieldName.split('[', 1)[1].split(']', 1)[0])\r
+                                    Array_Index = int(FieldName.split('[', 1)[1].split(']', 1)[0])\r
                                     FieldName = FieldName.split(']', 1)[1]\r
                                 FieldName = NewFieldName + 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
+                                    CApp = CApp + '  __FLEXIBLE_SIZE(*Size, %s, %s, %d); // From %s Line %d Value %s \n' % (Pcd.DatumType, FieldName.strip("."), Array_Index + 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
@@ -1840,12 +1925,12 @@ class DscBuildData(PlatformBuildClassObject):
                 FieldName_ori = FieldName.strip('.')\r
                 while '[' in  FieldName:\r
                     NewFieldName = NewFieldName + FieldName.split('[', 1)[0] + '[0]'\r
-                    ArrayIndex = int(FieldName.split('[', 1)[1].split(']', 1)[0])\r
+                    Array_Index = int(FieldName.split('[', 1)[1].split(']', 1)[0])\r
                     FieldName = FieldName.split(']', 1)[1]\r
                 FieldName = NewFieldName + FieldName\r
                 while '[' in FieldName:\r
                     FieldName = FieldName.rsplit('[', 1)[0]\r
-                    CApp = CApp + '  __FLEXIBLE_SIZE(*Size, %s, %s, %d); // From %s Line %s Value %s \n' % (Pcd.DatumType, FieldName.strip("."), ArrayIndex + 1, Pcd.PcdFieldValueFromFdf[FieldName_ori][1], Pcd.PcdFieldValueFromFdf[FieldName_ori][2], Pcd.PcdFieldValueFromFdf[FieldName_ori][0])\r
+                    CApp = CApp + '  __FLEXIBLE_SIZE(*Size, %s, %s, %d); // From %s Line %s Value %s \n' % (Pcd.DatumType, FieldName.strip("."), Array_Index + 1, Pcd.PcdFieldValueFromFdf[FieldName_ori][1], Pcd.PcdFieldValueFromFdf[FieldName_ori][2], Pcd.PcdFieldValueFromFdf[FieldName_ori][0])\r
         if Pcd.PcdFieldValueFromComm:\r
             CApp = CApp + "// From Command Line \n"\r
         for FieldName in Pcd.PcdFieldValueFromComm:\r
@@ -1865,16 +1950,37 @@ class DscBuildData(PlatformBuildClassObject):
                 FieldName_ori = FieldName.strip('.')\r
                 while '[' in  FieldName:\r
                     NewFieldName = NewFieldName + FieldName.split('[', 1)[0] + '[0]'\r
-                    ArrayIndex = int(FieldName.split('[', 1)[1].split(']', 1)[0])\r
+                    Array_Index = int(FieldName.split('[', 1)[1].split(']', 1)[0])\r
                     FieldName = FieldName.split(']', 1)[1]\r
                 FieldName = NewFieldName + 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
+                    CApp = CApp + '  __FLEXIBLE_SIZE(*Size, %s, %s, %d); // From %s Line %d Value %s \n' % (Pcd.DatumType, FieldName.strip("."), Array_Index + 1, Pcd.PcdFieldValueFromComm[FieldName_ori][1], Pcd.PcdFieldValueFromComm[FieldName_ori][2], Pcd.PcdFieldValueFromComm[FieldName_ori][0])\r
         if Pcd.GetPcdMaxSize():\r
             CApp = CApp + "  *Size = (%d > *Size ? %d : *Size); // The Pcd maxsize is %d \n" % (Pcd.GetPcdMaxSize(), Pcd.GetPcdMaxSize(), Pcd.GetPcdMaxSize())\r
+        ArraySizeByAssign = self.CalculateActualCap(ActualCap)\r
+        if ArraySizeByAssign > 1:\r
+            CApp = CApp + "  *Size = (%d > *Size ? %d : *Size); \n" % (ArraySizeByAssign, ArraySizeByAssign)\r
         CApp = CApp + "}\n"\r
         return CApp\r
+    def CalculateActualCap(self,ActualCap):\r
+        if not ActualCap:\r
+            return 1\r
+        maxsize = 1\r
+        for item in ActualCap:\r
+            index_elements = ArrayIndex.findall(item)\r
+            rt = 1\r
+            for index_e in index_elements:\r
+                index_num = index_e.lstrip("[").rstrip("]").strip()\r
+                if not index_num:\r
+                    # Not support flexiable pcd array assignment\r
+                    return 1\r
+                index_num = int(index_num,16) if index_num.startswith(("0x","0X")) else int(index_num)\r
+                rt = rt * (index_num+1)\r
+            if rt  >maxsize:\r
+                maxsize = rt\r
+\r
+        return maxsize\r
 \r
     @staticmethod\r
     def GenerateSizeStatments(Pcd,skuname,defaultstorename):\r
@@ -1953,6 +2059,7 @@ class DscBuildData(PlatformBuildClassObject):
         CApp = CApp + "void Assign_%s_%s_Default_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.BaseDatumType)\r
         CApp = CApp + '  UINT32  FieldSize;\n'\r
         CApp = CApp + '  CHAR8   *Value;\n'\r
+        CApp = CApp + ' UINT32 PcdArraySize;\n'\r
         DefaultValueFromDec = Pcd.DefaultValueFromDec\r
         IsArray = _IsFieldValueAnArray(Pcd.DefaultValueFromDec)\r
         if IsArray:\r
@@ -1964,14 +2071,29 @@ class DscBuildData(PlatformBuildClassObject):
         DefaultValueFromDec = StringToArray(DefaultValueFromDec)\r
         Value, ValueSize = ParseFieldValue (DefaultValueFromDec)\r
         if IsArray:\r
-        #\r
-        # Use memcpy() to copy value into field\r
-        #\r
-            if "{CODE(" in Pcd.DefaultValueFromDec:\r
-                CApp = CApp + '  memcpy (Pcd, %s_%s_INIT_Value, sizeof(%s_%s_INIT_Value));\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
+            #\r
+            # Use memcpy() to copy value into field\r
+            #\r
+            if Pcd.IsArray():\r
+                pcdarraysize = Pcd.PcdArraySize()\r
+                if "{CODE(" in Pcd.DefaultValueFromDec:\r
+                    if Pcd.Capacity[-1] != "-1":\r
+                        CApp = CApp + '__STATIC_ASSERT(sizeof(%s_%s_INIT_Value) < %d * sizeof(%s), "Pcd %s.%s Value in Dec exceed the array capability %s"); // From  %s Line %s \n ' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,pcdarraysize,Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName, Pcd.TokenCName,Pcd.DatumType,Pcd.DefaultValueFromDecInfo[0],Pcd.DefaultValueFromDecInfo[1])\r
+                    CApp = CApp + ' PcdArraySize = sizeof(%s_%s_INIT_Value);\n ' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
+                    CApp = CApp + '  memcpy (Pcd, %s_%s_INIT_Value,PcdArraySize);\n ' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
+                else:\r
+                    if Pcd.Capacity[-1] != "-1":\r
+                        CApp = CApp + '__STATIC_ASSERT(%d < %d * sizeof(%s), "Pcd %s.%s Value in Dec exceed the array capability %s"); // From %s Line %s \n' % (ValueSize,pcdarraysize,Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName, Pcd.TokenCName,Pcd.DatumType,Pcd.DefaultValueFromDecInfo[0],Pcd.DefaultValueFromDecInfo[1])\r
+                    CApp = CApp + ' PcdArraySize = %d;\n' % ValueSize\r
+                    CApp = CApp + '  Value     = %s; // From DEC Default Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), Pcd.DefaultValueFromDec)\r
+                    CApp = CApp + '  memcpy (Pcd, Value, PcdArraySize);\n'\r
             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
+                if "{CODE(" in Pcd.DefaultValueFromDec:\r
+                    CApp = CApp + '  PcdArraySize = sizeof(%s_%s_INIT_Value);\n ' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
+                    CApp = CApp + '  memcpy (Pcd, &%s_%s_INIT_Value,PcdArraySize);\n ' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
+                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
@@ -2029,14 +2151,29 @@ class DscBuildData(PlatformBuildClassObject):
             pcddefaultvalue = Pcd.DscRawValue.get(SkuName, {}).get(TAB_DEFAULT_STORES_DEFAULT)\r
 \r
         return pcddefaultvalue\r
+    def GetPcdDscRawValueInfo(self,Pcd, SkuName,DefaultStoreName):\r
+        DscValueInfo = Pcd.DscRawValueInfo.get(SkuName, {}).get(DefaultStoreName)\r
+        if DscValueInfo:\r
+            dscfilepath,lineno = DscValueInfo\r
+        else:\r
+            dscfilepath = self.MetaFile.File\r
+            lineno = ""\r
+        return dscfilepath,lineno\r
+\r
     def GenerateInitValueFunction(self, Pcd, SkuName, DefaultStoreName):\r
         CApp = "// Value in Dsc for Sku: %s, DefaultStore %s\n" % (SkuName, DefaultStoreName)\r
         CApp = CApp + "void Assign_%s_%s_%s_%s_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, SkuName, DefaultStoreName, Pcd.BaseDatumType)\r
         CApp = CApp + '  UINT32  FieldSize;\n'\r
         CApp = CApp + '  CHAR8   *Value;\n'\r
+        CApp = CApp + ' UINT32 PcdArraySize;\n'\r
 \r
         CApp = CApp + "// SkuName: %s,  DefaultStoreName: %s \n" % (TAB_DEFAULT, TAB_DEFAULT_STORES_DEFAULT)\r
         inherit_OverrideValues = Pcd.SkuOverrideValues[SkuName]\r
+        dscfilepath,lineno = self.GetPcdDscRawValueInfo(Pcd, SkuName, DefaultStoreName)\r
+        if lineno:\r
+            valuefrom = "%s Line %s" % (dscfilepath,str(lineno))\r
+        else:\r
+            valuefrom = dscfilepath\r
 \r
         pcddefaultvalue = self.GetPcdDscRawDefaultValue(Pcd, SkuName, DefaultStoreName)\r
         if pcddefaultvalue:\r
@@ -2054,33 +2191,71 @@ class DscBuildData(PlatformBuildClassObject):
             if (SkuName, DefaultStoreName) == (TAB_DEFAULT, TAB_DEFAULT_STORES_DEFAULT):\r
                 if isinstance(Value, str):\r
                     if "{CODE(" in Value:\r
-                        CApp = CApp + '  memcpy (Pcd, %s_%s_%s_%s_Value, sizeof(%s_%s_%s_%s_Value));\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName,Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName)\r
+                        if Pcd.IsArray() and Pcd.Capacity[-1] != "-1":\r
+                            pcdarraysize = Pcd.PcdArraySize()\r
+                            CApp = CApp + '__STATIC_ASSERT(sizeof(%s_%s_%s_%s_Value) < %d * sizeof(%s), "Pcd %s.%s Value in Dsc exceed the array capability %s"); // From %s \n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName,pcdarraysize,Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName, Pcd.TokenCName,Pcd.DatumType, valuefrom)\r
+                        CApp = CApp+ ' PcdArraySize = sizeof(%s_%s_%s_%s_Value);\n ' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName)\r
+                        CApp = CApp + '  memcpy (Pcd, &%s_%s_%s_%s_Value,PcdArraySize);\n ' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName)\r
                     else:\r
                         CApp = CApp + '  Pcd = %s; // From DSC Default Value %s\n' % (Value, Pcd.DefaultFromDSC.get(TAB_DEFAULT, {}).get(TAB_DEFAULT_STORES_DEFAULT, Pcd.DefaultValue) if Pcd.DefaultFromDSC else Pcd.DefaultValue)\r
                 elif IsArray:\r
-                #\r
-                # Use memcpy() to copy value into field\r
-                #\r
-                    if Pcd.IsArray() and "{CODE(" in pcddefaultvalue:\r
-                        CApp = CApp + '  memcpy (Pcd, %s_%s_%s_%s_Value, sizeof(%s_%s_%s_%s_Value));\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName,Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName)\r
+                    #\r
+                    # Use memcpy() to copy value into field\r
+                    #\r
+                    if Pcd.IsArray():\r
+                        pcdarraysize = Pcd.PcdArraySize()\r
+                        if "{CODE(" in pcddefaultvalue:\r
+                            if Pcd.Capacity[-1] != "-1":\r
+                                CApp = CApp + '__STATIC_ASSERT(sizeof(%s_%s_%s_%s_Value) < %d * sizeof(%s), "Pcd %s.%s Value in Dsc exceed the array capability %s"); // From  %s \n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName,pcdarraysize,Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName, Pcd.TokenCName,Pcd.DatumType,valuefrom)\r
+                            CApp = CApp + ' PcdArraySize = sizeof(%s_%s_%s_%s_Value);\n ' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName)\r
+                            CApp = CApp + '  memcpy (Pcd, %s_%s_%s_%s_Value, PcdArraySize);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName)\r
+                        else:\r
+                            if Pcd.Capacity[-1] != "-1":\r
+                                CApp = CApp + '__STATIC_ASSERT(%d < %d * sizeof(%s), "Pcd %s.%s Value in Dsc exceed the array capability %s"); // From  %s \n' % (ValueSize,pcdarraysize,Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName, Pcd.TokenCName,Pcd.DatumType,valuefrom)\r
+                            CApp = CApp + ' PcdArraySize = %d;\n' % ValueSize\r
+                            CApp = CApp + '  Value     = %s; // From DSC Default Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), Pcd.DefaultFromDSC.get(TAB_DEFAULT, {}).get(TAB_DEFAULT_STORES_DEFAULT, Pcd.DefaultValue) if Pcd.DefaultFromDSC else Pcd.DefaultValue)\r
+                            CApp = CApp + '  memcpy (Pcd, Value, PcdArraySize);\n'\r
                     else:\r
-                        CApp = CApp + '  Value     = %s; // From DSC Default Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), Pcd.DefaultFromDSC.get(TAB_DEFAULT, {}).get(TAB_DEFAULT_STORES_DEFAULT, Pcd.DefaultValue) if Pcd.DefaultFromDSC else Pcd.DefaultValue)\r
-                        CApp = CApp + '  memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
+                        if "{CODE(" in pcddefaultvalue:\r
+                            CApp = CApp + '  PcdArraySize = %d < sizeof(%s) * %d ? %d: sizeof(%s) * %d;\n ' % (ValueSize,Pcd.BaseDatumType,pcdarraysize,ValueSize,Pcd.BaseDatumType,pcdarraysize)\r
+                            CApp = CApp + '  memcpy (Pcd, &%s_%s_%s_%s_Value, PcdArraySize);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName)\r
+                        else:\r
+                            CApp = CApp + '  Value     = %s; // From DSC Default Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), Pcd.DefaultFromDSC.get(TAB_DEFAULT, {}).get(TAB_DEFAULT_STORES_DEFAULT, Pcd.DefaultValue) if Pcd.DefaultFromDSC else Pcd.DefaultValue)\r
+                            CApp = CApp + '  memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
             else:\r
                 if isinstance(Value, str):\r
                     if "{CODE(" in Value:\r
-                        CApp = CApp + '  memcpy (Pcd, %s_%s_%s_%s_Value, sizeof(%s_%s_%s_%s_Value));\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName,Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName)\r
+                        if Pcd.IsArray() and Pcd.Capacity[-1] != "-1":\r
+                            pcdarraysize = Pcd.PcdArraySize()\r
+                            CApp = CApp + '__STATIC_ASSERT(sizeof(%s_%s_%s_%s_Value) < %d * sizeof(%s), "Pcd %s.%s Value in Dsc exceed the array capability %s"); // From %s \n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName,pcdarraysize,Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName, Pcd.TokenCName,Pcd.DatumType,valuefrom)\r
+                        CApp = CApp + ' PcdArraySize = sizeof(%s_%s_%s_%s_Value);\n '% (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName)\r
+                        CApp = CApp + '  memcpy (Pcd, &%s_%s_%s_%s_Value, PcdArraySize);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName)\r
                     else:\r
                         CApp = CApp + '  Pcd = %s; // From DSC Default Value %s\n' % (Value, Pcd.DscRawValue.get(SkuName, {}).get(DefaultStoreName))\r
                 elif IsArray:\r
-                #\r
-                # Use memcpy() to copy value into field\r
-                #\r
-                    if Pcd.IsArray() and "{CODE(" in pcddefaultvalue:\r
-                        CApp = CApp + '  memcpy (Pcd, %s_%s_%s_%s_Value, sizeof(%s_%s_%s_%s_Value));\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName,Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName)\r
+                    #\r
+                    # Use memcpy() to copy value into field\r
+                    #\r
+                    if Pcd.IsArray():\r
+                        pcdarraysize = Pcd.PcdArraySize()\r
+                        if "{CODE(" in pcddefaultvalue:\r
+                            if Pcd.Capacity[-1] != "-1":\r
+                                CApp = CApp + '__STATIC_ASSERT(sizeof(%s_%s_%s_%s_Value) < %d * sizeof(%s), "Pcd %s.%s Value in Dsc exceed the array capability %s"); // From  %s \n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName,pcdarraysize,Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName, Pcd.TokenCName,Pcd.DatumType,valuefrom)\r
+                            CApp + ' PcdArraySize = sizeof(%s_%s_%s_%s_Value);\n ' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName)\r
+                            CApp = CApp + '  memcpy (Pcd, %s_%s_%s_%s_Value, PcdArraySize);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName)\r
+                        else:\r
+                            if Pcd.Capacity[-1] != "-1":\r
+                                CApp = CApp + '__STATIC_ASSERT(%d < %d * sizeof(%s), "Pcd %s.%s Value in Dsc exceed the array capability %s"); // From  %s \n' % (ValueSize,pcdarraysize,Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName, Pcd.TokenCName,Pcd.DatumType,valuefrom)\r
+                            CApp = CApp + ' PcdArraySize = %d;\n' % ValueSize\r
+                            CApp = CApp + '  Value     = %s; // From DSC Default Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), Pcd.DscRawValue.get(TAB_DEFAULT, {}).get(TAB_DEFAULT_STORES_DEFAULT, Pcd.DefaultValue) if Pcd.DefaultFromDSC else Pcd.DefaultValue)\r
+                            CApp = CApp + '  memcpy (Pcd, Value, PcdArraySize);\n'\r
                     else:\r
-                        CApp = CApp + '  Value     = %s; // From DSC Default Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), Pcd.DscRawValue.get(SkuName, {}).get(DefaultStoreName))\r
-                        CApp = CApp + '  memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
+                        if "{CODE(" in pcddefaultvalue:\r
+                            CApp = CApp + '  PcdArraySize = %d < sizeof(%s) * %d ? %d: sizeof(%s) * %d;\n ' % (ValueSize,Pcd.BaseDatumType,pcdarraysize,ValueSize,Pcd.BaseDatumType,pcdarraysize)\r
+                            CApp = CApp + '  memcpy (Pcd, &%s_%s_%s_%s_Value, PcdArraySize);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName)\r
+                        else:\r
+                            CApp = CApp + '  Value     = %s; // From DSC Default Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), Pcd.DscRawValue.get(SkuName, {}).get(DefaultStoreName))\r
+                            CApp = CApp + '  memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
 \r
         inheritvalue = inherit_OverrideValues.get(DefaultStoreName)\r
         if not inheritvalue:\r
@@ -2193,6 +2368,75 @@ class DscBuildData(PlatformBuildClassObject):
         CApp = CApp + "}\n"\r
         return CApp\r
 \r
+    def GenerateModuleScopeValue(self, Pcd):\r
+        CApp = "// Value in Dsc Module scope \n"\r
+        for ModuleGuid in Pcd.PcdFiledValueFromDscComponent:\r
+\r
+            CApp = CApp + "void Assign_%s_%s_%s_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, ModuleGuid,Pcd.BaseDatumType)\r
+            CApp = CApp + '  UINT32  FieldSize;\n'\r
+            CApp = CApp + '  CHAR8   *Value;\n'\r
+            pcddefaultvalue, file_path,lineNo = Pcd.PcdValueFromComponents.get(ModuleGuid,(None,None,None))\r
+\r
+            if pcddefaultvalue:\r
+                IsArray = _IsFieldValueAnArray(pcddefaultvalue)\r
+                if IsArray:\r
+                    try:\r
+                        FieldList = ValueExpressionEx(pcddefaultvalue, TAB_VOID)(True)\r
+                    except BadExpression:\r
+                        EdkLogger.error("Build", FORMAT_INVALID, "Invalid value format for %s.%s, from %s Line %s: %s" %\r
+                                        (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, file_path, lineNo, FieldList))\r
+                Value, ValueSize = ParseFieldValue (FieldList)\r
+\r
+                if isinstance(Value, str):\r
+                    CApp = CApp + '  Pcd = %s; // From %s Line %s \n' % (Value, file_path, lineNo)\r
+                elif IsArray:\r
+                #\r
+                # Use memcpy() to copy value into field\r
+                #\r
+                    CApp = CApp + '  Value     = %s; // From %s Line %s.\n' % (DscBuildData.IntToCString(Value, ValueSize), file_path, lineNo)\r
+                    CApp = CApp + '  memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
+\r
+\r
+            PcdFiledValue = Pcd.PcdFiledValueFromDscComponent.get(ModuleGuid)\r
+            for index in PcdFiledValue:\r
+                FieldList = PcdFiledValue[index]\r
+                if not FieldList:\r
+                    continue\r
+                for FieldName in FieldList:\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
+                        except BadExpression:\r
+                            EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
+                                            (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName)), FieldList[FieldName][1], FieldList[FieldName][2]))\r
+                        except:\r
+                            print("error")\r
+                    try:\r
+                        Value, ValueSize = ParseFieldValue (FieldList[FieldName][0])\r
+                    except Exception:\r
+                        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
+                    if isinstance(Value, str):\r
+                        CApp = CApp + '  Pcd->%s = %s; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
+                    elif IsArray:\r
+                    #\r
+                    # Use memcpy() to copy value into field\r
+                    #\r
+                        CApp = CApp + '  FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.BaseDatumType, FieldName)\r
+                        CApp = CApp + '  Value     = %s; // From %s Line %d Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
+                        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.BaseDatumType, FieldName, ValueSize, Pcd.BaseDatumType, 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
+                    else:\r
+                        if '[' in FieldName and ']' in FieldName:\r
+                            Index = int(FieldName.split('[')[1].split(']')[0])\r
+                            CApp = CApp + '  __STATIC_ASSERT((%d < __ARRAY_SIZE(Pcd->%s)) || (__ARRAY_SIZE(Pcd->%s) == 0), "array index exceeds the array number"); // From %s Line %d Index of %s\n' % (Index, FieldName.split('[')[0], FieldName.split('[')[0], FieldList[FieldName][1], FieldList[FieldName][2], FieldName)\r
+                        if ValueSize > 4:\r
+                            CApp = CApp + '  Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
+                        else:\r
+                            CApp = CApp + '  Pcd->%s = %d; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
+            CApp = CApp + "}\n"\r
+        return CApp\r
+\r
     @staticmethod\r
     def GenerateCommandLineValueStatement(Pcd):\r
         CApp = '  Assign_%s_%s_CommandLine_Value(Pcd);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
@@ -2266,6 +2510,85 @@ class DscBuildData(PlatformBuildClassObject):
         CApp = '  Assign_%s_%s_Fdf_Value(Pcd);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
         return CApp\r
 \r
+    @staticmethod\r
+    def GenerateModuleValueStatement(module_guid, Pcd):\r
+        CApp = "  Assign_%s_%s_%s_Value(Pcd);\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, module_guid)\r
+        return CApp\r
+    def GenerateModuleScopeInitializeFunc(self,SkuName, Pcd,  InitByteValue, CApp):\r
+        for module_guid in Pcd.PcdFiledValueFromDscComponent:\r
+            CApp = CApp + 'void\n'\r
+            CApp = CApp + 'Initialize_%s_%s_%s_%s(\n' % (module_guid, TAB_DEFAULT_STORES_DEFAULT, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
+            CApp = CApp + '  void\n'\r
+            CApp = CApp + '  )\n'\r
+            CApp = CApp + '{\n'\r
+            CApp = CApp + '  UINT32  Size;\n'\r
+            CApp = CApp + '  UINT32  FieldSize;\n'\r
+            CApp = CApp + '  CHAR8   *Value;\n'\r
+            CApp = CApp + '  UINT32  OriginalSize;\n'\r
+            CApp = CApp + '  VOID    *OriginalPcd;\n'\r
+\r
+            CApp = CApp + '  %s      *Pcd;  // From %s Line %d \n' % (Pcd.BaseDatumType,Pcd.PkgPath, Pcd.PcdDefineLineNo)\r
+\r
+            CApp = CApp + '\n'\r
+\r
+            PcdDefaultValue = StringToArray(Pcd.DefaultValueFromDec.strip())\r
+            InitByteValue += '%s.%s.%s.%s|%s|%s\n' % (module_guid, TAB_DEFAULT_STORES_DEFAULT, Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.DatumType, PcdDefaultValue)\r
+            #\r
+            # Get current PCD value and size\r
+            #\r
+            CApp = CApp + '  OriginalPcd = PcdGetPtr (%s, %s, %s, %s, &OriginalSize);\n' % (module_guid, TAB_DEFAULT_STORES_DEFAULT, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
+\r
+            #\r
+            # Determine the size of the PCD.  For simple structures, sizeof(TYPE) provides\r
+            # the correct value.  For structures with a flexible array member, the flexible\r
+            # array member is detected, and the size is based on the highest index used with\r
+            # the flexible array member.  The flexible array member must be the last field\r
+            # in a structure.  The size formula for this case is:\r
+            # OFFSET_OF(FlexbleArrayField) + sizeof(FlexibleArray[0]) * (HighestIndex + 1)\r
+            #\r
+            CApp = CApp + DscBuildData.GenerateSizeStatments(Pcd,SkuName,TAB_DEFAULT_STORES_DEFAULT)\r
+            if Pcd.IsArray() and Pcd.Capacity[-1] != "-1":\r
+                CApp = CApp + '  OriginalSize = OriginalSize < sizeof(%s) * %d? OriginalSize:sizeof(%s) * %d; \n' % (Pcd.BaseDatumType,Pcd.PcdArraySize(),Pcd.BaseDatumType,Pcd.PcdArraySize())\r
+                CApp = CApp + '  Size = sizeof(%s) * %d; \n' % (Pcd.BaseDatumType,Pcd.PcdArraySize())\r
+\r
+            #\r
+            # Allocate and zero buffer for the PCD\r
+            # Must handle cases where current value is smaller, larger, or same size\r
+            # Always keep that larger one as the current size\r
+            #\r
+            CApp = CApp + '  Size = (OriginalSize > Size ? OriginalSize : Size);\n'\r
+            CApp = CApp + '  Pcd     = (%s *)malloc (Size);\n' % (Pcd.BaseDatumType,)\r
+            CApp = CApp + '  memset (Pcd, 0, Size);\n'\r
+\r
+            #\r
+            # Copy current PCD value into allocated buffer.\r
+            #\r
+            CApp = CApp + '  memcpy (Pcd, OriginalPcd, OriginalSize);\n'\r
+\r
+            #\r
+            # Assign field values in PCD\r
+            #\r
+            CApp = CApp + DscBuildData.GenerateDefaultValueAssignStatement(Pcd)\r
+\r
+            CApp = CApp + "// SkuName: %s,  DefaultStoreName: STANDARD \n" % self.SkuIdMgr.SystemSkuId\r
+            CApp = CApp + DscBuildData.GenerateInitValueStatement(Pcd, self.SkuIdMgr.SystemSkuId, TAB_DEFAULT_STORES_DEFAULT)\r
+            CApp = CApp + DscBuildData.GenerateModuleValueStatement(module_guid,Pcd)\r
+            CApp = CApp + DscBuildData.GenerateFdfValueStatement(Pcd)\r
+            CApp = CApp + DscBuildData.GenerateCommandLineValueStatement(Pcd)\r
+\r
+            #\r
+            # Set new PCD value and size\r
+            #\r
+            CApp = CApp + '  PcdSetPtr (%s, %s, %s, %s, Size, (void *)Pcd);\n' % (module_guid, TAB_DEFAULT_STORES_DEFAULT, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
+\r
+            #\r
+            # Free PCD\r
+            #\r
+            CApp = CApp + '  free (Pcd);\n'\r
+            CApp = CApp + '}\n'\r
+            CApp = CApp + '\n'\r
+        return InitByteValue,CApp\r
+\r
     def GenerateInitializeFunc(self, SkuName, DefaultStore, Pcd, InitByteValue, CApp):\r
         OverrideValues = {DefaultStore:{}}\r
         if Pcd.SkuOverrideValues:\r
@@ -2306,6 +2629,9 @@ class DscBuildData(PlatformBuildClassObject):
             # OFFSET_OF(FlexbleArrayField) + sizeof(FlexibleArray[0]) * (HighestIndex + 1)\r
             #\r
             CApp = CApp + DscBuildData.GenerateSizeStatments(Pcd,SkuName,DefaultStoreName)\r
+            if Pcd.IsArray() and Pcd.Capacity[-1] != "-1":\r
+                CApp = CApp + '  OriginalSize = OriginalSize < sizeof(%s) * %d? OriginalSize:sizeof(%s) * %d; \n' % (Pcd.BaseDatumType,Pcd.PcdArraySize(),Pcd.BaseDatumType,Pcd.PcdArraySize())\r
+                CApp = CApp + '  Size = sizeof(%s) * %d; \n' % (Pcd.BaseDatumType,Pcd.PcdArraySize())\r
 \r
             #\r
             # Allocate and zero buffer for the PCD\r
@@ -2356,8 +2682,6 @@ class DscBuildData(PlatformBuildClassObject):
         CApp = ""\r
         if not Pcd:\r
             return CApp\r
-        if not Pcd.IsArray():\r
-            return CApp\r
         Demesion = ""\r
         for d in Pcd.Capacity:\r
             Demesion += "[]"\r
@@ -2435,12 +2759,22 @@ class DscBuildData(PlatformBuildClassObject):
         CApp = CApp + '\n'\r
         for Pcd in StructuredPcds.values():\r
             CApp = CApp + self.GenerateArrayAssignment(Pcd)\r
-        for PcdName in StructuredPcds:\r
+        for PcdName in sorted(StructuredPcds.keys()):\r
             Pcd = StructuredPcds[PcdName]\r
+\r
+            #create void void Cal_tocken_cname_Size functions\r
             CApp = CApp + self.GenerateSizeFunction(Pcd)\r
+\r
+            #create void Assign_ functions\r
+\r
+            # From DEC\r
             CApp = CApp + self.GenerateDefaultValueAssignFunction(Pcd)\r
+            # From Fdf\r
             CApp = CApp + self.GenerateFdfValue(Pcd)\r
+            # From CommandLine\r
             CApp = CApp + self.GenerateCommandLineValue(Pcd)\r
+\r
+            # From Dsc Global setting\r
             if self.SkuOverrideValuesEmpty(Pcd.SkuOverrideValues) or Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD],\r
                         self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:\r
                 CApp = CApp + self.GenerateInitValueFunction(Pcd, self.SkuIdMgr.SystemSkuId, TAB_DEFAULT_STORES_DEFAULT)\r
@@ -2450,9 +2784,15 @@ class DscBuildData(PlatformBuildClassObject):
                         continue\r
                     for DefaultStoreName in Pcd.SkuOverrideValues[SkuName]:\r
                         CApp = CApp + self.GenerateInitValueFunction(Pcd, SkuName, DefaultStoreName)\r
+\r
+            # From Dsc module scope setting\r
+            CApp = CApp + self.GenerateModuleScopeValue(Pcd)\r
+\r
+            #create Initialize_ functions\r
             if self.SkuOverrideValuesEmpty(Pcd.SkuOverrideValues) or Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD],\r
                         self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:\r
                 InitByteValue, CApp = self.GenerateInitializeFunc(self.SkuIdMgr.SystemSkuId, TAB_DEFAULT_STORES_DEFAULT, Pcd, InitByteValue, CApp)\r
+                InitByteValue, CApp =  self.GenerateModuleScopeInitializeFunc(self.SkuIdMgr.SystemSkuId,Pcd,InitByteValue,CApp)\r
             else:\r
                 for SkuName in self.SkuIdMgr.SkuOverrideOrder():\r
                     if SkuName not in Pcd.SkuOverrideValues:\r
@@ -2469,6 +2809,8 @@ class DscBuildData(PlatformBuildClassObject):
         for Pcd in StructuredPcds.values():\r
             if self.SkuOverrideValuesEmpty(Pcd.SkuOverrideValues) or Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD], self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:\r
                 CApp = CApp + '  Initialize_%s_%s_%s_%s();\n' % (self.SkuIdMgr.SystemSkuId, TAB_DEFAULT_STORES_DEFAULT, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
+                for ModuleGuid in Pcd.PcdFiledValueFromDscComponent:\r
+                    CApp += "  Initialize_%s_%s_%s_%s();\n" % (ModuleGuid,TAB_DEFAULT_STORES_DEFAULT ,Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
             else:\r
                 for SkuName in self.SkuIdMgr.SkuOverrideOrder():\r
                     if SkuName not in self.SkuIdMgr.AvailableSkuIdSet:\r
@@ -2484,13 +2826,14 @@ class DscBuildData(PlatformBuildClassObject):
         CAppBaseFileName = os.path.join(self.OutputPath, PcdValueInitName)\r
         SaveFileOnChange(CAppBaseFileName + '.c', CApp, False)\r
 \r
+        # start generating makefile\r
         MakeApp = PcdMakefileHeader\r
         if sys.platform == "win32":\r
-            MakeApp = MakeApp + 'APPFILE = %s\%s.exe\n' % (self.OutputPath, PcdValueInitName) + 'APPNAME = %s\n' % (PcdValueInitName) + 'OBJECTS = %s\%s.obj\n' % (self.OutputPath, PcdValueInitName) + 'INC = '\r
+            MakeApp = MakeApp + 'APPFILE = %s\%s.exe\n' % (self.OutputPath, PcdValueInitName) + 'APPNAME = %s\n' % (PcdValueInitName) + 'OBJECTS = %s\%s.obj %s.obj\n' % (self.OutputPath, PcdValueInitName, os.path.join(self.OutputPath, PcdValueCommonName)) + 'INC = '\r
         else:\r
             MakeApp = MakeApp + PcdGccMakefile\r
-            MakeApp = MakeApp + 'APPFILE = %s/%s\n' % (self.OutputPath, PcdValueInitName) + 'APPNAME = %s\n' % (PcdValueInitName) + 'OBJECTS = %s/%s.o\n' % (self.OutputPath, PcdValueInitName) + \\r
-                      'include $(MAKEROOT)/Makefiles/app.makefile\n' + 'INCLUDE +='\r
+            MakeApp = MakeApp + 'APPFILE = %s/%s\n' % (self.OutputPath, PcdValueInitName) + 'APPNAME = %s\n' % (PcdValueInitName) + 'OBJECTS = %s/%s.o %s.o\n' % (self.OutputPath, PcdValueInitName, os.path.join(self.OutputPath, PcdValueCommonName)) + \\r
+                      'include $(MAKEROOT)/Makefiles/app.makefile\n' + 'TOOL_INCLUDE +='\r
 \r
         IncSearchList = []\r
         PlatformInc = OrderedDict()\r
@@ -2516,6 +2859,22 @@ class DscBuildData(PlatformBuildClassObject):
             for pkg in PcdDependDEC:\r
                 if pkg in PlatformInc:\r
                     for inc in PlatformInc[pkg]:\r
+                        #\r
+                        # Get list of files in potential -I include path\r
+                        #\r
+                        FileList = os.listdir (str(inc))\r
+                        #\r
+                        # Skip -I include path if one of the include files required\r
+                        # by PcdValueInit.c are present in the include paths from\r
+                        # the DEC file.  PcdValueInit.c must use the standard include\r
+                        # files from the host compiler.\r
+                        #\r
+                        if 'stdio.h' in FileList:\r
+                          continue\r
+                        if 'stdlib.h' in FileList:\r
+                          continue\r
+                        if 'string.h' in FileList:\r
+                          continue\r
                         MakeApp += '-I'  + str(inc) + ' '\r
                         IncSearchList.append(inc)\r
         MakeApp = MakeApp + '\n'\r
@@ -2553,7 +2912,8 @@ class DscBuildData(PlatformBuildClassObject):
             elif len(ArchBuildOptions.keys()) > 1:\r
                 CommonBuildOptions = reduce(lambda x,y: x&y, ArchBuildOptions.values())\r
                 BuildOptions['COMMON'] |= CommonBuildOptions\r
-            ValueList = list(BuildOptions['COMMON'])\r
+            ValueList = [item for item in BuildOptions['COMMON'] if item.startswith((r"/U","-U"))]\r
+            ValueList.extend([item for item in BuildOptions['COMMON'] if item.startswith((r"/D", "-D"))])\r
             CC_FLAGS += " ".join(ValueList)\r
         MakeApp += CC_FLAGS\r
 \r
@@ -2571,16 +2931,25 @@ class DscBuildData(PlatformBuildClassObject):
                     IncludeFileFullPaths.append(os.path.normpath(includefullpath))\r
                     break\r
         SearchPathList = []\r
-        SearchPathList.append(os.path.normpath(mws.join(GlobalData.gWorkspace, "BaseTools/Source/C/Include")))\r
-        SearchPathList.append(os.path.normpath(mws.join(GlobalData.gWorkspace, "BaseTools/Source/C/Common")))\r
+        SearchPathList.append(os.path.normpath(mws.join(GlobalData.gGlobalDefines["EDK_TOOLS_PATH"], "BaseTools/Source/C/Include")))\r
+        SearchPathList.append(os.path.normpath(mws.join(GlobalData.gGlobalDefines["EDK_TOOLS_PATH"], "BaseTools/Source/C/Common")))\r
         SearchPathList.extend(str(item) for item in IncSearchList)\r
         IncFileList = GetDependencyList(IncludeFileFullPaths, SearchPathList)\r
         for include_file in IncFileList:\r
             MakeApp += "$(OBJECTS) : %s\n" % include_file\r
+        if sys.platform == "win32":\r
+            PcdValueCommonPath = os.path.normpath(mws.join(GlobalData.gGlobalDefines["EDK_TOOLS_PATH"], "Source\C\Common\PcdValueCommon.c"))\r
+            MakeApp = MakeApp + '%s\PcdValueCommon.c : %s\n' % (self.OutputPath, PcdValueCommonPath)\r
+            MakeApp = MakeApp + '\tcopy /y %s $@\n' % (PcdValueCommonPath)\r
+        else:\r
+            PcdValueCommonPath = os.path.normpath(mws.join(GlobalData.gGlobalDefines["EDK_TOOLS_PATH"], "Source/C/Common/PcdValueCommon.c"))\r
+            MakeApp = MakeApp + '%s/PcdValueCommon.c : %s\n' % (self.OutputPath, PcdValueCommonPath)\r
+            MakeApp = MakeApp + '\tcp -f %s %s/PcdValueCommon.c\n' % (PcdValueCommonPath, self.OutputPath)\r
         MakeFileName = os.path.join(self.OutputPath, 'Makefile')\r
         MakeApp += "$(OBJECTS) : %s\n" % MakeFileName\r
         SaveFileOnChange(MakeFileName, MakeApp, False)\r
 \r
+        # start generating input file\r
         InputValueFile = os.path.join(self.OutputPath, 'Input.txt')\r
         OutputValueFile = os.path.join(self.OutputPath, 'Output.txt')\r
         SaveFileOnChange(InputValueFile, InitByteValue, False)\r
@@ -2590,6 +2959,8 @@ class DscBuildData(PlatformBuildClassObject):
             Dest_PcdValueInitExe = os.path.join(self.OutputPath, PcdValueInitName)\r
         else:\r
             Dest_PcdValueInitExe = os.path.join(self.OutputPath, PcdValueInitName) +".exe"\r
+\r
+        #start building the structure pcd value tool\r
         Messages = ''\r
         if sys.platform == "win32":\r
             MakeCommand = 'nmake -f %s' % (MakeFileName)\r
@@ -2600,6 +2971,7 @@ class DscBuildData(PlatformBuildClassObject):
             returncode, StdOut, StdErr = DscBuildData.ExecuteCommand (MakeCommand)\r
             Messages = StdErr\r
 \r
+        EdkLogger.verbose ('%s\n%s\n%s' % (MakeCommand, StdOut, StdErr))\r
         Messages = Messages.split('\n')\r
         MessageGroup = []\r
         if returncode != 0:\r
@@ -2609,16 +2981,21 @@ class DscBuildData(PlatformBuildClassObject):
             File.close()\r
             for Message in Messages:\r
                 if " error" in Message or "warning" in Message:\r
-                    FileInfo = Message.strip().split('(')\r
-                    if len (FileInfo) > 1:\r
-                        FileName = FileInfo [0]\r
-                        FileLine = FileInfo [1].split (')')[0]\r
-                    else:\r
-                        FileInfo = Message.strip().split(':')\r
-                        if len(FileInfo) < 2:\r
-                            continue\r
-                        FileName = FileInfo [0]\r
-                        FileLine = FileInfo [1]\r
+                    try:\r
+                        FileInfo = Message.strip().split('(')\r
+                        if len (FileInfo) > 1:\r
+                            FileName = FileInfo [0]\r
+                            FileLine = FileInfo [1].split (')')[0]\r
+                        else:\r
+                            FileInfo = Message.strip().split(':')\r
+                            if len(FileInfo) < 2:\r
+                                continue\r
+                            FileName = FileInfo [0]\r
+                            FileLine = FileInfo [1]\r
+                    except:\r
+                        continue\r
+                    if "PcdValueInit.c" not in FileName:\r
+                        continue\r
                     if FileLine.isdigit():\r
                         error_line = FileData[int (FileLine) - 1]\r
                         if r"//" in error_line:\r
@@ -2644,14 +3021,17 @@ class DscBuildData(PlatformBuildClassObject):
             if MessageGroup:\r
                 EdkLogger.error("build", PCD_STRUCTURE_PCD_ERROR, "\n".join(MessageGroup) )\r
             else:\r
-                EdkLogger.error('Build', COMMAND_FAILURE, 'Can not execute command: %s' % MakeCommand)\r
+                EdkLogger.error('Build', COMMAND_FAILURE, 'Can not execute command: %s\n%s\n%s' % (MakeCommand, StdOut, StdErr))\r
 \r
+        #start executing the structure pcd value tool\r
         if DscBuildData.NeedUpdateOutput(OutputValueFile, Dest_PcdValueInitExe, InputValueFile):\r
             Command = Dest_PcdValueInitExe + ' -i %s -o %s' % (InputValueFile, OutputValueFile)\r
             returncode, StdOut, StdErr = DscBuildData.ExecuteCommand (Command)\r
+            EdkLogger.verbose ('%s\n%s\n%s' % (Command, StdOut, StdErr))\r
             if returncode != 0:\r
-                EdkLogger.warn('Build', COMMAND_FAILURE, 'Can not collect output from command: %s' % Command)\r
+                EdkLogger.warn('Build', COMMAND_FAILURE, 'Can not collect output from command: %s\n%s\n' % (Command, StdOut, StdErr))\r
 \r
+        #start update structure pcd final value\r
         File = open (OutputValueFile, 'r')\r
         FileBuffer = File.readlines()\r
         File.close()\r
@@ -2749,7 +3129,9 @@ class DscBuildData(PlatformBuildClassObject):
 \r
             if SkuName not in Pcds[PcdCName, TokenSpaceGuid].DscRawValue:\r
                 Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName] = {}\r
+                Pcds[PcdCName, TokenSpaceGuid].DscRawValueInfo[SkuName] = {}\r
             Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName][TAB_DEFAULT_STORES_DEFAULT] = PcdValue\r
+            Pcds[PcdCName, TokenSpaceGuid].DscRawValueInfo[SkuName][TAB_DEFAULT_STORES_DEFAULT] = (self.MetaFile.File,Dummy4)\r
 \r
         for pcd in Pcds.values():\r
             pcdDecObject = self._DecPcds[pcd.TokenCName, pcd.TokenSpaceGuidCName]\r
@@ -2879,7 +3261,7 @@ class DscBuildData(PlatformBuildClassObject):
 \r
 \r
         # Remove redundant PCD candidates, per the ARCH and SKU\r
-        for PcdCName, TokenSpaceGuid, SkuName, DefaultStore, Dummy4 in PcdList:\r
+        for index,(PcdCName, TokenSpaceGuid, SkuName, DefaultStore, Dummy4) in enumerate(PcdList):\r
 \r
             Setting = PcdDict[self._Arch, SkuName, PcdCName, TokenSpaceGuid, DefaultStore]\r
             if Setting is None:\r
@@ -2948,10 +3330,12 @@ class DscBuildData(PlatformBuildClassObject):
                     PcdClassObj.UserDefinedDefaultStoresFlag = True\r
                 Pcds[PcdCName, TokenSpaceGuid] = PcdClassObj\r
 \r
-                Pcds[PcdCName, TokenSpaceGuid].CustomAttribute['DscPosition'] = int(Dummy4)\r
+                Pcds[PcdCName, TokenSpaceGuid].CustomAttribute['DscPosition'] = index\r
             if SkuName not in Pcds[PcdCName, TokenSpaceGuid].DscRawValue:\r
                 Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName] = {}\r
+                Pcds[PcdCName, TokenSpaceGuid].DscRawValueInfo[SkuName] = {}\r
             Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName][DefaultStore] = DefaultValue\r
+            Pcds[PcdCName, TokenSpaceGuid].DscRawValueInfo[SkuName][DefaultStore] = (self.MetaFile.File,Dummy4)\r
         for pcd in Pcds.values():\r
             pcdDecObject = self._DecPcds[pcd.TokenCName, pcd.TokenSpaceGuidCName]\r
             pcd.DatumType = pcdDecObject.DatumType\r
@@ -3089,7 +3473,9 @@ class DscBuildData(PlatformBuildClassObject):
 \r
             if SkuName not in Pcds[PcdCName, TokenSpaceGuid].DscRawValue:\r
                 Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName] = {}\r
+                Pcds[PcdCName, TokenSpaceGuid].DscRawValueInfo[SkuName] = {}\r
             Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName][TAB_DEFAULT_STORES_DEFAULT] = InitialValue\r
+            Pcds[PcdCName, TokenSpaceGuid].DscRawValueInfo[SkuName][TAB_DEFAULT_STORES_DEFAULT] = (self.MetaFile.File,Dummy4)\r
         for pcd in Pcds.values():\r
             pcdDecObject = self._DecPcds[pcd.TokenCName, pcd.TokenSpaceGuidCName]\r
             pcd.DatumType = pcdDecObject.DatumType\r
@@ -3138,18 +3524,17 @@ class DscBuildData(PlatformBuildClassObject):
     @property\r
     def ToolChainFamily(self):\r
         self._ToolChainFamily = TAB_COMPILER_MSFT\r
+        TargetObj = TargetTxtDict()\r
+        TargetTxt = TargetObj.Target\r
         BuildConfigurationFile = os.path.normpath(os.path.join(GlobalData.gConfDirectory, "target.txt"))\r
         if os.path.isfile(BuildConfigurationFile) == True:\r
-            TargetTxt      = TargetTxtClassObject()\r
-            TargetTxt.LoadTargetTxtFile(BuildConfigurationFile)\r
             ToolDefinitionFile = TargetTxt.TargetTxtDictionary[DataType.TAB_TAT_DEFINES_TOOL_CHAIN_CONF]\r
             if ToolDefinitionFile == '':\r
                 ToolDefinitionFile = "tools_def.txt"\r
                 ToolDefinitionFile = os.path.normpath(mws.join(self.WorkspaceDir, 'Conf', ToolDefinitionFile))\r
             if os.path.isfile(ToolDefinitionFile) == True:\r
-                ToolDef        = ToolDefClassObject()\r
-                ToolDef.LoadToolDefFile(ToolDefinitionFile)\r
-                ToolDefinition = ToolDef.ToolsDefTxtDatabase\r
+                ToolDefObj = ToolDefDict((os.path.join(os.getenv("WORKSPACE"), "Conf")))\r
+                ToolDefinition = ToolDefObj.ToolDef.ToolsDefTxtDatabase\r
                 if TAB_TOD_DEFINES_FAMILY not in ToolDefinition \\r
                    or self._Toolchain not in ToolDefinition[TAB_TOD_DEFINES_FAMILY] \\r
                    or not ToolDefinition[TAB_TOD_DEFINES_FAMILY][self._Toolchain]:\r
@@ -3185,6 +3570,8 @@ class DscBuildData(PlatformBuildClassObject):
                     continue\r
                 ModuleData = self._Bdb[ModuleFile, self._Arch, self._Target, self._Toolchain]\r
                 PkgSet.update(ModuleData.Packages)\r
+            if self.Packages:\r
+                PkgSet.update(self.Packages)\r
             self._DecPcds, self._GuidDict = GetDeclaredPcd(self, self._Bdb, self._Arch, self._Target, self._Toolchain, PkgSet)\r
             self._GuidDict.update(GlobalData.gPlatformPcds)\r
         return self._DecPcds\r