BaseTools:Incremental build not work if VPD values in DSC changed by -D

If a -D flag is passed into build that selects different lines in
[PcdsDynamicExVpd], then build does not see any changes to the timestamp
of the DSC file and the VPD tool is not used to regenerate the VPD
region based in the statements that are active. so we changed the detect
condition and use SaveFileOnChange function to generate VPD.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Yonghong Zhu <yonghong.zhu@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>

git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@19767 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
Yonghong Zhu 2016-01-29 04:48:55 +00:00 committed by yzhu52
parent d66670f9ea
commit e459de7800
2 changed files with 17 additions and 34 deletions

View File

@ -1256,7 +1256,6 @@ class PlatformAutoGen(AutoGen):
"Fail to get FLASH_DEFINITION definition in DSC file %s which is required when DSC contains VPD PCD." % str(self.Platform.MetaFile)) "Fail to get FLASH_DEFINITION definition in DSC file %s which is required when DSC contains VPD PCD." % str(self.Platform.MetaFile))
if VpdFile.GetCount() != 0: if VpdFile.GetCount() != 0:
DscTimeStamp = self.Platform.MetaFile.TimeStamp
FvPath = os.path.join(self.BuildDir, "FV") FvPath = os.path.join(self.BuildDir, "FV")
if not os.path.exists(FvPath): if not os.path.exists(FvPath):
try: try:
@ -1264,13 +1263,9 @@ class PlatformAutoGen(AutoGen):
except: except:
EdkLogger.error("build", FILE_WRITE_FAILURE, "Fail to create FV folder under %s" % self.BuildDir) EdkLogger.error("build", FILE_WRITE_FAILURE, "Fail to create FV folder under %s" % self.BuildDir)
VpdFilePath = os.path.join(FvPath, "%s.txt" % self.Platform.VpdToolGuid) VpdFilePath = os.path.join(FvPath, "%s.txt" % self.Platform.VpdToolGuid)
if VpdFile.Write(VpdFilePath):
if not os.path.exists(VpdFilePath) or os.path.getmtime(VpdFilePath) < DscTimeStamp:
VpdFile.Write(VpdFilePath)
# retrieve BPDG tool's path from tool_def.txt according to VPD_TOOL_GUID defined in DSC file. # retrieve BPDG tool's path from tool_def.txt according to VPD_TOOL_GUID defined in DSC file.
BPDGToolName = None BPDGToolName = None
for ToolDef in self.ToolDefinition.values(): for ToolDef in self.ToolDefinition.values():

View File

@ -6,7 +6,7 @@
# is pointed by *_*_*_VPD_TOOL_GUID in conf/tools_def.txt # is pointed by *_*_*_VPD_TOOL_GUID in conf/tools_def.txt
# #
# #
# Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.<BR> # Copyright (c) 2010 - 2016, Intel Corporation. All rights reserved.<BR>
# This program and the accompanying materials # This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License # are licensed and made available under the terms and conditions of the BSD License
# which accompanies this distribution. The full text of the license may be found at # which accompanies this distribution. The full text of the license may be found at
@ -21,6 +21,7 @@ import Common.EdkLogger as EdkLogger
import Common.BuildToolError as BuildToolError import Common.BuildToolError as BuildToolError
import subprocess import subprocess
from Common.LongFilePathSupport import OpenLongFilePath as open from Common.LongFilePathSupport import OpenLongFilePath as open
from Common.Misc import SaveFileOnChange
FILE_COMMENT_TEMPLATE = \ FILE_COMMENT_TEMPLATE = \
""" """
@ -124,18 +125,8 @@ class VpdInfoFile:
if not (FilePath != None or len(FilePath) != 0): if not (FilePath != None or len(FilePath) != 0):
EdkLogger.error("VpdInfoFile", BuildToolError.PARAMETER_INVALID, EdkLogger.error("VpdInfoFile", BuildToolError.PARAMETER_INVALID,
"Invalid parameter FilePath: %s." % FilePath) "Invalid parameter FilePath: %s." % FilePath)
try:
fd = open(FilePath, "w")
except:
EdkLogger.error("VpdInfoFile",
BuildToolError.FILE_OPEN_FAILURE,
"Fail to open file %s for written." % FilePath)
try: Content = FILE_COMMENT_TEMPLATE
# write file header
fd.write(FILE_COMMENT_TEMPLATE)
# write each of PCD in VPD type
Pcds = self._VpdArray.keys() Pcds = self._VpdArray.keys()
Pcds.sort() Pcds.sort()
for Pcd in Pcds: for Pcd in Pcds:
@ -145,13 +136,10 @@ class VpdInfoFile:
if PcdValue == "" : if PcdValue == "" :
PcdValue = Pcd.DefaultValue PcdValue = Pcd.DefaultValue
fd.write("%s.%s|%s|%s|%s|%s \n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, str(Pcd.SkuInfoList.keys()[i]),str(Offset).strip(), str(Pcd.MaxDatumSize).strip(),PcdValue)) Content += "%s.%s|%s|%s|%s|%s \n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, str(Pcd.SkuInfoList.keys()[i]),str(Offset).strip(), str(Pcd.MaxDatumSize).strip(),PcdValue)
i += 1 i += 1
except:
EdkLogger.error("VpdInfoFile", return SaveFileOnChange(FilePath, Content, False)
BuildToolError.FILE_WRITE_FAILURE,
"Fail to write file %s" % FilePath)
fd.close()
## Read an existing VPD PCD info file. ## Read an existing VPD PCD info file.
# #