# This class is used to retrieve information stored in database and convert them\r
# into PlatformBuildClassObject form for easier use for AutoGen.\r
#\r
+from __future__ import print_function\r
+from __future__ import absolute_import\r
from Common.StringUtils import *\r
from Common.DataType import *\r
from Common.Misc import *\r
!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
\r
if len(FileContent) == 0:\r
continue\r
- IncludedFileList = []\r
+\r
if FileContent[0] == 0xff or FileContent[0] == 0xfe:\r
- FileContent = str(FileContent, "utf-16")\r
- IncludedFileList = gIncludePattern.findall(FileContent)\r
- else:\r
- try:\r
- FileContent = str(FileContent, "utf-8")\r
- IncludedFileList = gIncludePattern.findall(FileContent)\r
- except:\r
- pass\r
+ FileContent = unicode(FileContent, "utf-16")\r
IncludedFileList = gIncludePattern.findall(FileContent)\r
\r
for Inc in IncludedFileList:\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, ErrStr, File=self.MetaFile, Line=LineNo,\r
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() in TAB_PCD_NUMERIC_TYPES_VOID \\r
- and self._DecPcds[PcdCName, TokenSpaceGuid].DatumType.strip() != ValueList[1].strip():\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
if (TokenSpaceGuid + '.' + PcdCName) in GlobalData.gPlatformPcds:\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
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
elif TAB_DEFAULT in pcd.SkuInfoList and TAB_COMMON in pcd.SkuInfoList:\r
del pcd.SkuInfoList[TAB_COMMON]\r
\r
- list(map(self.FilterSkuSettings, [Pcds[pcdkey] for pcdkey in Pcds if Pcds[pcdkey].Type in DynamicPcdType]))\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
else:\r
PcdValueDict[PcdCName, TokenSpaceGuid] = {SkuName:(PcdValue, DatumType, MaxDatumSize)}\r
\r
- for ((PcdCName, TokenSpaceGuid), PcdSetting) in PcdValueDict.items():\r
+ for ((PcdCName, TokenSpaceGuid), PcdSetting) in PcdValueDict.iteritems():\r
if self.SkuIdMgr.SystemSkuId in PcdSetting:\r
PcdValue, DatumType, MaxDatumSize = PcdSetting[self.SkuIdMgr.SystemSkuId]\r
elif TAB_DEFAULT in PcdSetting:\r
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], Result[1]\r
\r
@staticmethod\r
def IntToCString(Value, ValueSize):\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
\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] = OrderedDict()\r
if Attr != "FLAGS" or Attr not in BuildOptions[Tool] or self.BuildOptions[Options].startswith('='):\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
elif TAB_DEFAULT in pcd.SkuInfoList and TAB_COMMON in pcd.SkuInfoList:\r
del pcd.SkuInfoList[TAB_COMMON]\r
\r
- list(map(self.FilterSkuSettings, Pcds.values()))\r
+ map(self.FilterSkuSettings, Pcds.values())\r
\r
return Pcds\r
\r
PcdObj.SkuInfoList[skuname].SkuId = skuid\r
PcdObj.SkuInfoList[skuname].SkuIdName = skuname\r
if PcdType in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
- PcdObj.DefaultValue = list(PcdObj.SkuInfoList.values())[0].HiiDefaultValue if self.SkuIdMgr.SkuUsageType == self.SkuIdMgr.SINGLE else PcdObj.SkuInfoList[TAB_DEFAULT].HiiDefaultValue\r
+ PcdObj.DefaultValue = PcdObj.SkuInfoList.values()[0].HiiDefaultValue if self.SkuIdMgr.SkuUsageType == self.SkuIdMgr.SINGLE else PcdObj.SkuInfoList[TAB_DEFAULT].HiiDefaultValue\r
Pcds[PcdCName, TokenSpaceGuid]= PcdObj\r
return Pcds\r
## Retrieve dynamic HII PCD settings\r
Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName] = {}\r
Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName][DefaultStore] = DefaultValue\r
for pcd in Pcds.values():\r
- SkuInfoObj = list(pcd.SkuInfoList.values())[0]\r
+ SkuInfoObj = pcd.SkuInfoList.values()[0]\r
pcdDecObject = self._DecPcds[pcd.TokenCName, pcd.TokenSpaceGuidCName]\r
pcd.DatumType = pcdDecObject.DatumType\r
# Only fix the value while no value provided in DSC file.\r
invalidpcd = ",".join(invalidhii)\r
EdkLogger.error('build', PCD_VARIABLE_INFO_ERROR, Message='The same HII PCD must map to the same EFI variable for all SKUs', File=self.MetaFile, ExtraData=invalidpcd)\r
\r
- list(map(self.FilterSkuSettings, Pcds.values()))\r
+ map(self.FilterSkuSettings, Pcds.values())\r
\r
return Pcds\r
\r
Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName] = {}\r
Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName][TAB_DEFAULT_STORES_DEFAULT] = InitialValue\r
for pcd in Pcds.values():\r
- SkuInfoObj = list(pcd.SkuInfoList.values())[0]\r
+ SkuInfoObj = pcd.SkuInfoList.values()[0]\r
pcdDecObject = self._DecPcds[pcd.TokenCName, pcd.TokenSpaceGuidCName]\r
pcd.DatumType = pcdDecObject.DatumType\r
# Only fix the value while no value provided in DSC file.\r
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
- list(map(self.FilterSkuSettings, Pcds.values()))\r
+ map(self.FilterSkuSettings, Pcds.values())\r
return Pcds\r
\r
## Add external modules\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