import os\r
import os.path\r
import pickle\r
+import uuid\r
\r
import Common.EdkLogger as EdkLogger\r
import Common.GlobalData as GlobalData\r
RecordList = self._RawData[MODEL_META_DATA_DEFINE, self._Arch]\r
for Record in RecordList:\r
GlobalData.gEdkGlobal[Record[0]] = Record[1]\r
+ \r
+ RecordList = self._RawData[MODEL_META_DATA_GLOBAL_DEFINE, self._Arch]\r
+ for Record in RecordList:\r
+ GlobalData.gGlobalDefines[Record[0]] = Record[1]\r
\r
## XXX[key] = value\r
def __setitem__(self, key, value):\r
self._Pcds = None\r
self._BuildOptions = None\r
self._LoadFixAddress = None\r
+ self._VpdToolGuid = None\r
+ self._VpdFileName = None\r
\r
## Get architecture\r
def _GetArch(self):\r
self._SkuName = Record[1]\r
elif Name == TAB_FIX_LOAD_TOP_MEMORY_ADDRESS:\r
self._LoadFixAddress = Record[1]\r
+ elif Name == TAB_DSC_DEFINES_VPD_TOOL_GUID:\r
+ #\r
+ # try to convert GUID to a real UUID value to see whether the GUID is format \r
+ # for VPD_TOOL_GUID is correct.\r
+ #\r
+ try:\r
+ uuid.UUID(Record[1])\r
+ except:\r
+ EdkLogger.error("build", FORMAT_INVALID, "Invalid GUID format for VPD_TOOL_GUID", File=self.MetaFile)\r
+ self._VpdToolGuid = Record[1] \r
+ elif Name == TAB_DSC_DEFINES_VPD_FILENAME:\r
+ self._VpdFileName = Record[1] \r
# set _Header to non-None in order to avoid database re-querying\r
self._Header = 'DUMMY'\r
\r
def _SetSkuName(self, Value):\r
if Value in self.SkuIds:\r
self._SkuName = Value\r
+ # Needs to re-retrieve the PCD information\r
+ self._Pcds = None\r
\r
def _GetFdfFile(self):\r
if self._FlashDefinition == None:\r
self._LoadFixAddress = ''\r
return self._LoadFixAddress\r
\r
+ ## Retrieve the GUID string for VPD tool\r
+ def _GetVpdToolGuid(self):\r
+ if self._VpdToolGuid == None:\r
+ if self._Header == None:\r
+ self._GetHeaderInfo()\r
+ if self._VpdToolGuid == None:\r
+ self._VpdToolGuid = ''\r
+ return self._VpdToolGuid\r
+ \r
+ ## Retrieve the VPD file Name, this is optional in DSC file\r
+ def _GetVpdFileName(self):\r
+ if self._VpdFileName == None:\r
+ if self._Header == None:\r
+ self._GetHeaderInfo()\r
+ if self._VpdFileName == None:\r
+ self._VpdFileName = ''\r
+ return self._VpdFileName \r
+ \r
## Retrieve [SkuIds] section information\r
def _GetSkuIds(self):\r
if self._SkuIds == None:\r
'',\r
MaxDatumSize,\r
{},\r
+ False,\r
None\r
)\r
Module.Pcds[PcdCName, TokenSpaceGuid] = Pcd\r
'',\r
MaxDatumSize,\r
{},\r
+ False,\r
None\r
)\r
return Pcds\r
'',\r
MaxDatumSize,\r
{self.SkuName : SkuInfo},\r
+ False,\r
None\r
)\r
return Pcds\r
'',\r
'',\r
{self.SkuName : SkuInfo},\r
+ False,\r
None\r
)\r
return Pcds\r
PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid] = Setting\r
# Remove redundant PCD candidates, per the ARCH and SKU\r
for PcdCName, TokenSpaceGuid in PcdSet:\r
- ValueList = ['', '']\r
+ ValueList = ['', '', '']\r
Setting = PcdDict[self._Arch, self.SkuName, PcdCName, TokenSpaceGuid]\r
if Setting == None:\r
continue\r
TokenList = Setting.split(TAB_VALUE_SPLIT)\r
ValueList[0:len(TokenList)] = TokenList\r
- VpdOffset, MaxDatumSize = ValueList\r
-\r
- SkuInfo = SkuInfoClass(self.SkuName, self.SkuIds[self.SkuName], '', '', '', '', VpdOffset)\r
+ #\r
+ # For the VOID* type, it can have optional data of MaxDatumSize and InitialValue\r
+ # For the Integer & Boolean type, the optional data can only be InitialValue.\r
+ # At this point, we put all the data into the PcdClssObject for we don't know the PCD's datumtype\r
+ # until the DEC parser has been called.\r
+ # \r
+ VpdOffset, MaxDatumSize, InitialValue = ValueList\r
+\r
+ SkuInfo = SkuInfoClass(self.SkuName, self.SkuIds[self.SkuName], '', '', '', '', VpdOffset, InitialValue)\r
Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject(\r
PcdCName,\r
TokenSpaceGuid,\r
'',\r
MaxDatumSize,\r
{self.SkuName : SkuInfo},\r
+ False,\r
None\r
)\r
return Pcds\r
#\r
def AddPcd(self, Name, Guid, Value):\r
if (Name, Guid) not in self.Pcds:\r
- self.Pcds[Name, Guid] = PcdClassObject(Name, Guid, '', '', '', '', '', {}, None)\r
+ self.Pcds[Name, Guid] = PcdClassObject(Name, Guid, '', '', '', '', '', {}, False, None)\r
self.Pcds[Name, Guid].DefaultValue = Value\r
\r
Arch = property(_GetArch, _SetArch)\r
BsBaseAddress = property(_GetBsBaseAddress)\r
RtBaseAddress = property(_GetRtBaseAddress)\r
LoadFixAddress = property(_GetLoadFixAddress)\r
-\r
+ VpdToolGuid = property(_GetVpdToolGuid)\r
+ VpdFileName = property(_GetVpdFileName) \r
SkuIds = property(_GetSkuIds)\r
Modules = property(_GetModules)\r
LibraryInstances = property(_GetLibraryInstances)\r
Pcds = property(_GetPcds)\r
BuildOptions = property(_GetBuildOptions)\r
\r
-## Platform build information from DSC file\r
+## Platform build information from DEC file\r
#\r
# This class is used to retrieve information stored in database and convert them\r
# into PackageBuildClassObject form for easier use for AutoGen.\r
TAB_DEC_DEFINES_PACKAGE_NAME : "_PackageName",\r
TAB_DEC_DEFINES_PACKAGE_GUID : "_Guid",\r
TAB_DEC_DEFINES_PACKAGE_VERSION : "_Version",\r
+ TAB_DEC_DEFINES_PKG_UNI_FILE : "_PkgUniFile",\r
}\r
\r
\r
self._PackageName = None\r
self._Guid = None\r
self._Version = None\r
+ self._PkgUniFile = None\r
self._Protocols = None\r
self._Ppis = None\r
self._Guids = None\r
TokenNumber,\r
'',\r
{},\r
+ False,\r
None\r
)\r
return Pcds\r
'',\r
'',\r
{},\r
+ False,\r
self.Guids[TokenSpaceGuid]\r
)\r
\r
# "FixedAtBuild", "PatchableInModule", "FeatureFlag", "Dynamic", "DynamicEx"\r
#\r
PcdType = self._PCD_TYPE_STRING_[Type]\r
- if Type in [MODEL_PCD_DYNAMIC, MODEL_PCD_DYNAMIC_EX]:\r
+ if Type == MODEL_PCD_DYNAMIC:\r
Pcd.Pending = True\r
for T in ["FixedAtBuild", "PatchableInModule", "FeatureFlag", "Dynamic", "DynamicEx"]:\r
if (PcdCName, TokenSpaceGuid, T) in Package.Pcds:\r
\r
## Database\r
#\r
-# This class defined the build databse for all modules, packages and platform.\r
+# This class defined the build database for all modules, packages and platform.\r
# It will call corresponding parser for the given file if it cannot find it in\r
# the database.\r
#\r