From: "Shi, Steven" <steven....@intel.com>

BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=1951

Current build cache use the module's [self.Arch][self.Name]
info as the ModuleAutoGen object key in hash list and dictionary.
The [self.Arch][self.Name] is not safe as the module key because
there could be two modules with same module name and arch name in
one platform. E.g. A platform can override a module or library
instance in another different path, the overriding module can has
the same module name and arch name as the original one.
Directly use the ModuleAutoGen obj self as the key, because
the obj __hash__ and __repr__ attributes already contain the
full path and arch name.

Cc: Liming Gao <liming....@intel.com>
Cc: Bob Feng <bob.c.f...@intel.com>
Signed-off-by: Steven Shi <steven....@intel.com>
---
 BaseTools/Source/Python/AutoGen/GenMake.py |  6 +-----
 BaseTools/Source/Python/build/build.py     | 48 
++++++++++++++++++++----------------------------
 2 files changed, 21 insertions(+), 33 deletions(-)

diff --git a/BaseTools/Source/Python/AutoGen/GenMake.py 
b/BaseTools/Source/Python/AutoGen/GenMake.py
index ce047e7f64..3e6ec4085c 100755
--- a/BaseTools/Source/Python/AutoGen/GenMake.py
+++ b/BaseTools/Source/Python/AutoGen/GenMake.py
@@ -959,16 +959,12 @@ cleanlib:
                 # Keep the file to be checked
                 headerFileDependencySet.add(aFileName)
 
-        # Ensure that gModuleBuildTracking has been initialized per 
architecture
-        if self._AutoGenObject.Arch not in GlobalData.gModuleBuildTracking:
-            GlobalData.gModuleBuildTracking[self._AutoGenObject.Arch] = dict()
-
         # Check if a module dependency header file is missing from the 
module's MetaFile
         for aFile in headerFileDependencySet:
             if aFile in headerFilesInMetaFileSet:
                 continue
             if GlobalData.gUseHashCache:
-                
GlobalData.gModuleBuildTracking[self._AutoGenObject.Arch][self._AutoGenObject] 
= 'FAIL_METAFILE'
+                GlobalData.gModuleBuildTracking[self._AutoGenObject] = 
'FAIL_METAFILE'
             EdkLogger.warn("build","Module MetaFile [Sources] is missing local 
header!",
                         ExtraData = "Local Header: " + aFile + " not found in 
" + self._AutoGenObject.MetaFile.Path
                         )
diff --git a/BaseTools/Source/Python/build/build.py 
b/BaseTools/Source/Python/build/build.py
index d7c817b95c..299fa64311 100755
--- a/BaseTools/Source/Python/build/build.py
+++ b/BaseTools/Source/Python/build/build.py
@@ -630,12 +630,11 @@ class BuildTask:
 
         # Set the value used by hash invalidation flow in 
GlobalData.gModuleBuildTracking to 'SUCCESS'
         # If Module or Lib is being tracked, it did not fail header check 
test, and built successfully
-        if (self.BuildItem.BuildObject.Arch in GlobalData.gModuleBuildTracking 
and
-           self.BuildItem.BuildObject in 
GlobalData.gModuleBuildTracking[self.BuildItem.BuildObject.Arch] and
-           
GlobalData.gModuleBuildTracking[self.BuildItem.BuildObject.Arch][self.BuildItem.BuildObject]
 != 'FAIL_METAFILE' and
+        if (self.BuildItem.BuildObject in GlobalData.gModuleBuildTracking and
+           GlobalData.gModuleBuildTracking[self.BuildItem.BuildObject] != 
'FAIL_METAFILE' and
            not BuildTask._ErrorFlag.isSet()
            ):
-            
GlobalData.gModuleBuildTracking[self.BuildItem.BuildObject.Arch][self.BuildItem.BuildObject]
 = 'SUCCESS'
+            GlobalData.gModuleBuildTracking[self.BuildItem.BuildObject] = 
'SUCCESS'
 
         # indicate there's a thread is available for another build task
         BuildTask._RunningQueueLock.acquire()
@@ -1171,25 +1170,24 @@ class Build():
             return
 
         # GlobalData.gModuleBuildTracking contains only modules or libs that 
cannot be skipped by hash
-        for moduleAutoGenObjArch in GlobalData.gModuleBuildTracking.keys():
-            for moduleAutoGenObj in 
GlobalData.gModuleBuildTracking[moduleAutoGenObjArch].keys():
-                # Skip invalidating for Successful Module/Lib builds
-                if 
GlobalData.gModuleBuildTracking[moduleAutoGenObjArch][moduleAutoGenObj] == 
'SUCCESS':
-                    continue
+        for Ma in GlobalData.gModuleBuildTracking:
+            # Skip invalidating for Successful Module/Lib builds
+            if GlobalData.gModuleBuildTracking[Ma] == 'SUCCESS':
+                continue
 
-                # The module failed to build, failed to start building, or 
failed the header check test from this point on
+            # The module failed to build, failed to start building, or failed 
the header check test from this point on
 
-                # Remove .hash from build
-                ModuleHashFile = os.path.join(moduleAutoGenObj.BuildDir, 
moduleAutoGenObj.Name + ".hash")
-                if os.path.exists(ModuleHashFile):
-                    os.remove(ModuleHashFile)
+            # Remove .hash from build
+            ModuleHashFile = os.path.join(Ma.BuildDir, Ma.Name + ".hash")
+            if os.path.exists(ModuleHashFile):
+                os.remove(ModuleHashFile)
 
-                # Remove .hash file from cache
-                if GlobalData.gBinCacheDest:
-                    FileDir = os.path.join(GlobalData.gBinCacheDest, 
moduleAutoGenObj.Arch, moduleAutoGenObj.SourceDir, 
moduleAutoGenObj.MetaFile.BaseName)
-                    HashFile = os.path.join(FileDir, moduleAutoGenObj.Name + 
'.hash')
-                    if os.path.exists(HashFile):
-                        os.remove(HashFile)
+            # Remove .hash file from cache
+            if GlobalData.gBinCacheDest:
+                FileDir = os.path.join(GlobalData.gBinCacheDest, 
Ma.PlatformInfo.OutputDir, Ma.BuildTarget + "_" + Ma.ToolChain, Ma.Arch, 
Ma.SourceDir, Ma.MetaFile.BaseName)
+                HashFile = os.path.join(FileDir, Ma.Name + '.hash')
+                if os.path.exists(HashFile):
+                    os.remove(HashFile)
 
     ## Build a module or platform
     #
@@ -1889,10 +1887,7 @@ class Build():
 
                             self.BuildModules.append(Ma)
                             # Initialize all modules in tracking to 'FAIL'
-                            if Ma.Arch not in GlobalData.gModuleBuildTracking:
-                                GlobalData.gModuleBuildTracking[Ma.Arch] = 
dict()
-                            if Ma not in 
GlobalData.gModuleBuildTracking[Ma.Arch]:
-                                GlobalData.gModuleBuildTracking[Ma.Arch][Ma] = 
'FAIL'
+                            GlobalData.gModuleBuildTracking[Ma] = 'FAIL'
                     self.AutoGenTime += int(round((time.time() - 
AutoGenStart)))
                     MakeStart = time.time()
                     for Ma in self.BuildModules:
@@ -2075,10 +2070,7 @@ class Build():
                             PcdMaList.append(Ma)
                         TotalModules.append(Ma)
                         # Initialize all modules in tracking to 'FAIL'
-                        if Ma.Arch not in GlobalData.gModuleBuildTracking:
-                            GlobalData.gModuleBuildTracking[Ma.Arch] = dict()
-                        if Ma not in GlobalData.gModuleBuildTracking[Ma.Arch]:
-                            GlobalData.gModuleBuildTracking[Ma.Arch][Ma] = 
'FAIL'
+                        GlobalData.gModuleBuildTracking[Ma] = 'FAIL'
 
                     mqueue = mp.Queue()
                     for m in Pa.GetAllModuleInfo:
-- 
2.17.1


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

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

Reply via email to