From: "Liming Gao" <liming.gao@intel.com>
To: "devel@edk2.groups.io" <devel@edk2.groups.io>,
"Gao, Liming" <liming.gao@intel.com>,
"Feng, Bob C" <bob.c.feng@intel.com>
Cc: "Shi, Steven" <steven.shi@intel.com>
Subject: Re: [edk2-devel] [Patch 1/1] BaseTools: Fixed issue for IgnoreAutoGen
Date: Mon, 9 Sep 2019 07:15:41 +0000 [thread overview]
Message-ID: <4A89E2EF3DFEDB4C8BFDE51014F606A14E4F4965@SHSMSX104.ccr.corp.intel.com> (raw)
In-Reply-To: <15C2B2E9C55F0B32.16248@groups.io>
Sorry, should be Acked-by: Liming Gao <liming.gao@intel.com>
>-----Original Message-----
>From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf Of
>Liming Gao
>Sent: Monday, September 09, 2019 2:59 PM
>To: Feng, Bob C <bob.c.feng@intel.com>; devel@edk2.groups.io
>Cc: Shi, Steven <steven.shi@intel.com>
>Subject: Re: [edk2-devel] [Patch 1/1] BaseTools: Fixed issue for
>IgnoreAutoGen
>
>Liming Gao <liming.gao@intel.com>
>
>>-----Original Message-----
>>From: Feng, Bob C
>>Sent: Thursday, September 05, 2019 10:06 PM
>>To: devel@edk2.groups.io; Feng, Bob C <bob.c.feng@intel.com>; Gao,
>Liming
>><liming.gao@intel.com>
>>Cc: Shi, Steven <steven.shi@intel.com>
>>Subject: RE: [edk2-devel] [Patch 1/1] BaseTools: Fixed issue for
>>IgnoreAutoGen
>>
>>Sorry for the incomplete mail.
>>
>>I verified this patch on Ovmf, Emulator, MinPlatforms and Intel Server
>>Platform.
>>
>>Thanks,
>>Bob
>>
>>-----Original Message-----
>>From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Bob
>Feng
>>Sent: Thursday, September 5, 2019 10:04 PM
>>To: Gao, Liming <liming.gao@intel.com>; devel@edk2.groups.io
>>Cc: Shi, Steven <steven.shi@intel.com>
>>Subject: Re: [edk2-devel] [Patch 1/1] BaseTools: Fixed issue for
>>IgnoreAutoGen
>>
>>Liming,
>>
>>Yes, this change only impact -u option.
>>
>>I separate _MultiThreadBuildPlatform function into two functions and create
>2
>>new functions specially for IgnoreAutoGen, so the there looks big change
>for
>>build.py in this patch. I verified this patch on Ovmf, E
>>
>>-Bob
>>
>>-----Original Message-----
>>From: Gao, Liming
>>Sent: Thursday, September 5, 2019 9:12 PM
>>To: devel@edk2.groups.io; Feng, Bob C <bob.c.feng@intel.com>
>>Cc: Shi, Steven <steven.shi@intel.com>
>>Subject: RE: [edk2-devel] [Patch 1/1] BaseTools: Fixed issue for
>>IgnoreAutoGen
>>
>>Bob:
>> Does this change only impact -u option behavior?
>>
>>Thanks
>>Liming
>>> -----Original Message-----
>>> From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf Of
>>> Bob Feng
>>> Sent: Thursday, September 5, 2019 5:05 PM
>>> To: devel@edk2.groups.io
>>> Cc: Gao, Liming <liming.gao@intel.com>; Shi, Steven
>>> <steven.shi@intel.com>; Feng, Bob C <bob.c.feng@intel.com>
>>> Subject: [edk2-devel] [Patch 1/1] BaseTools: Fixed issue for
>>> IgnoreAutoGen
>>>
>>> https://bugzilla.tianocore.org/show_bug.cgi?id=2080
>>>
>>> This patch is to improve build -u option to re-use
>>> GlobalVar_<platformguid>_<arch>.bin file which is introduced by
>>> multiple-process-autogen feature.
>>>
>>> Cc: Liming Gao <liming.gao@intel.com>
>>> Cc: Steven Shi <steven.shi@intel.com>
>>> Signed-off-by: Bob Feng <bob.c.feng@intel.com>
>>> ---
>>> .../Source/Python/AutoGen/AutoGenWorker.py | 2 +-
>>> .../Source/Python/AutoGen/ModuleAutoGen.py | 4 +-
>>> .../Python/AutoGen/ModuleAutoGenHelper.py | 29 ++
>>> .../Source/Python/AutoGen/PlatformAutoGen.py | 2 +
>>> .../Source/Python/AutoGen/WorkspaceAutoGen.py | 1 -
>>> BaseTools/Source/Python/build/build.py | 355 +++++++++++-------
>>> 6 files changed, 255 insertions(+), 138 deletions(-)
>>>
>>> diff --git a/BaseTools/Source/Python/AutoGen/AutoGenWorker.py
>>> b/BaseTools/Source/Python/AutoGen/AutoGenWorker.py
>>> index 2e68538b1cb4..f488ae9d5f80 100755
>>> --- a/BaseTools/Source/Python/AutoGen/AutoGenWorker.py
>>> +++ b/BaseTools/Source/Python/AutoGen/AutoGenWorker.py
>>> @@ -236,11 +236,11 @@ class AutoGenWorkerInProcess(mp.Process):
>>> Ma.ReferenceModules =
>>Refes[(Ma.MetaFile.File,Ma.MetaFile.Root,Ma.Arch,Ma.MetaFile.Path)]
>>> if GlobalData.gBinCacheSource and CommandTarget in [None, "",
>>"all"]:
>>> Ma.GenModuleFilesHash(GlobalData.gCacheIR)
>>> Ma.GenPreMakefileHash(GlobalData.gCacheIR)
>>> if Ma.CanSkipbyPreMakefileCache(GlobalData.gCacheIR):
>>> - continue
>>> + continue
>>>
>>> Ma.CreateCodeFile(False)
>>>
>>> Ma.CreateMakeFile(False,GenFfsList=FfsCmd.get((Ma.MetaFile.File,
>>> Ma.Arch),[]))
>>>
>>> if GlobalData.gBinCacheSource and CommandTarget in [None, "",
>>"all"]:
>>> diff --git a/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py
>>> b/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py
>>> index 3bb7e91154ac..5f28681e3146 100755
>>> --- a/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py
>>> +++ b/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py
>>> @@ -2058,12 +2058,12 @@ class ModuleAutoGen(AutoGen):
>>> not gDict[(self.MetaFile.Path, self.Arch)].ModuleFilesHashDigest:
>>> self.GenModuleFilesHash(gDict)
>>>
>>> if not (self.MetaFile.Path, self.Arch) in gDict or \
>>> not gDict[(self.MetaFile.Path, self.Arch)].ModuleFilesHashDigest:
>>> - EdkLogger.quiet("[cache warning]: Cannot generate
>>ModuleFilesHashDigest for module %s[%s]" %(self.MetaFile.Path,
>>> self.Arch))
>>> - return
>>> + EdkLogger.quiet("[cache warning]: Cannot generate
>>> + ModuleFilesHashDigest for module %s[%s]" %(self.MetaFile.Path,
>>> self.Arch))
>>> + return
>>>
>>> # Initialze hash object
>>> m = hashlib.md5()
>>>
>>> # Add Platform level hash
>>> diff --git a/BaseTools/Source/Python/AutoGen/ModuleAutoGenHelper.py
>>> b/BaseTools/Source/Python/AutoGen/ModuleAutoGenHelper.py
>>> index c7591253debd..9dd93b9beb12 100644
>>> --- a/BaseTools/Source/Python/AutoGen/ModuleAutoGenHelper.py
>>> +++ b/BaseTools/Source/Python/AutoGen/ModuleAutoGenHelper.py
>>> @@ -234,22 +234,51 @@ class AutoGenInfo(object):
>>> #
>>> #This class is the pruned WorkSpaceAutoGen for ModuleAutoGen in
>>> multiple thread # class WorkSpaceInfo(AutoGenInfo):
>>> def __init__(self,Workspace, MetaFile, Target, ToolChain, Arch):
>>> + if not hasattr(self, "_Init"):
>>> + self.do_init(Workspace, MetaFile, Target, ToolChain, Arch)
>>> + self._Init = True
>>> + def do_init(self,Workspace, MetaFile, Target, ToolChain, Arch):
>>> self._SrcTimeStamp = 0
>>> self.Db = BuildDB
>>> self.BuildDatabase = self.Db.BuildObject
>>> self.Target = Target
>>> self.ToolChain = ToolChain
>>> self.WorkspaceDir = Workspace
>>> self.ActivePlatform = MetaFile
>>> self.ArchList = Arch
>>> + self.AutoGenObjectList = []
>>> + @property
>>> + def BuildDir(self):
>>> + return self.AutoGenObjectList[0].BuildDir
>>>
>>> + @property
>>> + def Name(self):
>>> + return self.AutoGenObjectList[0].Platform.PlatformName
>>> +
>>> + @property
>>> + def FlashDefinition(self):
>>> + return self.AutoGenObjectList[0].Platform.FlashDefinition
>>> + @property
>>> + def GenFdsCommandDict(self):
>>> + FdsCommandDict =
>>self.AutoGenObjectList[0].DataPipe.Get("FdsCommandDict")
>>> + if FdsCommandDict:
>>> + return FdsCommandDict
>>> + return {}
>>> +
>>> + @cached_property
>>> + def FvDir(self):
>>> + return os.path.join(self.BuildDir, TAB_FV_DIRECTORY)
>>>
>>> class PlatformInfo(AutoGenInfo):
>>> def __init__(self, Workspace, MetaFile, Target, ToolChain,
>Arch,DataPipe):
>>> + if not hasattr(self, "_Init"):
>>> + self.do_init(Workspace, MetaFile, Target, ToolChain, Arch,DataPipe)
>>> + self._Init = True
>>> + def do_init(self,Workspace, MetaFile, Target, ToolChain,
>Arch,DataPipe):
>>> self.Wa = Workspace
>>> self.WorkspaceDir = self.Wa.WorkspaceDir
>>> self.MetaFile = MetaFile
>>> self.Arch = Arch
>>> self.Target = Target
>>> diff --git a/BaseTools/Source/Python/AutoGen/PlatformAutoGen.py
>>> b/BaseTools/Source/Python/AutoGen/PlatformAutoGen.py
>>> index 565424a95ead..1e17b6687129 100644
>>> --- a/BaseTools/Source/Python/AutoGen/PlatformAutoGen.py
>>> +++ b/BaseTools/Source/Python/AutoGen/PlatformAutoGen.py
>>> @@ -186,11 +186,13 @@ class PlatformAutoGen(AutoGen):
>>> key = (Ma.MetaFile.File, self.Arch)
>>> if key in FfsCommand:
>>> Ma.CreateMakeFile(CreateModuleMakeFile, FfsCommand[key])
>>> else:
>>> Ma.CreateMakeFile(CreateModuleMakeFile)
>>> + self.CreateLibModuelDirs()
>>>
>>> + def CreateLibModuelDirs(self):
>>> # no need to create makefile for the platform more than once
>>> if self.IsMakeFileCreated:
>>> return
>>>
>>> # create library/module build dirs for platform diff --git
>>> a/BaseTools/Source/Python/AutoGen/WorkspaceAutoGen.py
>>> b/BaseTools/Source/Python/AutoGen/WorkspaceAutoGen.py
>>> index 24942674721f..f9d2c216169c 100644
>>> --- a/BaseTools/Source/Python/AutoGen/WorkspaceAutoGen.py
>>> +++ b/BaseTools/Source/Python/AutoGen/WorkspaceAutoGen.py
>>> @@ -126,11 +126,10 @@ class WorkspaceAutoGen(AutoGen):
>>> self._CheckPcdDefineAndType()
>>>
>>> self.CreateBuildOptionsFile()
>>> self.CreatePcdTokenNumberFile()
>>> self.CreateModuleHashInfo()
>>> - GlobalData.gAutoGenPhase = False
>>>
>>> #
>>> # Merge Arch
>>> #
>>> def MergeArch(self):
>>> diff --git a/BaseTools/Source/Python/build/build.py
>>> b/BaseTools/Source/Python/build/build.py
>>> index 0406ac314b65..db57c3e526da 100755
>>> --- a/BaseTools/Source/Python/build/build.py
>>> +++ b/BaseTools/Source/Python/build/build.py
>>> @@ -52,10 +52,13 @@ from PatchPcdValue.PatchPcdValue import
>>> PatchBinaryFile
>>>
>>> import Common.GlobalData as GlobalData from GenFds.GenFds import
>>> GenFds, GenFdsApi import multiprocessing as mp from multiprocessing
>>> import Manager
>>> +from AutoGen.DataPipe import MemoryDataPipe from
>>> +AutoGen.ModuleAutoGenHelper import WorkSpaceInfo, PlatformInfo
>>from
>>> +GenFds.FdfParser import FdfParser
>>>
>>>
>>> ## standard targets of build command
>>> gSupportedTarget = ['all', 'genc', 'genmake', 'modules', 'libraries',
>>> 'fds', 'clean', 'cleanall', 'cleanlib', 'run']
>>>
>>> @@ -837,11 +840,11 @@ class Build():
>>> for PcdMa in PcdMaList:
>>> if GlobalData.gBinCacheSource and self.Target in [None, "", "all"]:
>>> PcdMa.GenModuleFilesHash(share_data)
>>> PcdMa.GenPreMakefileHash(share_data)
>>> if PcdMa.CanSkipbyPreMakefileCache(share_data):
>>> - continue
>>> + continue
>>>
>>> PcdMa.CreateCodeFile(False)
>>> PcdMa.CreateMakeFile(False,GenFfsList =
>>> DataPipe.Get("FfsCommand").get((PcdMa.MetaFile.File,
>>> PcdMa.Arch),[]))
>>>
>>> if GlobalData.gBinCacheSource and self.Target in [None, "", "all"]:
>>> @@ -1218,18 +1221,28 @@ class Build():
>>> mqueue = mp.Queue()
>>> for m in AutoGenObject.GetAllModuleInfo:
>>> mqueue.put(m)
>>>
>>> AutoGenObject.DataPipe.DataContainer = {"CommandTarget":
>>> self.Target}
>>> + AutoGenObject.DataPipe.DataContainer =
>{"Workspace_timestamp":
>>AutoGenObject.Workspace._SrcTimeStamp}
>>> + AutoGenObject.CreateLibModuelDirs()
>>> + AutoGenObject.DataPipe.DataContainer =
>>{"LibraryBuildDirectoryList":AutoGenObject.LibraryBuildDirectoryList}
>>> + AutoGenObject.DataPipe.DataContainer =
>>{"ModuleBuildDirectoryList":AutoGenObject.ModuleBuildDirectoryList}
>>> + AutoGenObject.DataPipe.DataContainer = {"FdsCommandDict":
>>> + AutoGenObject.Workspace.GenFdsCommandDict}
>>> self.Progress.Start("Generating makefile and code")
>>> data_pipe_file = os.path.join(AutoGenObject.BuildDir,
>>> "GlobalVar_%s_%s.bin" %
>>> (str(AutoGenObject.Guid),AutoGenObject.Arch))
>>> AutoGenObject.DataPipe.dump(data_pipe_file)
>>> autogen_rt,errorcode = self.StartAutoGen(mqueue,
>>> AutoGenObject.DataPipe, self.SkipAutoGen, PcdMaList,
>>> GlobalData.gCacheIR)
>>> + AutoGenIdFile =
>>os.path.join(GlobalData.gConfDirectory,".AutoGenIdFile.txt")
>>> + with open(AutoGenIdFile,"w") as fw:
>>> + fw.write("Arch=%s\n" %
>>"|".join((AutoGenObject.Workspace.ArchList)))
>>> + fw.write("BuildDir=%s\n" % AutoGenObject.Workspace.BuildDir)
>>> + fw.write("PlatformGuid=%s\n" %
>>> + str(AutoGenObject.Guid))
>>> self.Progress.Stop("done!")
>>> if not autogen_rt:
>>> self.AutoGenMgr.TerminateWorkers()
>>> - self.AutoGenMgr.join(0.1)
>>> + self.AutoGenMgr.join(1)
>>> raise FatalError(errorcode)
>>> AutoGenObject.CreateCodeFile(False)
>>> AutoGenObject.CreateMakeFile(False)
>>> else:
>>> # always recreate top/platform makefile when clean, just
>>> in case of inconsistency @@ -1778,10 +1791,11 @@ class Build():
>>> self._CollectFvMapBuffer(MapBuffer, Wa, ModuleList)
>>> #
>>> # Save MAP buffer into MAP file.
>>> #
>>> self._SaveMapFile (MapBuffer, Wa)
>>> + self.CreateGuidedSectionToolsFile(Wa)
>>>
>>> ## Build active module for different build targets, different tool chains
>>and different archs
>>> #
>>> def _BuildModule(self):
>>> for BuildTarget in self.BuildTargetList:
>>> @@ -1852,13 +1866,13 @@ class Build():
>>>
>>> if GlobalData.gBinCacheSource and self.Target in [None, "",
>>"all"]:
>>> Ma.GenModuleFilesHash(GlobalData.gCacheIR)
>>> Ma.GenPreMakefileHash(GlobalData.gCacheIR)
>>> if Ma.CanSkipbyPreMakefileCache(GlobalData.gCacheIR):
>>> - self.HashSkipModules.append(Ma)
>>> - EdkLogger.quiet("cache hit: %s[%s]" %
>(Ma.MetaFile.Path,
>>Ma.Arch))
>>> - continue
>>> + self.HashSkipModules.append(Ma)
>>> + EdkLogger.quiet("cache hit: %s[%s]" %
>>(Ma.MetaFile.Path, Ma.Arch))
>>> + continue
>>>
>>> # Not to auto-gen for targets 'clean', 'cleanlib', 'cleanall', 'run',
>>'fds'
>>> if self.Target not in ['clean', 'cleanlib', 'cleanall', 'run', 'fds']:
>>> # for target which must generate AutoGen code and
>>makefile
>>> if not self.SkipAutoGen or self.Target == 'genc':
>>> @@ -1987,125 +2001,221 @@ class Build():
>>> GenFfsDict = GenFds.GenFfsMakefile('', GlobalData.gFdfParser, self,
>>ArchList, GlobalData)
>>> for Cmd in GenFfsDict:
>>> tmpInf, tmpArch = GenFfsDict[Cmd]
>>> CmdSetDict[tmpInf, tmpArch].add(Cmd)
>>> return CmdSetDict
>>> + def VerifyAutoGenFiles(self):
>>> + AutoGenIdFile =
>>os.path.join(GlobalData.gConfDirectory,".AutoGenIdFile.txt")
>>> + try:
>>> + with open(AutoGenIdFile) as fd:
>>> + lines = fd.readlines()
>>> + except:
>>> + return None
>>> + for line in lines:
>>> + if "Arch" in line:
>>> + ArchList = line.strip().split("=")[1].split("|")
>>> + if "BuildDir" in line:
>>> + BuildDir = line.split("=")[1].strip()
>>> + if "PlatformGuid" in line:
>>> + PlatformGuid = line.split("=")[1].strip()
>>> + GlobalVarList = []
>>> + for arch in ArchList:
>>> + global_var = os.path.join(BuildDir, "GlobalVar_%s_%s.bin" %
>>(str(PlatformGuid),arch))
>>> + if not os.path.exists(global_var):
>>> + return None
>>> + GlobalVarList.append(global_var)
>>> + for global_var in GlobalVarList:
>>> + data_pipe = MemoryDataPipe()
>>> + data_pipe.load(global_var)
>>> + target = data_pipe.Get("P_Info").get("Target")
>>> + toolchain = data_pipe.Get("P_Info").get("ToolChain")
>>> + archlist = data_pipe.Get("P_Info").get("ArchList")
>>> + Arch = data_pipe.Get("P_Info").get("Arch")
>>> + active_p = data_pipe.Get("P_Info").get("ActivePlatform")
>>> + workspacedir = data_pipe.Get("P_Info").get("WorkspaceDir")
>>> + PackagesPath = os.getenv("PACKAGES_PATH")
>>> + mws.setWs(workspacedir, PackagesPath)
>>> + LibraryBuildDirectoryList =
>data_pipe.Get("LibraryBuildDirectoryList")
>>> + ModuleBuildDirectoryList =
>>> + data_pipe.Get("ModuleBuildDirectoryList")
>>> +
>>> + for m_build_dir in LibraryBuildDirectoryList:
>>> + if not
>>os.path.exists(os.path.join(m_build_dir,GenMake.BuildFile._FILE_NAME_[G
>e
>>nMake.gMakeType])):
>>> + return None
>>> + for m_build_dir in ModuleBuildDirectoryList:
>>> + if not
>>os.path.exists(os.path.join(m_build_dir,GenMake.BuildFile._FILE_NAME_[G
>e
>>nMake.gMakeType])):
>>> + return None
>>> + Wa = WorkSpaceInfo(
>>> + workspacedir,active_p,target,toolchain,archlist
>>> + )
>>> + Pa = PlatformInfo(Wa, active_p, target, toolchain, Arch,data_pipe)
>>> + Wa.AutoGenObjectList.append(Pa)
>>> + return Wa
>>> + def SetupMakeSetting(self,Wa):
>>> + BuildModules = []
>>> + for Pa in Wa.AutoGenObjectList:
>>> + for m in Pa._MbList:
>>> + ma = ModuleAutoGen(Wa,m.MetaFile, Pa.BuildTarget,
>>Wa.ToolChain, Pa.Arch, Pa.MetaFile,Pa.DataPipe)
>>> + BuildModules.append(ma)
>>> + fdf_file = Wa.FlashDefinition
>>> + if fdf_file:
>>> + Fdf = FdfParser(fdf_file.Path)
>>> + Fdf.ParseFile()
>>> + GlobalData.gFdfParser = Fdf
>>> + if Fdf.CurrentFdName and Fdf.CurrentFdName in Fdf.Profile.FdDict:
>>> + FdDict = Fdf.Profile.FdDict[Fdf.CurrentFdName]
>>> + for FdRegion in FdDict.RegionList:
>>> + if str(FdRegion.RegionType) is 'FILE' and
>>self.Platform.VpdToolGuid in str(FdRegion.RegionDataList):
>>> + if int(FdRegion.Offset) % 8 != 0:
>>> + EdkLogger.error("build", FORMAT_INVALID,
>>> + 'The VPD Base Address %s must be 8-byte aligned.' %
>>> (FdRegion.Offset))
>>> + Wa.FdfProfile = Fdf.Profile
>>> + self.Fdf = Fdf
>>> + else:
>>> + self.Fdf = None
>>> + return BuildModules
>>>
>>> ## Build a platform in multi-thread mode
>>> #
>>> - def _MultiThreadBuildPlatform(self):
>>> - SaveFileOnChange(self.PlatformBuildPath, '# DO NOT EDIT \n# FILE
>>auto-generated\n', False)
>>> - for BuildTarget in self.BuildTargetList:
>>> - GlobalData.gGlobalDefines['TARGET'] = BuildTarget
>>> - index = 0
>>> - for ToolChain in self.ToolChainList:
>>> - WorkspaceAutoGenTime = time.time()
>>> - GlobalData.gGlobalDefines['TOOLCHAIN'] = ToolChain
>>> - GlobalData.gGlobalDefines['TOOL_CHAIN_TAG'] = ToolChain
>>> - GlobalData.gGlobalDefines['FAMILY'] = self.ToolChainFamily[index]
>>> - index += 1
>>> - Wa = WorkspaceAutoGen(
>>> - self.WorkspaceDir,
>>> - self.PlatformFile,
>>> - BuildTarget,
>>> - ToolChain,
>>> - self.ArchList,
>>> - self.BuildDatabase,
>>> - self.TargetTxt,
>>> - self.ToolDef,
>>> - self.Fdf,
>>> - self.FdList,
>>> - self.FvList,
>>> - self.CapList,
>>> - self.SkuId,
>>> - self.UniFlag,
>>> - self.Progress
>>> - )
>>> - self.Fdf = Wa.FdfFile
>>> - self.LoadFixAddress = Wa.Platform.LoadFixAddress
>>> - self.BuildReport.AddPlatformReport(Wa)
>>> - Wa.CreateMakeFile(False)
>>> + def PerformAutoGen(self,BuildTarget,ToolChain):
>>> + WorkspaceAutoGenTime = time.time()
>>> + Wa = WorkspaceAutoGen(
>>> + self.WorkspaceDir,
>>> + self.PlatformFile,
>>> + BuildTarget,
>>> + ToolChain,
>>> + self.ArchList,
>>> + self.BuildDatabase,
>>> + self.TargetTxt,
>>> + self.ToolDef,
>>> + self.Fdf,
>>> + self.FdList,
>>> + self.FvList,
>>> + self.CapList,
>>> + self.SkuId,
>>> + self.UniFlag,
>>> + self.Progress
>>> + )
>>> + self.Fdf = Wa.FdfFile
>>> + self.LoadFixAddress = Wa.Platform.LoadFixAddress
>>> + self.BuildReport.AddPlatformReport(Wa)
>>> + Wa.CreateMakeFile(False)
>>>
>>> # Add ffs build to makefile
>>> - CmdListDict = {}
>>> - if GlobalData.gEnableGenfdsMultiThread and self.Fdf:
>>> - CmdListDict = self._GenFfsCmd(Wa.ArchList)
>>> + CmdListDict = {}
>>> + if GlobalData.gEnableGenfdsMultiThread and self.Fdf:
>>> + CmdListDict = self._GenFfsCmd(Wa.ArchList)
>>>
>>> - # Add Platform and Package level hash in share_data for module
>>hash calculation later
>>> - if GlobalData.gBinCacheSource or GlobalData.gBinCacheDest:
>>> - GlobalData.gCacheIR[('PlatformHash')] =
>>GlobalData.gPlatformHash
>>> - for PkgName in GlobalData.gPackageHash.keys():
>>> - GlobalData.gCacheIR[(PkgName, 'PackageHash')] =
>>GlobalData.gPackageHash[PkgName]
>>> + # Add Platform and Package level hash in share_data for module hash
>>calculation later
>>> + if GlobalData.gBinCacheSource or GlobalData.gBinCacheDest:
>>> + GlobalData.gCacheIR[('PlatformHash')] = GlobalData.gPlatformHash
>>> + for PkgName in GlobalData.gPackageHash.keys():
>>> + GlobalData.gCacheIR[(PkgName, 'PackageHash')] =
>>> + GlobalData.gPackageHash[PkgName]
>>>
>>> - # multi-thread exit flag
>>> - ExitFlag = threading.Event()
>>> - ExitFlag.clear()
>>> - self.AutoGenTime += int(round((time.time() -
>>WorkspaceAutoGenTime)))
>>> - self.BuildModules = []
>>> - TotalModules = []
>>> - for Arch in Wa.ArchList:
>>> - PcdMaList = []
>>> - AutoGenStart = time.time()
>>> - GlobalData.gGlobalDefines['ARCH'] = Arch
>>> - Pa = PlatformAutoGen(Wa, self.PlatformFile, BuildTarget,
>>ToolChain, Arch)
>>> - if Pa is None:
>>> - continue
>>> - ModuleList = []
>>> - for Inf in Pa.Platform.Modules:
>>> - ModuleList.append(Inf)
>>> + self.AutoGenTime += int(round((time.time() -
>>WorkspaceAutoGenTime)))
>>> + BuildModules = []
>>> + TotalModules = []
>>> + for Arch in Wa.ArchList:
>>> + PcdMaList = []
>>> + AutoGenStart = time.time()
>>> + GlobalData.gGlobalDefines['ARCH'] = Arch
>>> + Pa = PlatformAutoGen(Wa, self.PlatformFile, BuildTarget, ToolChain,
>>Arch)
>>> + if Pa is None:
>>> + continue
>>> + ModuleList = []
>>> + for Inf in Pa.Platform.Modules:
>>> + ModuleList.append(Inf)
>>> # Add the INF only list in FDF
>>> - if GlobalData.gFdfParser is not None:
>>> - for InfName in GlobalData.gFdfParser.Profile.InfList:
>>> - Inf = PathClass(NormPath(InfName), self.WorkspaceDir,
>Arch)
>>> - if Inf in Pa.Platform.Modules:
>>> - continue
>>> - ModuleList.append(Inf)
>>> - Pa.DataPipe.DataContainer = {"FfsCommand":CmdListDict}
>>> - Pa.DataPipe.DataContainer = {"Workspace_timestamp":
>>Wa._SrcTimeStamp}
>>> - Pa.DataPipe.DataContainer = {"CommandTarget": self.Target}
>>> - for Module in ModuleList:
>>> + if GlobalData.gFdfParser is not None:
>>> + for InfName in GlobalData.gFdfParser.Profile.InfList:
>>> + Inf = PathClass(NormPath(InfName), self.WorkspaceDir, Arch)
>>> + if Inf in Pa.Platform.Modules:
>>> + continue
>>> + ModuleList.append(Inf)
>>> + Pa.DataPipe.DataContainer = {"FfsCommand":CmdListDict}
>>> + Pa.DataPipe.DataContainer = {"Workspace_timestamp":
>>Wa._SrcTimeStamp}
>>> + Pa.DataPipe.DataContainer = {"CommandTarget": self.Target}
>>> + Pa.CreateLibModuelDirs()
>>> + Pa.DataPipe.DataContainer =
>>{"LibraryBuildDirectoryList":Pa.LibraryBuildDirectoryList}
>>> + Pa.DataPipe.DataContainer =
>>{"ModuleBuildDirectoryList":Pa.ModuleBuildDirectoryList}
>>> + Pa.DataPipe.DataContainer = {"FdsCommandDict":
>>Wa.GenFdsCommandDict}
>>> + ModuleCodaFile = {}
>>> + for ma in Pa.ModuleAutoGenList:
>>> +
>>> +
>ModuleCodaFile[(ma.MetaFile.File,ma.MetaFile.Root,ma.Arch,ma.MetaFil
>>> + e.Path)] = [item.Target for item in
>>> ma.CodaTargetList]
>>> + Pa.DataPipe.DataContainer = {"ModuleCodaFile":ModuleCodaFile}
>>> + for Module in ModuleList:
>>> # Get ModuleAutoGen object to generate C code file and
>>makefile
>>> - Ma = ModuleAutoGen(Wa, Module, BuildTarget, ToolChain,
>>Arch, self.PlatformFile,Pa.DataPipe)
>>> + Ma = ModuleAutoGen(Wa, Module, BuildTarget,
>>> + ToolChain, Arch, self.PlatformFile,Pa.DataPipe)
>>>
>>> - if Ma is None:
>>> + if Ma is None:
>>> + continue
>>> + if Ma.PcdIsDriver:
>>> + Ma.PlatformInfo = Pa
>>> + Ma.Workspace = Wa
>>> + PcdMaList.append(Ma)
>>> + TotalModules.append(Ma)
>>> + # Initialize all modules in tracking to 'FAIL'
>>> + GlobalData.gModuleBuildTracking[Ma] = 'FAIL'
>>> +
>>> +
>>> + mqueue = mp.Queue()
>>> + for m in Pa.GetAllModuleInfo:
>>> + mqueue.put(m)
>>> + data_pipe_file = os.path.join(Pa.BuildDir, "GlobalVar_%s_%s.bin" %
>>(str(Pa.Guid),Pa.Arch))
>>> + Pa.DataPipe.dump(data_pipe_file)
>>> +
>>> + autogen_rt, errorcode = self.StartAutoGen(mqueue,
>>> + Pa.DataPipe, self.SkipAutoGen, PcdMaList,GlobalData.gCacheIR)
>>> +
>>> + # Skip cache hit modules
>>> + if GlobalData.gBinCacheSource:
>>> + for Ma in TotalModules:
>>> + if (Ma.MetaFile.Path, Ma.Arch) in GlobalData.gCacheIR and \
>>> + GlobalData.gCacheIR[(Ma.MetaFile.Path,
>>Ma.Arch)].PreMakeCacheHit:
>>> + self.HashSkipModules.append(Ma)
>>> + continue
>>> + if (Ma.MetaFile.Path, Ma.Arch) in GlobalData.gCacheIR and \
>>> + GlobalData.gCacheIR[(Ma.MetaFile.Path,
>>Ma.Arch)].MakeCacheHit:
>>> + self.HashSkipModules.append(Ma)
>>> continue
>>> - if Ma.PcdIsDriver:
>>> - Ma.PlatformInfo = Pa
>>> - Ma.Workspace = Wa
>>> - PcdMaList.append(Ma)
>>> - TotalModules.append(Ma)
>>> - # Initialize all modules in tracking to 'FAIL'
>>> - GlobalData.gModuleBuildTracking[Ma] = 'FAIL'
>>> + BuildModules.append(Ma)
>>> + else:
>>> + BuildModules.extend(TotalModules)
>>>
>>> - mqueue = mp.Queue()
>>> - for m in Pa.GetAllModuleInfo:
>>> - mqueue.put(m)
>>> - data_pipe_file = os.path.join(Pa.BuildDir,
>>"GlobalVar_%s_%s.bin" % (str(Pa.Guid),Pa.Arch))
>>> - Pa.DataPipe.dump(data_pipe_file)
>>> - autogen_rt, errorcode = self.StartAutoGen(mqueue,
>Pa.DataPipe,
>>self.SkipAutoGen, PcdMaList,
>>> GlobalData.gCacheIR)
>>> + if not autogen_rt:
>>> + self.AutoGenMgr.TerminateWorkers()
>>> + self.AutoGenMgr.join(1)
>>> + raise FatalError(errorcode)
>>> + self.AutoGenTime += int(round((time.time() - AutoGenStart)))
>>> + AutoGenIdFile =
>>os.path.join(GlobalData.gConfDirectory,".AutoGenIdFile.txt")
>>> + with open(AutoGenIdFile,"w") as fw:
>>> + fw.write("Arch=%s\n" % "|".join((Wa.ArchList)))
>>> + fw.write("BuildDir=%s\n" % Wa.BuildDir)
>>> + fw.write("PlatformGuid=%s\n" %
>>str(Wa.AutoGenObjectList[0].Guid))
>>> + self.Progress.Stop("done!")
>>> + return Wa, BuildModules
>>>
>>> - # Skip cache hit modules
>>> - if GlobalData.gBinCacheSource:
>>> - for Ma in TotalModules:
>>> - if (Ma.MetaFile.Path, Ma.Arch) in GlobalData.gCacheIR and
>\
>>> - GlobalData.gCacheIR[(Ma.MetaFile.Path,
>>Ma.Arch)].PreMakeCacheHit:
>>> - self.HashSkipModules.append(Ma)
>>> - continue
>>> - if (Ma.MetaFile.Path, Ma.Arch) in GlobalData.gCacheIR and
>\
>>> - GlobalData.gCacheIR[(Ma.MetaFile.Path,
>>Ma.Arch)].MakeCacheHit:
>>> - self.HashSkipModules.append(Ma)
>>> - continue
>>> - self.BuildModules.append(Ma)
>>> + def _MultiThreadBuildPlatform(self):
>>> + SaveFileOnChange(self.PlatformBuildPath, '# DO NOT EDIT \n# FILE
>>auto-generated\n', False)
>>> + for BuildTarget in self.BuildTargetList:
>>> + GlobalData.gGlobalDefines['TARGET'] = BuildTarget
>>> + index = 0
>>> + for ToolChain in self.ToolChainList:
>>> + GlobalData.gGlobalDefines['TOOLCHAIN'] = ToolChain
>>> + GlobalData.gGlobalDefines['TOOL_CHAIN_TAG'] = ToolChain
>>> + GlobalData.gGlobalDefines['FAMILY'] =
>self.ToolChainFamily[index]
>>> + index += 1
>>> + ExitFlag = threading.Event()
>>> + ExitFlag.clear()
>>> + if self.SkipAutoGen:
>>> + Wa = self.VerifyAutoGenFiles()
>>> + if Wa is None:
>>> + Wa, self.BuildModules =
>>> + self.PerformAutoGen(BuildTarget,ToolChain)
>>> else:
>>> - self.BuildModules.extend(TotalModules)
>>> -
>>> - if not autogen_rt:
>>> - self.AutoGenMgr.TerminateWorkers()
>>> - self.AutoGenMgr.join(0.1)
>>> - raise FatalError(errorcode)
>>> - self.AutoGenTime += int(round((time.time() - AutoGenStart)))
>>> - self.Progress.Stop("done!")
>>> + GlobalData.gAutoGenPhase = True
>>> + self.BuildModules = self.SetupMakeSetting(Wa)
>>> + else:
>>> + Wa, self.BuildModules =
>>self.PerformAutoGen(BuildTarget,ToolChain)
>>> + Pa = Wa.AutoGenObjectList[0]
>>> + GlobalData.gAutoGenPhase = False
>>>
>>> if GlobalData.gBinCacheSource:
>>> EdkLogger.quiet("Total cache hit driver num: %s,
>>> cache miss driver num: %s" % (len(set(self.HashSkipModules)),
>>> len(set(self.BuildModules))))
>>> CacheHitMa = set()
>>> CacheNotHitMa = set() @@ -2136,18 +2246,17 @@
>>> class Build():
>>> # Start task scheduler
>>> if not BuildTask.IsOnGoing():
>>>
>>> BuildTask.StartScheduler(self.ThreadNumber, ExitFlag)
>>>
>>> # in case there's an interruption. we need a full version of
>>makefile for platform
>>> - Pa.CreateMakeFile(False)
>>> +
>>> if BuildTask.HasError():
>>> self.invalidateHash()
>>> EdkLogger.error("build", BUILD_ERROR, "Failed to build
>>module", ExtraData=GlobalData.gBuildingModule)
>>> self.MakeTime += int(round((time.time() -
>>> MakeStart)))
>>>
>>> MakeContiue = time.time()
>>> -
>>> #
>>> #
>>> # All modules have been put in build tasks queue. Tell task
>>scheduler
>>> # to exit if all tasks are completed
>>> #
>>> @@ -2175,17 +2284,12 @@ class Build():
>>> if (Arch == 'IA32' or Arch == 'ARM') and
>>> self.LoadFixAddress != 0xFFFFFFFFFFFFFFFF and self.LoadFixAddress >=
>>0x100000000:
>>> EdkLogger.error("build",
>>> PARAMETER_INVALID, "FIX_LOAD_TOP_MEMORY_ADDRESS can't be set
>to
>>larger than or equal to 4G for the platorm with IA32 or ARM arch modules")
>>> #
>>> # Get Module List
>>> #
>>> - ModuleList = {}
>>> - for Pa in Wa.AutoGenObjectList:
>>> - for Ma in Pa.ModuleAutoGenList:
>>> - if Ma is None:
>>> - continue
>>> - if not Ma.IsLibrary:
>>> - ModuleList[Ma.Guid.upper()] = Ma
>>> + ModuleList = {ma.Guid.upper():ma for ma in
>>> + self.BuildModules}
>>> +
>>> #
>>> # Rebase module to the preferred memory address before
>>GenFds
>>> #
>>> MapBuffer = []
>>> if self.LoadFixAddress != 0:
>>> @@ -2206,33 +2310,17 @@ class Build():
>>> self.GenFdsTime += int(round((time.time() - GenFdsStart)))
>>> #
>>> # Save MAP buffer into MAP file.
>>> #
>>> self._SaveMapFile(MapBuffer, Wa)
>>> + self.CreateGuidedSectionToolsFile(Wa)
>>> self.invalidateHash()
>>> -
>>> ## Generate GuidedSectionTools.txt in the FV directories.
>>> #
>>> - def CreateGuidedSectionToolsFile(self):
>>> + def CreateGuidedSectionToolsFile(self,Wa):
>>> for BuildTarget in self.BuildTargetList:
>>> for ToolChain in self.ToolChainList:
>>> - Wa = WorkspaceAutoGen(
>>> - self.WorkspaceDir,
>>> - self.PlatformFile,
>>> - BuildTarget,
>>> - ToolChain,
>>> - self.ArchList,
>>> - self.BuildDatabase,
>>> - self.TargetTxt,
>>> - self.ToolDef,
>>> - self.Fdf,
>>> - self.FdList,
>>> - self.FvList,
>>> - self.CapList,
>>> - self.SkuId,
>>> - self.UniFlag
>>> - )
>>> FvDir = Wa.FvDir
>>> if not os.path.exists(FvDir):
>>> continue
>>>
>>> for Arch in self.ArchList:
>>> @@ -2285,11 +2373,10 @@ class Build():
>>> if not self.SpawnMode or self.Target not in ["", "all"]:
>>> self.SpawnMode = False
>>> self._BuildPlatform()
>>> else:
>>> self._MultiThreadBuildPlatform()
>>> - self.CreateGuidedSectionToolsFile()
>>> else:
>>> self.SpawnMode = False
>>> self._BuildModule()
>>>
>>> if self.Target == 'cleanall':
>>> --
>>> 2.20.1.windows.1
>>>
>>>
>>>
>>
>>
>>
>
>
>
prev parent reply other threads:[~2019-09-09 7:15 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-09-05 9:04 [Patch 1/1] BaseTools: Fixed issue for IgnoreAutoGen Bob Feng
2019-09-05 13:11 ` [edk2-devel] " Liming Gao
2019-09-05 14:04 ` Bob Feng
[not found] ` <15C18FCC38905317.10639@groups.io>
2019-09-05 14:05 ` Bob Feng
2019-09-09 6:58 ` Liming Gao
[not found] ` <15C2B2E9C55F0B32.16248@groups.io>
2019-09-09 7:15 ` Liming Gao [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4A89E2EF3DFEDB4C8BFDE51014F606A14E4F4965@SHSMSX104.ccr.corp.intel.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox