Liming Gao <liming....@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.f...@intel.com>; Gao, Liming
><liming....@intel.com>
>Cc: Shi, Steven <steven....@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....@intel.com>; devel@edk2.groups.io
>Cc: Shi, Steven <steven....@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.f...@intel.com>
>Cc: Shi, Steven <steven....@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....@intel.com>; Shi, Steven
>> <steven....@intel.com>; Feng, Bob C <bob.c.f...@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....@intel.com>
>> Cc: Steven Shi <steven....@intel.com>
>> Signed-off-by: Bob Feng <bob.c.f...@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_[Ge
>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_[Ge
>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
>>
>>
>>
>
>
>


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.

View/Reply Online (#47023): https://edk2.groups.io/g/devel/message/47023
Mute This Topic: https://groups.io/mt/33151466/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to