## @file\r
# This file is used to create a database used by build tool\r
#\r
-# Copyright (c) 2008 - 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2008 - 2014, Intel Corporation. All rights reserved.<BR>\r
# This program and the accompanying materials\r
# are licensed and made available under the terms and conditions of the BSD License\r
# which accompanies this distribution. The full text of the license may be found at\r
from BuildClassObject import *\r
from WorkspaceCommon import GetDeclaredPcd\r
from Common.Misc import AnalyzeDscPcd\r
+import re\r
+from Common.Parsing import IsValidWord\r
\r
## Platform build information from DSC file\r
#\r
return False\r
\r
def _GetSkuIdentifier(self):\r
+ if self._SkuName:\r
+ return self._SkuName\r
if self._SkuIdentifier == None:\r
if self._Header == None:\r
self._GetHeaderInfo()\r
if self._SkuName == None:\r
if self._Header == None:\r
self._GetHeaderInfo()\r
- if self._SkuName == None or self._SkuName not in self.SkuIds:\r
+ if (self._SkuName == None or self._SkuName not in self.SkuIds):\r
self._SkuName = 'DEFAULT'\r
return self._SkuName\r
\r
## Override SKUID_IDENTIFIER\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
+ self._SkuName = Value\r
+ self._Pcds = None\r
\r
def _GetFdfFile(self):\r
if self._FlashDefinition == None:\r
if Record[1] in [None, '']:\r
EdkLogger.error('build', FORMAT_INVALID, 'No Sku ID name',\r
File=self.MetaFile, Line=Record[-1])\r
- self._SkuIds[Record[1].upper()] = Record[0]\r
+ self._SkuIds[Record[1]] = Record[0]\r
if 'DEFAULT' not in self._SkuIds:\r
self._SkuIds['DEFAULT'] = '0'\r
if 'COMMON' not in self._SkuIds:\r
RecordList = self._RawData[Type, self._Arch]\r
PcdValueDict = sdict()\r
for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, Dummy3, Dummy4 in RecordList:\r
- SkuName = SkuName.upper()\r
if SkuName in (SkuObj.SystemSkuId,'DEFAULT','COMMON'):\r
PcdSet.add((PcdCName, TokenSpaceGuid, SkuName,Dummy4))\r
PcdDict[Arch, PcdCName, TokenSpaceGuid,SkuName] = Setting\r
\r
AvailableSkuIdSet.update({'DEFAULT':0,'COMMON':0})\r
for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, Dummy3, Dummy4 in RecordList:\r
- SkuName = SkuName.upper()\r
if SkuName not in AvailableSkuIdSet:\r
continue\r
\r
if (PcdCName,TokenSpaceGuid) in Pcds.keys(): \r
pcdObject = Pcds[PcdCName,TokenSpaceGuid]\r
pcdObject.SkuInfoList[SkuName] = SkuInfo\r
+ if MaxDatumSize.strip():\r
+ CurrentMaxSize = int(MaxDatumSize.strip(),0)\r
+ else:\r
+ CurrentMaxSize = 0\r
+ if pcdObject.MaxDatumSize:\r
+ PcdMaxSize = int(pcdObject.MaxDatumSize,0)\r
+ else:\r
+ PcdMaxSize = 0\r
+ if CurrentMaxSize > PcdMaxSize:\r
+ pcdObject.MaxDatumSize = str(CurrentMaxSize)\r
else: \r
Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject(\r
PcdCName,\r
)\r
\r
for pcd in Pcds.values():\r
- if 'DEFAULT' not in pcd.SkuInfoList.keys() and 'COMMON' not in pcd.SkuInfoList.keys():\r
- pcdDecObject = self._DecPcds[pcd.TokenCName,pcd.TokenSpaceGuidCName]\r
+ pcdDecObject = self._DecPcds[pcd.TokenCName,pcd.TokenSpaceGuidCName]\r
+ if 'DEFAULT' not in pcd.SkuInfoList.keys() and 'COMMON' not in pcd.SkuInfoList.keys(): \r
valuefromDec = pcdDecObject.DefaultValue\r
SkuInfo = SkuInfoClass('DEFAULT', '0', '', '', '', '', '', valuefromDec)\r
pcd.SkuInfoList['DEFAULT'] = SkuInfo\r
if 'DEFAULT' in pcd.SkuInfoList.keys() and SkuObj.SystemSkuId not in pcd.SkuInfoList.keys():\r
pcd.SkuInfoList[SkuObj.SystemSkuId] = pcd.SkuInfoList['DEFAULT']\r
del(pcd.SkuInfoList['DEFAULT'])\r
- \r
- if SkuObj.SkuUsageType == SkuObj.MULTIPLE:\r
- if pcd.DatumType == "VOID*": \r
- MaxSize = int(pcd.MaxDatumSize,0)\r
- for (skuname,skuobj) in pcd.SkuInfoList.items():\r
- datalen = len(skuobj.DefaultValue)\r
- if datalen>MaxSize:\r
- MaxSize = datalen\r
- pcd.MaxDatumSize = str(MaxSize)\r
- \r
- \r
+ \r
return Pcds\r
\r
## Retrieve dynamic HII PCD settings\r
\r
AvailableSkuIdSet.update({'DEFAULT':0,'COMMON':0})\r
for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, Dummy3, Dummy4 in RecordList:\r
- SkuName = SkuName.upper()\r
if SkuName not in AvailableSkuIdSet:\r
continue\r
PcdSet.add((PcdCName, TokenSpaceGuid, SkuName,Dummy4))\r
if Setting == None:\r
continue\r
VariableName, VariableGuid, VariableOffset, DefaultValue = self._ValidatePcd(PcdCName, TokenSpaceGuid, Setting, Type, Dummy4)\r
+ \r
+ ExceedMax = False\r
+ FormatCorrect = True\r
+ if VariableOffset.isdigit():\r
+ if int(VariableOffset,10) > 0xFFFF:\r
+ ExceedMax = True\r
+ elif re.match(r'[\t\s]*0[xX][a-fA-F0-9]+$',VariableOffset):\r
+ if int(VariableOffset,16) > 0xFFFF:\r
+ ExceedMax = True\r
+ # For Offset written in "A.B"\r
+ elif VariableOffset.find('.') > -1:\r
+ VariableOffsetList = VariableOffset.split(".")\r
+ if not (len(VariableOffsetList) == 2\r
+ and IsValidWord(VariableOffsetList[0])\r
+ and IsValidWord(VariableOffsetList[1])):\r
+ FormatCorrect = False\r
+ else:\r
+ FormatCorrect = False\r
+ if not FormatCorrect:\r
+ EdkLogger.error('Build', FORMAT_INVALID, "Invalid syntax or format of the variable offset value is incorrect for %s." % ".".join((TokenSpaceGuid,PcdCName)))\r
+ \r
+ if ExceedMax:\r
+ EdkLogger.error('Build', OPTION_VALUE_INVALID, "The variable offset value must not exceed the maximum value of 0xFFFF (UINT16) for %s." % ".".join((TokenSpaceGuid,PcdCName)))\r
+ \r
SkuInfo = SkuInfoClass(SkuName, self.SkuIds[SkuName], VariableName, VariableGuid, VariableOffset, DefaultValue)\r
if (PcdCName,TokenSpaceGuid) in Pcds.keys(): \r
pcdObject = Pcds[PcdCName,TokenSpaceGuid]\r
\r
for pcd in Pcds.values():\r
SkuInfoObj = pcd.SkuInfoList.values()[0]\r
- if 'DEFAULT' not in pcd.SkuInfoList.keys() and 'COMMON' not in pcd.SkuInfoList.keys():\r
- pcdDecObject = self._DecPcds[pcd.TokenCName,pcd.TokenSpaceGuidCName]\r
+ pcdDecObject = self._DecPcds[pcd.TokenCName,pcd.TokenSpaceGuidCName]\r
+ # Only fix the value while no value provided in DSC file.\r
+ for sku in pcd.SkuInfoList.values():\r
+ if (sku.HiiDefaultValue == "" or sku.HiiDefaultValue==None):\r
+ sku.HiiDefaultValue = pcdDecObject.DefaultValue\r
+ if 'DEFAULT' not in pcd.SkuInfoList.keys() and 'COMMON' not in pcd.SkuInfoList.keys(): \r
valuefromDec = pcdDecObject.DefaultValue\r
SkuInfo = SkuInfoClass('DEFAULT', '0', SkuInfoObj.VariableName, SkuInfoObj.VariableGuid, SkuInfoObj.VariableOffset, valuefromDec)\r
pcd.SkuInfoList['DEFAULT'] = SkuInfo\r
if 'DEFAULT' in pcd.SkuInfoList.keys() and SkuObj.SystemSkuId not in pcd.SkuInfoList.keys():\r
pcd.SkuInfoList[SkuObj.SystemSkuId] = pcd.SkuInfoList['DEFAULT']\r
del(pcd.SkuInfoList['DEFAULT'])\r
+ \r
+ \r
+ if pcd.MaxDatumSize.strip(): \r
+ MaxSize = int(pcd.MaxDatumSize,0)\r
+ else:\r
+ MaxSize = 0\r
+ if pcdDecObject.DatumType == 'VOID*':\r
+ for (skuname,skuobj) in pcd.SkuInfoList.items():\r
+ datalen = 0\r
+ if skuobj.HiiDefaultValue.startswith("L"):\r
+ datalen = (len(skuobj.HiiDefaultValue)- 3 + 1) * 2\r
+ elif skuobj.HiiDefaultValue.startswith("{"):\r
+ datalen = len(skuobj.HiiDefaultValue.split(","))\r
+ else:\r
+ datalen = len(skuobj.HiiDefaultValue) -2 + 1 \r
+ if datalen>MaxSize:\r
+ MaxSize = datalen\r
+ pcd.MaxDatumSize = str(MaxSize)\r
return Pcds\r
\r
## Retrieve dynamic VPD PCD settings\r
\r
AvailableSkuIdSet.update({'DEFAULT':0,'COMMON':0})\r
for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, Dummy3, Dummy4 in RecordList:\r
- SkuName = SkuName.upper()\r
if SkuName not in AvailableSkuIdSet:\r
continue\r
\r
if (PcdCName,TokenSpaceGuid) in Pcds.keys(): \r
pcdObject = Pcds[PcdCName,TokenSpaceGuid]\r
pcdObject.SkuInfoList[SkuName] = SkuInfo\r
+ if MaxDatumSize.strip():\r
+ CurrentMaxSize = int(MaxDatumSize.strip(),0)\r
+ else:\r
+ CurrentMaxSize = 0\r
+ if pcdObject.MaxDatumSize:\r
+ PcdMaxSize = int(pcdObject.MaxDatumSize,0)\r
+ else:\r
+ PcdMaxSize = 0\r
+ if CurrentMaxSize > PcdMaxSize:\r
+ pcdObject.MaxDatumSize = str(CurrentMaxSize)\r
else:\r
Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject(\r
PcdCName,\r
)\r
for pcd in Pcds.values():\r
SkuInfoObj = pcd.SkuInfoList.values()[0]\r
+ pcdDecObject = self._DecPcds[pcd.TokenCName,pcd.TokenSpaceGuidCName]\r
if 'DEFAULT' not in pcd.SkuInfoList.keys() and 'COMMON' not in pcd.SkuInfoList.keys():\r
- pcdDecObject = self._DecPcds[pcd.TokenCName,pcd.TokenSpaceGuidCName]\r
valuefromDec = pcdDecObject.DefaultValue\r
SkuInfo = SkuInfoClass('DEFAULT', '0', '', '', '','',SkuInfoObj.VpdOffset, valuefromDec)\r
pcd.SkuInfoList['DEFAULT'] = SkuInfo\r
pcd.SkuInfoList[SkuObj.SystemSkuId] = pcd.SkuInfoList['DEFAULT']\r
del(pcd.SkuInfoList['DEFAULT'])\r
\r
- if SkuObj.SkuUsageType == SkuObj.MULTIPLE:\r
- if pcd.MaxDatumSize.strip(): \r
- MaxSize = int(pcd.MaxDatumSize,0)\r
- for (skuname,skuobj) in pcd.SkuInfoList.items():\r
- datalen = len(skuobj.DefaultValue)\r
- if datalen>MaxSize:\r
- MaxSize = datalen\r
- pcd.MaxDatumSize = str(MaxSize)\r
return Pcds\r
\r
## Add external modules\r
## Set all internal used members of InfBuildData to None\r
def _Clear(self):\r
self._HeaderComments = None\r
+ self._TailComments = None\r
self._Header_ = None\r
self._AutoGenVersion = None\r
self._BaseName = None\r
for Record in RecordList:\r
self._HeaderComments.append(Record[0])\r
return self._HeaderComments\r
-\r
+ def _GetTailComments(self):\r
+ if not self._TailComments:\r
+ self._TailComments = []\r
+ RecordList = self._RawData[MODEL_META_DATA_TAIL_COMMENT]\r
+ for Record in RecordList:\r
+ self._TailComments.append(Record[0])\r
+ return self._TailComments\r
## Retrieve all information in [Defines] section\r
#\r
# (Retriving all [Defines] information in one-shot is just to save time.)\r
Platform = property(_GetPlatform, _SetPlatform)\r
\r
HeaderComments = property(_GetHeaderComments)\r
+ TailComments = property(_GetTailComments)\r
AutoGenVersion = property(_GetInfVersion)\r
BaseName = property(_GetBaseName)\r
ModuleType = property(_GetModuleType)\r