## @file\r
# Generate AutoGen.h, AutoGen.c and *.depex files\r
#\r
-# Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2007 - 2018, 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
self._FvDir = None\r
self._MakeFileDir = None\r
self._BuildCommand = None\r
+ self._GuidDict = {}\r
\r
# there's many relative directory operations, so ...\r
os.chdir(self.WorkspaceDir)\r
\r
EdkLogger.verbose("\nFLASH_DEFINITION = %s" % self.FdfFile)\r
\r
-# if Progress:\r
-# Progress.Start("\nProcessing meta-data")\r
+ if Progress:\r
+ Progress.Start("\nProcessing meta-data")\r
\r
if self.FdfFile:\r
#\r
FoundFlag = False\r
PcdDatumType = ''\r
NewValue = ''\r
+ for package in PGen.PackageList:\r
+ Guids = package.Guids\r
+ self._GuidDict.update(Guids)\r
for package in PGen.PackageList:\r
for key in package.Pcds:\r
PcdItem = package.Pcds[key]\r
if HasTokenSpace:\r
if (PcdItem.TokenCName, PcdItem.TokenSpaceGuidCName) == (TokenCName, TokenSpaceGuidCName):\r
PcdDatumType = PcdItem.DatumType\r
+ if pcdvalue.startswith('H'):\r
+ try:\r
+ pcdvalue = ValueExpressionEx(pcdvalue[1:], PcdDatumType, self._GuidDict)(True)\r
+ except BadExpression, Value:\r
+ if Value.result > 1:\r
+ EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s", %s' %\r
+ (TokenSpaceGuidCName, TokenCName, pcdvalue, Value))\r
+ pcdvalue = 'H' + pcdvalue\r
NewValue = BuildOptionPcdValueFormat(TokenSpaceGuidCName, TokenCName, PcdDatumType, pcdvalue)\r
FoundFlag = True\r
else:\r
TokenSpaceGuidCNameList.append(PcdItem.TokenSpaceGuidCName)\r
PcdDatumType = PcdItem.DatumType\r
TokenSpaceGuidCName = PcdItem.TokenSpaceGuidCName\r
+ if pcdvalue.startswith('H'):\r
+ try:\r
+ pcdvalue = ValueExpressionEx(pcdvalue[1:], PcdDatumType, self._GuidDict)(True)\r
+ except BadExpression, Value:\r
+ EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s", %s' %\r
+ (TokenSpaceGuidCName, TokenCName, pcdvalue, Value))\r
+ pcdvalue = 'H' + pcdvalue\r
NewValue = BuildOptionPcdValueFormat(TokenSpaceGuidCName, TokenCName, PcdDatumType, pcdvalue)\r
FoundFlag = True\r
else:\r
# get the original module/package/platform objects\r
self.BuildDatabase = Workspace.BuildDatabase\r
self.DscBuildDataObj = Workspace.Platform\r
+ self._GuidDict = Workspace._GuidDict\r
\r
# flag indicating if the makefile/C-code file has been created or not\r
self.IsMakeFileCreated = False\r
self._BuildCommand = None\r
self._AsBuildInfList = []\r
self._AsBuildModuleList = []\r
+\r
+ self.VariableInfo = None\r
+\r
if GlobalData.gFdfParser != None:\r
self._AsBuildInfList = GlobalData.gFdfParser.Profile.InfList\r
for Inf in self._AsBuildInfList:\r
# get library/modules for build\r
self.LibraryBuildDirectoryList = []\r
self.ModuleBuildDirectoryList = []\r
+\r
return True\r
\r
def __repr__(self):\r
LibAuto.ConstPcd[key] = Pcd.DefaultValue\r
\r
def CollectVariables(self, DynamicPcdSet):\r
+\r
+ VpdRegionSize = 0\r
+ VpdRegionBase = 0\r
+ if self.Workspace.FdfFile:\r
+ FdDict = self.Workspace.FdfProfile.FdDict[GlobalData.gFdfParser.CurrentFdName]\r
+ for FdRegion in FdDict.RegionList:\r
+ for item in FdRegion.RegionDataList:\r
+ if self.Platform.VpdToolGuid.strip() and self.Platform.VpdToolGuid in item:\r
+ VpdRegionSize = FdRegion.Size\r
+ VpdRegionBase = FdRegion.Offset\r
+ break\r
+\r
+\r
VariableInfo = VariableMgr(self.DscBuildDataObj._GetDefaultStores(),self.DscBuildDataObj._GetSkuIds())\r
+ VariableInfo.SetVpdRegionMaxSize(VpdRegionSize)\r
+ VariableInfo.SetVpdRegionOffset(VpdRegionBase)\r
Index = 0\r
for Pcd in DynamicPcdSet:\r
pcdname = ".".join((Pcd.TokenSpaceGuidCName,Pcd.TokenCName))\r
if len(Sku.VariableName) > 0:\r
VariableGuidStructure = Sku.VariableGuidValue\r
VariableGuid = GuidStructureStringToGuidString(VariableGuidStructure)\r
- if Pcd.Phase == "DXE":\r
- for StorageName in Sku.DefaultStoreDict:\r
- VariableInfo.append_variable(var_info(Index,pcdname,StorageName,SkuName, StringToArray(Sku.VariableName),VariableGuid, Sku.VariableAttribute , Pcd.DefaultValue,Sku.DefaultStoreDict[StorageName],Pcd.DatumType))\r
+ for StorageName in Sku.DefaultStoreDict:\r
+ VariableInfo.append_variable(var_info(Index,pcdname,StorageName,SkuName, StringToArray(Sku.VariableName),VariableGuid, Sku.VariableOffset, Sku.VariableAttribute , Sku.HiiDefaultValue,Sku.DefaultStoreDict[StorageName],Pcd.DatumType))\r
Index += 1\r
return VariableInfo\r
+\r
+ def UpdateNVStoreMaxSize(self,OrgVpdFile):\r
+ if self.VariableInfo:\r
+ VpdMapFilePath = os.path.join(self.BuildDir, "FV", "%s.map" % self.Platform.VpdToolGuid)\r
+ PcdNvStoreDfBuffer = [item for item in self._DynamicPcdList if item.TokenCName == "PcdNvStoreDefaultValueBuffer" and item.TokenSpaceGuidCName == "gEfiMdeModulePkgTokenSpaceGuid"]\r
+\r
+ if PcdNvStoreDfBuffer:\r
+ if os.path.exists(VpdMapFilePath):\r
+ OrgVpdFile.Read(VpdMapFilePath)\r
+ PcdItems = OrgVpdFile.GetOffset(PcdNvStoreDfBuffer[0])\r
+ NvStoreOffset = PcdItems.values()[0].strip() if PcdItems else '0'\r
+ else:\r
+ EdkLogger.error("build", FILE_READ_FAILURE, "Can not find VPD map file %s to fix up VPD offset." % VpdMapFilePath)\r
+\r
+ NvStoreOffset = int(NvStoreOffset,16) if NvStoreOffset.upper().startswith("0X") else int(NvStoreOffset)\r
+ default_skuobj = PcdNvStoreDfBuffer[0].SkuInfoList.get("DEFAULT")\r
+ maxsize = self.VariableInfo.VpdRegionSize - NvStoreOffset if self.VariableInfo.VpdRegionSize else len(default_skuobj.DefaultValue.split(","))\r
+ var_data = self.VariableInfo.PatchNVStoreDefaultMaxSize(maxsize)\r
+\r
+ if var_data and default_skuobj:\r
+ default_skuobj.DefaultValue = var_data\r
+ PcdNvStoreDfBuffer[0].DefaultValue = var_data\r
+ PcdNvStoreDfBuffer[0].SkuInfoList.clear()\r
+ PcdNvStoreDfBuffer[0].SkuInfoList['DEFAULT'] = default_skuobj\r
+ PcdNvStoreDfBuffer[0].MaxDatumSize = str(len(default_skuobj.DefaultValue.split(",")))\r
+\r
+ return OrgVpdFile\r
+\r
## Collect dynamic PCDs\r
#\r
# Gather dynamic PCDs list from each module and their settings from platform\r
#\r
# The reason of sorting is make sure the unicode string is in double-byte alignment in string table.\r
#\r
- UnicodePcdArray = []\r
- HiiPcdArray = []\r
- OtherPcdArray = []\r
+ UnicodePcdArray = set()\r
+ HiiPcdArray = set()\r
+ OtherPcdArray = set()\r
VpdPcdDict = {}\r
VpdFile = VpdInfoFile.VpdInfoFile()\r
NeedProcessVpdMapFile = False\r
if Pcd.DatumType not in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64, TAB_VOID, "BOOLEAN"]:\r
Pcd.DatumType = "VOID*"\r
\r
- PcdValue = Sku.DefaultValue\r
- if Pcd.DatumType == 'VOID*' and PcdValue.startswith("L"):\r
# if found PCD which datum value is unicode string the insert to left size of UnicodeIndex\r
- UnicodePcdArray.append(Pcd)\r
- elif len(Sku.VariableName) > 0:\r
# if found HII type PCD then insert to right of UnicodeIndex\r
- HiiPcdArray.append(Pcd)\r
- else:\r
- OtherPcdArray.append(Pcd)\r
if Pcd.Type in [TAB_PCDS_DYNAMIC_VPD, TAB_PCDS_DYNAMIC_EX_VPD]:\r
VpdPcdDict[(Pcd.TokenCName, Pcd.TokenSpaceGuidCName)] = Pcd\r
\r
#Collect DynamicHii PCD values and assign it to DynamicExVpd PCD gEfiMdeModulePkgTokenSpaceGuid.PcdNvStoreDefaultValueBuffer\r
PcdNvStoreDfBuffer = VpdPcdDict.get(("PcdNvStoreDefaultValueBuffer","gEfiMdeModulePkgTokenSpaceGuid"))\r
if PcdNvStoreDfBuffer:\r
- var_info = self.CollectVariables(self._DynamicPcdList)\r
- default_skuobj = PcdNvStoreDfBuffer.SkuInfoList.get("DEFAULT")\r
- default_skuobj.DefaultValue = var_info.dump()\r
- if default_skuobj:\r
- PcdNvStoreDfBuffer.SkuInfoList.clear()\r
- PcdNvStoreDfBuffer.SkuInfoList['DEFAULT'] = default_skuobj\r
- PcdNvStoreDfBuffer.MaxDatumSize = len(default_skuobj.DefaultValue.split(","))\r
+ self.VariableInfo = self.CollectVariables(self._DynamicPcdList)\r
+ vardump = self.VariableInfo.dump()\r
+ if vardump:\r
+ PcdNvStoreDfBuffer.DefaultValue = vardump\r
+ for skuname in PcdNvStoreDfBuffer.SkuInfoList:\r
+ PcdNvStoreDfBuffer.SkuInfoList[skuname].DefaultValue = vardump\r
+ PcdNvStoreDfBuffer.MaxDatumSize = str(len(vardump.split(",")))\r
\r
PlatformPcds = self._PlatformPcds.keys()\r
PlatformPcds.sort()\r
#\r
# Add VPD type PCD into VpdFile and determine whether the VPD PCD need to be fixed up.\r
#\r
+ VpdSkuMap = {}\r
for PcdKey in PlatformPcds:\r
Pcd = self._PlatformPcds[PcdKey]\r
if Pcd.Type in [TAB_PCDS_DYNAMIC_VPD, TAB_PCDS_DYNAMIC_EX_VPD] and \\r
PcdKey in VpdPcdDict:\r
Pcd = VpdPcdDict[PcdKey]\r
+ SkuValueMap = {}\r
+ DefaultSku = Pcd.SkuInfoList.get('DEFAULT')\r
+ if DefaultSku:\r
+ PcdValue = DefaultSku.DefaultValue\r
+ if PcdValue not in SkuValueMap:\r
+ SkuValueMap[PcdValue] = []\r
+ VpdFile.Add(Pcd, 'DEFAULT',DefaultSku.VpdOffset)\r
+ SkuValueMap[PcdValue].append(DefaultSku)\r
+\r
for (SkuName,Sku) in Pcd.SkuInfoList.items():\r
Sku.VpdOffset = Sku.VpdOffset.strip()\r
PcdValue = Sku.DefaultValue\r
EdkLogger.warn("build", "The offset value of PCD %s.%s is not 8-byte aligned!" %(Pcd.TokenSpaceGuidCName, Pcd.TokenCName), File=self.MetaFile)\r
else:\r
EdkLogger.error("build", FORMAT_INVALID, 'The offset value of PCD %s.%s should be %s-byte aligned.' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Alignment))\r
- VpdFile.Add(Pcd, Sku.VpdOffset)\r
+ if PcdValue not in SkuValueMap:\r
+ SkuValueMap[PcdValue] = []\r
+ VpdFile.Add(Pcd, SkuName,Sku.VpdOffset)\r
+ SkuValueMap[PcdValue].append(Sku)\r
# if the offset of a VPD is *, then it need to be fixed up by third party tool.\r
if not NeedProcessVpdMapFile and Sku.VpdOffset == "*":\r
NeedProcessVpdMapFile = True\r
EdkLogger.error("Build", FILE_NOT_FOUND, \\r
"Fail to find third-party BPDG tool to process VPD PCDs. BPDG Guid tool need to be defined in tools_def.txt and VPD_TOOL_GUID need to be provided in DSC file.")\r
\r
-\r
+ VpdSkuMap[PcdKey] = SkuValueMap\r
#\r
# Fix the PCDs define in VPD PCD section that never referenced by module.\r
# An example is PCD for signature usage.\r
# Not found, it should be signature\r
if not FoundFlag :\r
# just pick the a value to determine whether is unicode string type\r
- for (SkuName,Sku) in DscPcdEntry.SkuInfoList.items():\r
+ SkuValueMap = {}\r
+ SkuObjList = DscPcdEntry.SkuInfoList.items()\r
+ DefaultSku = DscPcdEntry.SkuInfoList.get('DEFAULT')\r
+ if DefaultSku:\r
+ defaultindex = SkuObjList.index(('DEFAULT',DefaultSku))\r
+ SkuObjList[0],SkuObjList[defaultindex] = SkuObjList[defaultindex],SkuObjList[0]\r
+ for (SkuName,Sku) in SkuObjList:\r
Sku.VpdOffset = Sku.VpdOffset.strip() \r
\r
# Need to iterate DEC pcd information to get the value & datumtype\r
\r
if DscPcdEntry not in self._DynamicPcdList:\r
self._DynamicPcdList.append(DscPcdEntry)\r
-# Sku = DscPcdEntry.SkuInfoList[DscPcdEntry.SkuInfoList.keys()[0]]\r
Sku.VpdOffset = Sku.VpdOffset.strip()\r
PcdValue = Sku.DefaultValue\r
if PcdValue == "":\r
EdkLogger.warn("build", "The offset value of PCD %s.%s is not 8-byte aligned!" %(DscPcdEntry.TokenSpaceGuidCName, DscPcdEntry.TokenCName), File=self.MetaFile)\r
else:\r
EdkLogger.error("build", FORMAT_INVALID, 'The offset value of PCD %s.%s should be %s-byte aligned.' % (DscPcdEntry.TokenSpaceGuidCName, DscPcdEntry.TokenCName, Alignment))\r
- VpdFile.Add(DscPcdEntry, Sku.VpdOffset)\r
+ if PcdValue not in SkuValueMap:\r
+ SkuValueMap[PcdValue] = []\r
+ VpdFile.Add(DscPcdEntry, SkuName,Sku.VpdOffset)\r
+ SkuValueMap[PcdValue].append(Sku)\r
if not NeedProcessVpdMapFile and Sku.VpdOffset == "*":\r
NeedProcessVpdMapFile = True \r
if DscPcdEntry.DatumType == 'VOID*' and PcdValue.startswith("L"):\r
- UnicodePcdArray.append(DscPcdEntry)\r
+ UnicodePcdArray.add(DscPcdEntry)\r
elif len(Sku.VariableName) > 0:\r
- HiiPcdArray.append(DscPcdEntry)\r
+ HiiPcdArray.add(DscPcdEntry)\r
else:\r
- OtherPcdArray.append(DscPcdEntry)\r
- \r
+ OtherPcdArray.add(DscPcdEntry)\r
+\r
# if the offset of a VPD is *, then it need to be fixed up by third party tool.\r
- \r
- \r
- \r
+ VpdSkuMap[DscPcd] = SkuValueMap\r
if (self.Platform.FlashDefinition == None or self.Platform.FlashDefinition == '') and \\r
VpdFile.GetCount() != 0:\r
EdkLogger.error("build", ATTRIBUTE_NOT_AVAILABLE, \r
"Fail to get FLASH_DEFINITION definition in DSC file %s which is required when DSC contains VPD PCD." % str(self.Platform.MetaFile))\r
\r
if VpdFile.GetCount() != 0:\r
- FvPath = os.path.join(self.BuildDir, "FV")\r
- if not os.path.exists(FvPath):\r
- try:\r
- os.makedirs(FvPath)\r
- except:\r
- EdkLogger.error("build", FILE_WRITE_FAILURE, "Fail to create FV folder under %s" % self.BuildDir)\r
-\r
- VpdFilePath = os.path.join(FvPath, "%s.txt" % self.Platform.VpdToolGuid)\r
-\r
- if VpdFile.Write(VpdFilePath):\r
- # retrieve BPDG tool's path from tool_def.txt according to VPD_TOOL_GUID defined in DSC file.\r
- BPDGToolName = None\r
- for ToolDef in self.ToolDefinition.values():\r
- if ToolDef.has_key("GUID") and ToolDef["GUID"] == self.Platform.VpdToolGuid:\r
- if not ToolDef.has_key("PATH"):\r
- EdkLogger.error("build", ATTRIBUTE_NOT_AVAILABLE, "PATH attribute was not provided for BPDG guid tool %s in tools_def.txt" % self.Platform.VpdToolGuid)\r
- BPDGToolName = ToolDef["PATH"]\r
- break\r
- # Call third party GUID BPDG tool.\r
- if BPDGToolName != None:\r
- VpdInfoFile.CallExtenalBPDGTool(BPDGToolName, VpdFilePath)\r
- else:\r
- EdkLogger.error("Build", FILE_NOT_FOUND, "Fail to find third-party BPDG tool to process VPD PCDs. BPDG Guid tool need to be defined in tools_def.txt and VPD_TOOL_GUID need to be provided in DSC file.")\r
+\r
+ self.FixVpdOffset(VpdFile)\r
+\r
+ self.FixVpdOffset(self.UpdateNVStoreMaxSize(VpdFile))\r
\r
# Process VPD map file generated by third party BPDG tool\r
if NeedProcessVpdMapFile:\r
VpdFile.Read(VpdMapFilePath)\r
\r
# Fixup "*" offset\r
- for Pcd in self._DynamicPcdList:\r
+ for pcd in VpdSkuMap:\r
+ vpdinfo = VpdFile.GetVpdInfo(pcd)\r
+ if vpdinfo is None:\r
# just pick the a value to determine whether is unicode string type\r
- i = 0\r
- for (SkuName,Sku) in Pcd.SkuInfoList.items(): \r
- if Sku.VpdOffset == "*":\r
- Sku.VpdOffset = VpdFile.GetOffset(Pcd)[i].strip()\r
- i += 1\r
+ continue\r
+ for pcdvalue in VpdSkuMap[pcd]:\r
+ for sku in VpdSkuMap[pcd][pcdvalue]:\r
+ for item in vpdinfo:\r
+ if item[2] == pcdvalue:\r
+ sku.VpdOffset = item[1]\r
else:\r
EdkLogger.error("build", FILE_READ_FAILURE, "Can not find VPD map file %s to fix up VPD offset." % VpdMapFilePath)\r
\r
- # Delete the DynamicPcdList At the last time enter into this function \r
+ # Delete the DynamicPcdList At the last time enter into this function\r
+ for Pcd in self._DynamicPcdList:\r
+ # just pick the a value to determine whether is unicode string type\r
+ Sku = Pcd.SkuInfoList[Pcd.SkuInfoList.keys()[0]]\r
+ Sku.VpdOffset = Sku.VpdOffset.strip()\r
+\r
+ if Pcd.DatumType not in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64, TAB_VOID, "BOOLEAN"]:\r
+ Pcd.DatumType = "VOID*"\r
+\r
+ PcdValue = Sku.DefaultValue\r
+ if Pcd.DatumType == 'VOID*' and PcdValue.startswith("L"):\r
+ # if found PCD which datum value is unicode string the insert to left size of UnicodeIndex\r
+ UnicodePcdArray.add(Pcd)\r
+ elif len(Sku.VariableName) > 0:\r
+ # if found HII type PCD then insert to right of UnicodeIndex\r
+ HiiPcdArray.add(Pcd)\r
+ else:\r
+ OtherPcdArray.add(Pcd)\r
del self._DynamicPcdList[:]\r
- self._DynamicPcdList.extend(UnicodePcdArray)\r
- self._DynamicPcdList.extend(HiiPcdArray)\r
- self._DynamicPcdList.extend(OtherPcdArray)\r
+ self._DynamicPcdList.extend(list(UnicodePcdArray))\r
+ self._DynamicPcdList.extend(list(HiiPcdArray))\r
+ self._DynamicPcdList.extend(list(OtherPcdArray))\r
+ allskuset = [(SkuName,Sku.SkuId) for pcd in self._DynamicPcdList for (SkuName,Sku) in pcd.SkuInfoList.items()]\r
+ for pcd in self._DynamicPcdList:\r
+ if len(pcd.SkuInfoList) == 1:\r
+ for (SkuName,SkuId) in allskuset:\r
+ if type(SkuId) in (str,unicode) and eval(SkuId) == 0 or SkuId == 0:\r
+ continue\r
+ pcd.SkuInfoList[SkuName] = copy.deepcopy(pcd.SkuInfoList['DEFAULT'])\r
+ pcd.SkuInfoList[SkuName].SkuId = SkuId\r
self.AllPcdList = self._NonDynamicPcdList + self._DynamicPcdList\r
- \r
+\r
+ def FixVpdOffset(self,VpdFile ):\r
+ FvPath = os.path.join(self.BuildDir, "FV")\r
+ if not os.path.exists(FvPath):\r
+ try:\r
+ os.makedirs(FvPath)\r
+ except:\r
+ EdkLogger.error("build", FILE_WRITE_FAILURE, "Fail to create FV folder under %s" % self.BuildDir)\r
+\r
+ VpdFilePath = os.path.join(FvPath, "%s.txt" % self.Platform.VpdToolGuid)\r
+\r
+ if VpdFile.Write(VpdFilePath):\r
+ # retrieve BPDG tool's path from tool_def.txt according to VPD_TOOL_GUID defined in DSC file.\r
+ BPDGToolName = None\r
+ for ToolDef in self.ToolDefinition.values():\r
+ if ToolDef.has_key("GUID") and ToolDef["GUID"] == self.Platform.VpdToolGuid:\r
+ if not ToolDef.has_key("PATH"):\r
+ EdkLogger.error("build", ATTRIBUTE_NOT_AVAILABLE, "PATH attribute was not provided for BPDG guid tool %s in tools_def.txt" % self.Platform.VpdToolGuid)\r
+ BPDGToolName = ToolDef["PATH"]\r
+ break\r
+ # Call third party GUID BPDG tool.\r
+ if BPDGToolName != None:\r
+ VpdInfoFile.CallExtenalBPDGTool(BPDGToolName, VpdFilePath)\r
+ else:\r
+ EdkLogger.error("Build", FILE_NOT_FOUND, "Fail to find third-party BPDG tool to process VPD PCDs. BPDG Guid tool need to be defined in tools_def.txt and VPD_TOOL_GUID need to be provided in DSC file.")\r
+\r
## Return the platform build data object\r
def _GetPlatform(self):\r
if self._Platform == None:\r
ToPcd.DatumType = FromPcd.DatumType\r
if FromPcd.SkuInfoList not in [None, '', []]:\r
ToPcd.SkuInfoList = FromPcd.SkuInfoList\r
+ # Add Flexible PCD format parse\r
+ if ToPcd.DefaultValue:\r
+ try:\r
+ ToPcd.DefaultValue = ValueExpressionEx(ToPcd.DefaultValue, ToPcd.DatumType, self._GuidDict)(True)\r
+ except BadExpression, Value:\r
+ EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s", %s' %(ToPcd.TokenSpaceGuidCName, ToPcd.TokenCName, ToPcd.DefaultValue, Value),\r
+ File=self.MetaFile)\r
\r
# check the validation of datum\r
IsValid, Cause = CheckPcdDatum(ToPcd.DatumType, ToPcd.DefaultValue)\r
AsBuiltInfDict['module_pi_specification_version'] += [self.Specification['PI_SPECIFICATION_VERSION']]\r
\r
OutputDir = self.OutputDir.replace('\\', '/').strip('/')\r
+ DebugDir = self.DebugDir.replace('\\', '/').strip('/')\r
for Item in self.CodaTargetList:\r
- File = Item.Target.Path.replace('\\', '/').strip('/').replace(OutputDir, '').strip('/')\r
+ File = Item.Target.Path.replace('\\', '/').strip('/').replace(DebugDir, '').strip('/')\r
if File not in self.OutputFile:\r
self.OutputFile.append(File)\r
+ if os.path.isabs(File):\r
+ File = File.replace('\\', '/').strip('/').replace(OutputDir, '').strip('/')\r
if Item.Target.Ext.lower() == '.aml':\r
AsBuiltInfDict['binary_item'] += ['ASL|' + File]\r
elif Item.Target.Ext.lower() == '.acpi':\r