!INCLUDE $(BASE_TOOLS_PATH)\Source\C\Makefiles\ms.app\r
'''\r
\r
+AppTarget = '''\r
+all: $(APPFILE)\r
+$(APPFILE): $(OBJECTS)\r
+%s\r
+'''\r
+\r
PcdGccMakefile = '''\r
MAKEROOT ?= $(EDK_TOOLS_PATH)/Source/C\r
LIBS = -lCommon\r
self._VpdToolGuid = None\r
self._MacroDict = None\r
self.DefaultStores = None\r
+ self.UsedStructurePcd = None\r
\r
## handle Override Path of Module\r
def _HandleOverridePath(self):\r
EdkLogger.error("build", FORMAT_INVALID, Cause, ExtraData="%s.%s" % (TokenSpaceGuidCName, TokenCName))\r
GlobalData.BuildOptionPcd[i] = (TokenSpaceGuidCName, TokenCName, FieldName, pcdvalue, ("build command options", 1))\r
\r
+ if GlobalData.BuildOptionPcd:\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 key in BuildData.Pcds:\r
PcdItem = BuildData.Pcds[key]\r
if (TokenSpaceGuidCName, TokenCName) == (PcdItem.TokenSpaceGuidCName, PcdItem.TokenCName) and FieldName =="":\r
PcdItem.DefaultValue = pcdvalue\r
+ PcdItem.PcdValueFromComm = pcdvalue\r
#In command line, the latter full assign value in commandLine should override the former field assign value.\r
#For example, --pcd Token.pcd.field="" --pcd Token.pcd=H"{}"\r
delete_assign = []\r
if not FieldName:\r
if PcdDatumType not in TAB_PCD_NUMERIC_TYPES:\r
PcdValue = '"' + PcdValue + '"'\r
+ elif not PcdValue.isdigit() and not PcdValue.upper().startswith('0X'):\r
+ PcdValue = '"' + PcdValue + '"'\r
else:\r
IsArray = False\r
Base = 10\r
if len(commpcds[0]) == 5:\r
return True\r
return False\r
-\r
+ NoFiledValues = OrderedDict()\r
if CheckStructureInComm(GlobalData.BuildOptionPcd):\r
- StructurePcdInCom = {(item[0], item[1], item[2] ):(item[3], item[4]) for item in GlobalData.BuildOptionPcd } if GlobalData.BuildOptionPcd else {}\r
- NoFiledValues = {(item[0], item[1]):StructurePcdInCom[item] for item in StructurePcdInCom if not item[2]}\r
+ StructurePcdInCom = OrderedDict()\r
+ for item in GlobalData.BuildOptionPcd:\r
+ StructurePcdInCom[(item[0], item[1], item[2] )] = (item[3], item[4])\r
+ for item in StructurePcdInCom:\r
+ if not item[2]:\r
+ NoFiledValues[(item[0], item[1])] = StructurePcdInCom[item]\r
else:\r
- NoFiledValues = {(item[0], item[1]):[item[2]] for item in GlobalData.BuildOptionPcd}\r
+ for item in GlobalData.BuildOptionPcd:\r
+ NoFiledValues[(item[0], item[1])] = [item[2]]\r
for Guid, Name in NoFiledValues:\r
if (Name, Guid) in AllPcds:\r
Pcd = AllPcds.get((Name, Guid))\r
Pcds = AllPcds\r
DefaultStoreMgr = DefaultStore(self.DefaultStores)\r
SkuIds = self.SkuIds\r
+ self.SkuIdMgr.AvailableSkuIdSet.update({TAB_DEFAULT:0})\r
DefaultStores = {storename for pcdobj in AllPcds.values() for skuobj in pcdobj.SkuInfoList.values() for storename in skuobj.DefaultStoreDict}\r
\r
S_PcdSet = []\r
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
for stru_pcd in S_pcd_set.values():\r
\r
str_pcd_obj.MaxDatumSize = self.GetStructurePcdMaxSize(str_pcd_obj)\r
Pcds[str_pcd_obj.TokenCName, str_pcd_obj.TokenSpaceGuidCName] = str_pcd_obj\r
+ Pcds[str_pcd_obj.TokenCName, str_pcd_obj.TokenSpaceGuidCName].CustomAttribute['IsStru']=True\r
\r
for pcdkey in Pcds:\r
pcd = Pcds[pcdkey]\r
\r
map(self.FilterSkuSettings, [Pcds[pcdkey] for pcdkey in Pcds if Pcds[pcdkey].Type in DynamicPcdType])\r
return Pcds\r
+ #Filter the StrucutrePcd that is not used by any module in dsc file and fdf file.\r
+ def FilterStrcturePcd(self, S_pcd_set):\r
+ if not self.UsedStructurePcd:\r
+ FdfInfList = []\r
+ if GlobalData.gFdfParser:\r
+ 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() + self.LibraryInstances + FdfModuleList)\r
+ for ModuleFile in ModuleSet:\r
+ ModuleData = self._Bdb[ModuleFile, self._Arch, self._Target, self._Toolchain]\r
+ AllModulePcds = AllModulePcds | set(ModuleData.Pcds.keys())\r
+\r
+ self.UsedStructurePcd = AllModulePcds\r
+ UnusedStruPcds = set(S_pcd_set.keys()) - self.UsedStructurePcd\r
+ for (Token, TokenSpaceGuid) in UnusedStruPcds:\r
+ del S_pcd_set[(Token, TokenSpaceGuid)]\r
\r
## Retrieve non-dynamic PCD settings\r
#\r
#\r
CApp = CApp + ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.DatumType, 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.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
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
#\r
CApp = CApp + ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.DatumType, 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.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
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
#\r
CApp = CApp + ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.DatumType, 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.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
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
#\r
CApp = CApp + ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.DatumType, 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.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
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
\r
MakeApp = PcdMakefileHeader\r
if sys.platform == "win32":\r
- MakeApp = MakeApp + '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\n' % (self.OutputPath, PcdValueInitName) + 'INC = '\r
else:\r
MakeApp = MakeApp + PcdGccMakefile\r
- MakeApp = MakeApp + 'APPNAME = %s\n' % (PcdValueInitName) + 'OBJECTS = %s/%s.o\n' % (self.OutputPath, PcdValueInitName) + \\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
\r
IncSearchList = []\r
- PlatformInc = {}\r
+ PlatformInc = OrderedDict()\r
for Cache in self._Bdb._CACHE_.values():\r
if Cache.MetaFile.Ext.lower() != '.dec':\r
continue\r
CC_FLAGS = LinuxCFLAGS\r
if sys.platform == "win32":\r
CC_FLAGS = WindowsCFLAGS\r
- BuildOptions = {}\r
+ BuildOptions = OrderedDict()\r
for Options in self.BuildOptions:\r
if Options[2] != EDKII_NAME:\r
continue\r
\r
if Target == "*" or Target == self._Target:\r
if Tag == "*" or Tag == self._Toolchain:\r
- if Arch == "*" or Arch == self.Arch:\r
+ if Arch == "*":\r
if Tool not in BuildOptions:\r
- BuildOptions[Tool] = {}\r
+ BuildOptions[Tool] = OrderedDict()\r
if Attr != "FLAGS" or Attr not in BuildOptions[Tool] or self.BuildOptions[Options].startswith('='):\r
BuildOptions[Tool][Attr] = self.BuildOptions[Options]\r
else:\r
\r
if sys.platform == "win32":\r
MakeApp = MakeApp + PcdMakefileEnd\r
+ MakeApp = MakeApp + AppTarget % ("""\tcopy $(APPLICATION) $(APPFILE) /y """)\r
+ else:\r
+ MakeApp = MakeApp + AppTarget % ("""\tcp $(APPLICATION) $(APPFILE) """)\r
MakeApp = MakeApp + '\n'\r
IncludeFileFullPaths = []\r
for includefile in IncludeFiles:\r
OutputValueFile = os.path.join(self.OutputPath, 'Output.txt')\r
SaveFileOnChange(InputValueFile, InitByteValue, False)\r
\r
- PcdValueInitExe = PcdValueInitName\r
+ Dest_PcdValueInitExe = PcdValueInitName\r
if not sys.platform == "win32":\r
- PcdValueInitExe = os.path.join(os.getenv("EDK_TOOLS_PATH"), 'Source', 'C', 'bin', PcdValueInitName)\r
+ Dest_PcdValueInitExe = os.path.join(self.OutputPath, PcdValueInitName)\r
else:\r
- PcdValueInitExe = os.path.join(os.getenv("EDK_TOOLS_PATH"), 'Bin', 'Win32', PcdValueInitName) +".exe"\r
-\r
+ Dest_PcdValueInitExe = os.path.join(self.OutputPath, PcdValueInitName) +".exe"\r
Messages = ''\r
if sys.platform == "win32":\r
MakeCommand = 'nmake -f %s' % (MakeFileName)\r
MakeCommand = 'make -f %s' % (MakeFileName)\r
returncode, StdOut, StdErr = DscBuildData.ExecuteCommand (MakeCommand)\r
Messages = StdErr\r
+\r
Messages = Messages.split('\n')\r
MessageGroup = []\r
if returncode != 0:\r
else:\r
EdkLogger.error('Build', COMMAND_FAILURE, 'Can not execute command: %s' % MakeCommand)\r
\r
- if DscBuildData.NeedUpdateOutput(OutputValueFile, PcdValueInitExe, InputValueFile):\r
- Command = PcdValueInitExe + ' -i %s -o %s' % (InputValueFile, OutputValueFile)\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
if returncode != 0:\r
EdkLogger.warn('Build', COMMAND_FAILURE, 'Can not collect output from command: %s' % Command)\r
PcdValue,\r
'',\r
MaxDatumSize,\r
- {SkuName : SkuInfo},\r
+ OrderedDict({SkuName : SkuInfo}),\r
False,\r
None,\r
IsDsc=True)\r
return False\r
\r
def CompletePcdValues(self, PcdSet):\r
- Pcds = {}\r
+ Pcds = OrderedDict()\r
DefaultStoreObj = DefaultStore(self._GetDefaultStores())\r
SkuIds = {skuname:skuid for skuname, skuid in self.SkuIdMgr.AvailableSkuIdSet.items() if skuname != TAB_COMMON}\r
DefaultStores = set(storename for pcdobj in PcdSet.values() for skuobj in pcdobj.SkuInfoList.values() for storename in skuobj.DefaultStoreDict)\r
DefaultValue,\r
'',\r
'',\r
- {SkuName : SkuInfo},\r
+ OrderedDict({SkuName : SkuInfo}),\r
False,\r
None,\r
pcdDecObject.validateranges,\r
PcdClassObj.UserDefinedDefaultStoresFlag = True\r
Pcds[PcdCName, TokenSpaceGuid] = PcdClassObj\r
\r
+ Pcds[PcdCName, TokenSpaceGuid].CustomAttribute['DscPosition'] = int(Dummy4)\r
if SkuName not in Pcds[PcdCName, TokenSpaceGuid].DscRawValue:\r
Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName] = {}\r
Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName][DefaultStore] = DefaultValue\r
InitialValue,\r
'',\r
MaxDatumSize,\r
- {SkuName : SkuInfo},\r
+ OrderedDict({SkuName : SkuInfo}),\r
False,\r
None,\r
IsDsc=True)\r
elif TAB_DEFAULT in pcd.SkuInfoList and TAB_COMMON in pcd.SkuInfoList:\r
del pcd.SkuInfoList[TAB_COMMON]\r
\r
+ #For the same one VOID* pcd, if the default value type of one SKU is "Unicode string",\r
+ #the other SKUs are "OtherVOID*"(ASCII string or byte array),Then convert "Unicode string" to "byte array".\r
+ for pcd in Pcds.values():\r
+ PcdValueTypeSet = set()\r
+ for sku in pcd.SkuInfoList.values():\r
+ PcdValueTypeSet.add("UnicodeString" if sku.DefaultValue.startswith(('L"',"L'")) else "OtherVOID*")\r
+ if len(PcdValueTypeSet) > 1:\r
+ 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
return Pcds\r
ModuleData = self._Bdb[ModuleFile, self._Arch, self._Target, self._Toolchain]\r
PkgSet.update(ModuleData.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