BaseTools: Fix some build and report file issue

1. increment build not skip make file when not change any file
2. report file generate abundant blank line
3. Build encounter Database is locked on some platform, using database
   auto commit
4. Fv BaseAddress must have if set

Cc: Liming Gao <liming.gao@intel.com>
Cc: Yonghong Zhu <yonghong.zhu@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Yunhua Feng <yunhuax.feng@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>
This commit is contained in:
Yunhua Feng 2018-08-24 16:39:14 +08:00 committed by Yonghong Zhu
parent 0e3bfc6f7a
commit 8be15c61e8
11 changed files with 65 additions and 34 deletions

View File

@ -295,7 +295,7 @@ class WorkspaceAutoGen(AutoGen):
SkippedArchList = set(self.ArchList).symmetric_difference(set(self.Platform.SupArchList)) SkippedArchList = set(self.ArchList).symmetric_difference(set(self.Platform.SupArchList))
EdkLogger.verbose("\nArch [%s] is ignored because the platform supports [%s] only!" EdkLogger.verbose("\nArch [%s] is ignored because the platform supports [%s] only!"
% (" ".join(SkippedArchList), " ".join(self.Platform.SupArchList))) % (" ".join(SkippedArchList), " ".join(self.Platform.SupArchList)))
self.ArchList = tuple(ArchList) self.ArchList = tuple(sorted(ArchList))
# Validate build target # Validate build target
if self.BuildTarget not in self.Platform.BuildTargets: if self.BuildTarget not in self.Platform.BuildTargets:
@ -616,17 +616,17 @@ class WorkspaceAutoGen(AutoGen):
# #
content = 'gCommandLineDefines: ' content = 'gCommandLineDefines: '
content += str(GlobalData.gCommandLineDefines) content += str(GlobalData.gCommandLineDefines)
content += os.linesep content += "\n"
content += 'BuildOptionPcd: ' content += 'BuildOptionPcd: '
content += str(GlobalData.BuildOptionPcd) content += str(GlobalData.BuildOptionPcd)
content += os.linesep content += "\n"
content += 'Active Platform: ' content += 'Active Platform: '
content += str(self.Platform) content += str(self.Platform)
content += os.linesep content += "\n"
if self.FdfFile: if self.FdfFile:
content += 'Flash Image Definition: ' content += 'Flash Image Definition: '
content += str(self.FdfFile) content += str(self.FdfFile)
content += os.linesep content += "\n"
SaveFileOnChange(os.path.join(self.BuildDir, 'BuildOptions'), content, False) SaveFileOnChange(os.path.join(self.BuildDir, 'BuildOptions'), content, False)
# #
@ -636,7 +636,7 @@ class WorkspaceAutoGen(AutoGen):
if Pa.PcdTokenNumber: if Pa.PcdTokenNumber:
if Pa.DynamicPcdList: if Pa.DynamicPcdList:
for Pcd in Pa.DynamicPcdList: for Pcd in Pa.DynamicPcdList:
PcdTokenNumber += os.linesep PcdTokenNumber += "\n"
PcdTokenNumber += str((Pcd.TokenCName, Pcd.TokenSpaceGuidCName)) PcdTokenNumber += str((Pcd.TokenCName, Pcd.TokenSpaceGuidCName))
PcdTokenNumber += ' : ' PcdTokenNumber += ' : '
PcdTokenNumber += str(Pa.PcdTokenNumber[Pcd.TokenCName, Pcd.TokenSpaceGuidCName]) PcdTokenNumber += str(Pa.PcdTokenNumber[Pcd.TokenCName, Pcd.TokenSpaceGuidCName])
@ -677,7 +677,7 @@ class WorkspaceAutoGen(AutoGen):
if not os.path.exists(self.BuildDir): if not os.path.exists(self.BuildDir):
os.makedirs(self.BuildDir) os.makedirs(self.BuildDir)
with open(os.path.join(self.BuildDir, 'AutoGen'), 'w+') as file: with open(os.path.join(self.BuildDir, 'AutoGen'), 'w+') as file:
for f in AllWorkSpaceMetaFiles: for f in sorted(AllWorkSpaceMetaFiles):
print(f, file=file) print(f, file=file)
return True return True
@ -1598,6 +1598,9 @@ class PlatformAutoGen(AutoGen):
self._DynamicPcdList.extend(list(UnicodePcdArray)) self._DynamicPcdList.extend(list(UnicodePcdArray))
self._DynamicPcdList.extend(list(HiiPcdArray)) self._DynamicPcdList.extend(list(HiiPcdArray))
self._DynamicPcdList.extend(list(OtherPcdArray)) self._DynamicPcdList.extend(list(OtherPcdArray))
#python3.6 set is not ordered at all
self._DynamicPcdList = sorted(self._DynamicPcdList, key=lambda x:(x.TokenSpaceGuidCName, x.TokenCName))
self._NonDynamicPcdList = sorted(self._NonDynamicPcdList, key=lambda x: (x.TokenSpaceGuidCName, x.TokenCName))
allskuset = [(SkuName, Sku.SkuId) for pcd in self._DynamicPcdList for (SkuName, Sku) in pcd.SkuInfoList.items()] allskuset = [(SkuName, Sku.SkuId) for pcd in self._DynamicPcdList for (SkuName, Sku) in pcd.SkuInfoList.items()]
for pcd in self._DynamicPcdList: for pcd in self._DynamicPcdList:
if len(pcd.SkuInfoList) == 1: if len(pcd.SkuInfoList) == 1:
@ -2374,7 +2377,7 @@ class PlatformAutoGen(AutoGen):
list(PlatformModuleOptions.keys()) + list(ModuleTypeOptions.keys()) + list(PlatformModuleOptions.keys()) + list(ModuleTypeOptions.keys()) +
list(self.ToolDefinition.keys())) list(self.ToolDefinition.keys()))
BuildOptions = defaultdict(lambda: defaultdict(str)) BuildOptions = defaultdict(lambda: defaultdict(str))
for Tool in AllTools: for Tool in sorted(AllTools):
for Options in [self.ToolDefinition, ModuleOptions, PlatformOptions, ModuleTypeOptions, PlatformModuleOptions]: for Options in [self.ToolDefinition, ModuleOptions, PlatformOptions, ModuleTypeOptions, PlatformModuleOptions]:
if Tool not in Options: if Tool not in Options:
continue continue
@ -3156,12 +3159,12 @@ class ModuleAutoGen(AutoGen):
@cached_property @cached_property
def IntroTargetList(self): def IntroTargetList(self):
self.Targets self.Targets
return self._IntroBuildTargetList return sorted(self._IntroBuildTargetList, key=lambda x: str(x.Target))
@cached_property @cached_property
def CodaTargetList(self): def CodaTargetList(self):
self.Targets self.Targets
return self._FinalBuildTargetList return sorted(self._FinalBuildTargetList, key=lambda x: str(x.Target))
@cached_property @cached_property
def FileTypes(self): def FileTypes(self):
@ -3889,7 +3892,7 @@ class ModuleAutoGen(AutoGen):
if os.path.exists (self.TimeStampPath): if os.path.exists (self.TimeStampPath):
os.remove (self.TimeStampPath) os.remove (self.TimeStampPath)
with open(self.TimeStampPath, 'w+') as file: with open(self.TimeStampPath, 'w+') as file:
for f in FileSet: for f in sorted(FileSet):
print(f, file=file) print(f, file=file)
# Ignore generating makefile when it is a binary module # Ignore generating makefile when it is a binary module

View File

@ -1011,7 +1011,10 @@ def CreateModulePcdCode(Info, AutoGenC, AutoGenH, Pcd):
Value = Value[:-1] Value = Value[:-1]
ValueNumber = int (Value, 0) ValueNumber = int (Value, 0)
except: except:
EdkLogger.error("build", AUTOGEN_ERROR, try:
ValueNumber = int(Value.lstrip('0'))
except:
EdkLogger.error("build", AUTOGEN_ERROR,
"PCD value is not valid dec or hex number for datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, TokenCName), "PCD value is not valid dec or hex number for datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, TokenCName),
ExtraData="[%s]" % str(Info)) ExtraData="[%s]" % str(Info))
if ValueNumber < 0: if ValueNumber < 0:

View File

@ -917,7 +917,7 @@ cleanlib:
# #
# Extract common files list in the dependency files # Extract common files list in the dependency files
# #
for File in DepSet: for File in sorted(DepSet, key=lambda x: str(x)):
self.CommonFileDependency.append(self.PlaceMacro(File.Path, self.Macros)) self.CommonFileDependency.append(self.PlaceMacro(File.Path, self.Macros))
for File in FileDependencyDict: for File in FileDependencyDict:
@ -926,11 +926,11 @@ cleanlib:
continue continue
NewDepSet = set(FileDependencyDict[File]) NewDepSet = set(FileDependencyDict[File])
NewDepSet -= DepSet NewDepSet -= DepSet
FileDependencyDict[File] = ["$(COMMON_DEPS)"] + list(NewDepSet) FileDependencyDict[File] = ["$(COMMON_DEPS)"] + sorted(NewDepSet, key=lambda x: str(x))
# Convert target description object to target string in makefile # Convert target description object to target string in makefile
for Type in self._AutoGenObject.Targets: for Type in self._AutoGenObject.Targets:
for T in self._AutoGenObject.Targets[Type]: for T in sorted(self._AutoGenObject.Targets[Type], key=lambda x: str(x)):
# Generate related macros if needed # Generate related macros if needed
if T.GenFileListMacro and T.FileListMacro not in self.FileListMacros: if T.GenFileListMacro and T.FileListMacro not in self.FileListMacros:
self.FileListMacros[T.FileListMacro] = [] self.FileListMacros[T.FileListMacro] = []
@ -1097,7 +1097,7 @@ cleanlib:
DependencySet.update(ForceList) DependencySet.update(ForceList)
if File in DependencySet: if File in DependencySet:
DependencySet.remove(File) DependencySet.remove(File)
DependencyList = list(DependencySet) # remove duplicate ones DependencyList = sorted(DependencySet, key=lambda x: str(x)) # remove duplicate ones
return DependencyList return DependencyList

View File

@ -1348,7 +1348,7 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, DynamicPcdList, Phase):
DbValueList.append(Sku.DefaultValue) DbValueList.append(Sku.DefaultValue)
Pcd.TokenTypeList = list(set(Pcd.TokenTypeList)) Pcd.TokenTypeList = sorted(set(Pcd.TokenTypeList))
if Pcd.DatumType == TAB_VOID: if Pcd.DatumType == TAB_VOID:
Dict['SIZE_TABLE_CNAME'].append(CName) Dict['SIZE_TABLE_CNAME'].append(CName)
Dict['SIZE_TABLE_GUID'].append(TokenSpaceGuid) Dict['SIZE_TABLE_GUID'].append(TokenSpaceGuid)
@ -1449,7 +1449,7 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, DynamicPcdList, Phase):
Dict['PCD_CNAME_LENGTH'][GeneratedTokenNumber] = len(CNameBinArray.split(",")) Dict['PCD_CNAME_LENGTH'][GeneratedTokenNumber] = len(CNameBinArray.split(","))
Pcd.TokenTypeList = list(set(Pcd.TokenTypeList)) Pcd.TokenTypeList = sorted(set(Pcd.TokenTypeList))
# search the Offset and Table, used by LocalTokenNumberTableOffset # search the Offset and Table, used by LocalTokenNumberTableOffset
if 'PCD_TYPE_HII' in Pcd.TokenTypeList: if 'PCD_TYPE_HII' in Pcd.TokenTypeList:

View File

@ -1597,15 +1597,19 @@ def CheckPcdDatum(Type, Value):
return False, "Invalid value [%s] of type [%s]; must be one of TRUE, True, true, 0x1, 0x01, 1"\ return False, "Invalid value [%s] of type [%s]; must be one of TRUE, True, true, 0x1, 0x01, 1"\
", FALSE, False, false, 0x0, 0x00, 0" % (Value, Type) ", FALSE, False, false, 0x0, 0x00, 0" % (Value, Type)
elif Type in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64]: elif Type in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64]:
if Value and int(Value, 0) < 0:
return False, "PCD can't be set to negative value[%s] for datum type [%s]" % (Value, Type)
try: try:
Value = int(Value, 0) Val = int(Value, 0)
if Value > MAX_VAL_TYPE[Type]:
return False, "Too large PCD value[%s] for datum type [%s]" % (Value, Type)
except: except:
return False, "Invalid value [%s] of type [%s];"\ try:
" must be a hexadecimal, decimal or octal in C language format." % (Value, Type) Val = int(Value.lstrip('0'))
except:
return False, "Invalid value [%s] of type [%s];" \
" must be a hexadecimal, decimal or octal in C language format." % (Value, Type)
if Val > MAX_VAL_TYPE[Type]:
return False, "Too large PCD value[%s] for datum type [%s]" % (Value, Type)
if Val < 0:
return False, "PCD can't be set to negative value[%s] for datum type [%s]" % (Value, Type)
else: else:
return True, "StructurePcd" return True, "StructurePcd"

View File

@ -612,7 +612,7 @@ def PreCheck(FileName, FileContent, SupSectionTag):
# #
# Regenerate FileContent # Regenerate FileContent
# #
NewFileContent = NewFileContent + Line + '\r\n' NewFileContent = NewFileContent + Line + '\n'
if IsFailed: if IsFailed:
EdkLogger.error("Parser", FORMAT_INVALID, Line=LineNo, File=FileName, RaiseError=EdkLogger.IsRaiseError) EdkLogger.error("Parser", FORMAT_INVALID, Line=LineNo, File=FileName, RaiseError=EdkLogger.IsRaiseError)

View File

@ -102,6 +102,8 @@ class FvImageSection(FvImageSectionClassObject):
Fv = GenFdsGlobalVariable.FdfParser.Profile.FvDict.get(self.FvName) Fv = GenFdsGlobalVariable.FdfParser.Profile.FvDict.get(self.FvName)
if Fv is not None: if Fv is not None:
self.Fv = Fv self.Fv = Fv
if not self.FvAddr and self.Fv.BaseAddress:
self.FvAddr = self.Fv.BaseAddress
FvFileName = Fv.AddToBuffer(Buffer, self.FvAddr, MacroDict = Dict, Flag=IsMakefile) FvFileName = Fv.AddToBuffer(Buffer, self.FvAddr, MacroDict = Dict, Flag=IsMakefile)
if Fv.FvAlignment is not None: if Fv.FvAlignment is not None:
if self.Alignment is None: if self.Alignment is None:

View File

@ -321,6 +321,8 @@ def main():
continue continue
for RegionData in RegionObj.RegionDataList: for RegionData in RegionObj.RegionDataList:
if FvObj.UiFvName.upper() == RegionData.upper(): if FvObj.UiFvName.upper() == RegionData.upper():
if not FvObj.BaseAddress:
FvObj.BaseAddress = '0x%x' % (int(FdObj.BaseAddress, 0) + RegionObj.Offset)
if FvObj.FvRegionInFD: if FvObj.FvRegionInFD:
if FvObj.FvRegionInFD != RegionObj.Size: if FvObj.FvRegionInFD != RegionObj.Size:
EdkLogger.error("GenFds", FORMAT_INVALID, "The FV %s's region is specified in multiple FD with different value." %FvObj.UiFvName) EdkLogger.error("GenFds", FORMAT_INVALID, "The FV %s's region is specified in multiple FD with different value." %FvObj.UiFvName)
@ -607,16 +609,21 @@ class GenFds :
ModuleList = [] ModuleList = []
FileGuidList = [] FileGuidList = []
GuidPattern = gGuidPattern GuidPattern = gGuidPattern
VariableGuidSet = set()
for Arch in ArchList: for Arch in ArchList:
PlatformDataBase = BuildDb.BuildObject[GenFdsGlobalVariable.ActivePlatform, Arch, GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag] PlatformDataBase = BuildDb.BuildObject[GenFdsGlobalVariable.ActivePlatform, Arch, GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag]
PkgList = GenFdsGlobalVariable.WorkSpace.GetPackageList(GenFdsGlobalVariable.ActivePlatform, Arch, GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag) PkgList = GenFdsGlobalVariable.WorkSpace.GetPackageList(GenFdsGlobalVariable.ActivePlatform, Arch, GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag)
for P in PkgList: for P in PkgList:
PkgGuidDict.update(P.Guids) PkgGuidDict.update(P.Guids)
for Name, Guid in PlatformDataBase.Pcds: for Name, Guid in sorted(PlatformDataBase.Pcds):
Pcd = PlatformDataBase.Pcds[Name, Guid] Pcd = PlatformDataBase.Pcds[Name, Guid]
if Pcd.Type in [TAB_PCDS_DYNAMIC_HII, TAB_PCDS_DYNAMIC_EX_HII]: if Pcd.Type in [TAB_PCDS_DYNAMIC_HII, TAB_PCDS_DYNAMIC_EX_HII]:
for SkuId in Pcd.SkuInfoList: for SkuId in Pcd.SkuInfoList:
Sku = Pcd.SkuInfoList[SkuId] Sku = Pcd.SkuInfoList[SkuId]
if Sku.VariableGuid in VariableGuidSet:
continue
else:
VariableGuidSet.add(Sku.VariableGuid)
if Sku.VariableGuid and Sku.VariableGuid in PkgGuidDict.keys(): if Sku.VariableGuid and Sku.VariableGuid in PkgGuidDict.keys():
GuidDict[Sku.VariableGuid] = PkgGuidDict[Sku.VariableGuid] GuidDict[Sku.VariableGuid] = PkgGuidDict[Sku.VariableGuid]
for ModuleFile in PlatformDataBase.Modules: for ModuleFile in PlatformDataBase.Modules:

View File

@ -128,7 +128,7 @@ def GetDependencyList(FileStack, SearchPathList):
if len(FileContent) == 0: if len(FileContent) == 0:
continue continue
IncludedFileList = []
if FileContent[0] == 0xff or FileContent[0] == 0xfe: if FileContent[0] == 0xff or FileContent[0] == 0xfe:
FileContent = str(FileContent, "utf-16") FileContent = str(FileContent, "utf-16")
IncludedFileList = gIncludePattern.findall(FileContent) IncludedFileList = gIncludePattern.findall(FileContent)

View File

@ -164,7 +164,7 @@ class WorkspaceDatabase(object):
os.remove(DbPath) os.remove(DbPath)
# create db with optimized parameters # create db with optimized parameters
self.Conn = sqlite3.connect(DbPath, isolation_level='DEFERRED') self.Conn = sqlite3.connect(DbPath, isolation_level=None)
self.Conn.execute("PRAGMA synchronous=OFF") self.Conn.execute("PRAGMA synchronous=OFF")
self.Conn.execute("PRAGMA temp_store=MEMORY") self.Conn.execute("PRAGMA temp_store=MEMORY")
self.Conn.execute("PRAGMA count_changes=OFF") self.Conn.execute("PRAGMA count_changes=OFF")

View File

@ -79,7 +79,7 @@ gGlueLibEntryPoint = re.compile(r"__EDKII_GLUE_MODULE_ENTRY_POINT__\s*=\s*(\w+)"
gLineMaxLength = 120 gLineMaxLength = 120
## Tags for end of line in report ## Tags for end of line in report
gEndOfLine = "\r\n" gEndOfLine = "\n"
## Tags for section start, end and separator ## Tags for section start, end and separator
gSectionStart = ">" + "=" * (gLineMaxLength - 2) + "<" gSectionStart = ">" + "=" * (gLineMaxLength - 2) + "<"
@ -1031,7 +1031,10 @@ class PcdReport(object):
if Pcd.DatumType in TAB_PCD_NUMERIC_TYPES: if Pcd.DatumType in TAB_PCD_NUMERIC_TYPES:
PcdValueNumber = int(PcdValue.strip(), 0) try:
PcdValueNumber = int(PcdValue.strip(), 0)
except:
PcdValueNumber = int(PcdValue.lstrip('0'))
if DecDefaultValue is None: if DecDefaultValue is None:
DecMatch = True DecMatch = True
else: else:
@ -1047,7 +1050,10 @@ class PcdReport(object):
if DscDefaultValue is None: if DscDefaultValue is None:
DscMatch = True DscMatch = True
else: else:
DscDefaultValueNumber = int(DscDefaultValue.strip(), 0) try:
DscDefaultValueNumber = int(DscDefaultValue.strip(), 0)
except:
DscDefaultValueNumber = int(DscDefaultValue.lstrip('0'))
DscMatch = (DscDefaultValueNumber == PcdValueNumber) DscMatch = (DscDefaultValueNumber == PcdValueNumber)
else: else:
if DecDefaultValue is None: if DecDefaultValue is None:
@ -1152,7 +1158,10 @@ class PcdReport(object):
for ModulePath in ModuleOverride: for ModulePath in ModuleOverride:
ModuleDefault = ModuleOverride[ModulePath] ModuleDefault = ModuleOverride[ModulePath]
if Pcd.DatumType in TAB_PCD_NUMERIC_TYPES: if Pcd.DatumType in TAB_PCD_NUMERIC_TYPES:
ModulePcdDefaultValueNumber = int(ModuleDefault.strip(), 0) try:
ModulePcdDefaultValueNumber = int(ModuleDefault.strip(), 0)
except:
ModulePcdDefaultValueNumber = int(ModuleDefault.lstrip('0'))
Match = (ModulePcdDefaultValueNumber == PcdValueNumber) Match = (ModulePcdDefaultValueNumber == PcdValueNumber)
if Pcd.DatumType == 'BOOLEAN': if Pcd.DatumType == 'BOOLEAN':
ModuleDefault = str(ModulePcdDefaultValueNumber) ModuleDefault = str(ModulePcdDefaultValueNumber)
@ -1231,7 +1240,10 @@ class PcdReport(object):
if Value.startswith(('0x', '0X')): if Value.startswith(('0x', '0X')):
Value = '{} ({:d})'.format(Value, int(Value, 0)) Value = '{} ({:d})'.format(Value, int(Value, 0))
else: else:
Value = "0x{:X} ({})".format(int(Value, 0), Value) try:
Value = "0x{:X} ({})".format(int(Value, 0), Value)
except:
Value = "0x{:X} ({})".format(int(Value.lstrip('0')), Value)
FileWrite(File, ' %*s = %s' % (self.MaxLen + 19, 'DEC DEFAULT', Value)) FileWrite(File, ' %*s = %s' % (self.MaxLen + 19, 'DEC DEFAULT', Value))
if IsStructure: if IsStructure:
self.PrintStructureInfo(File, Pcd.DefaultValues) self.PrintStructureInfo(File, Pcd.DefaultValues)