]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/build/build.py
BaseTools: Remove './SecMain' from 'run' target
[mirror_edk2.git] / BaseTools / Source / Python / build / build.py
index 99e79d4dca768e0850abbe6e76108eb4108bf337..80ceb983104f6ecfa660942fd4a0a904e797f60d 100644 (file)
@@ -5,13 +5,7 @@
 #  Copyright (c) 2007 - 2019, Intel Corporation. All rights reserved.<BR>\r
 #  Copyright (c) 2018, Hewlett Packard Enterprise Development, L.P.<BR>\r
 #\r
-#  This program and the accompanying materials\r
-#  are licensed and made available under the terms and conditions of the BSD License\r
-#  which accompanies this distribution.  The full text of the license may be found at\r
-#  http://opensource.org/licenses/bsd-license.php\r
-#\r
-#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 #\r
 \r
 ##\r
@@ -599,7 +593,7 @@ class BuildTask:
     #\r
     def AddDependency(self, Dependency):\r
         for Dep in Dependency:\r
-            if not Dep.BuildObject.IsBinaryModule:\r
+            if not Dep.BuildObject.IsBinaryModule and not Dep.BuildObject.CanSkipbyHash():\r
                 self.DependencyList.append(BuildTask.New(Dep))    # BuildTask list\r
 \r
     ## The thread wrapper of LaunchCommand function\r
@@ -611,6 +605,11 @@ class BuildTask:
         try:\r
             self.BuildItem.BuildObject.BuildTime = LaunchCommand(Command, WorkingDir)\r
             self.CompleteFlag = True\r
+\r
+            # Run hash operation post dependency, to account for libs\r
+            if GlobalData.gUseHashCache and self.BuildItem.BuildObject.IsLibrary:\r
+                HashFile = path.join(self.BuildItem.BuildObject.BuildDir, self.BuildItem.BuildObject.Name + ".hash")\r
+                SaveFileOnChange(HashFile, self.BuildItem.BuildObject.GenModuleHash(), True)\r
         except:\r
             #\r
             # TRICK: hide the output of threads left running, so that the user can\r
@@ -626,6 +625,8 @@ class BuildTask:
             BuildTask._ErrorFlag.set()\r
             BuildTask._ErrorMessage = "%s broken\n    %s [%s]" % \\r
                                       (threading.currentThread().getName(), Command, WorkingDir)\r
+        if self.BuildItem.BuildObject in GlobalData.gModuleBuildTracking and not BuildTask._ErrorFlag.isSet():\r
+            GlobalData.gModuleBuildTracking[self.BuildItem.BuildObject] = True\r
         # indicate there's a thread is available for another build task\r
         BuildTask._RunningQueueLock.acquire()\r
         BuildTask._RunningQueue.pop(self.BuildItem)\r
@@ -719,6 +720,7 @@ class Build():
         GlobalData.gBinCacheDest   = BuildOptions.BinCacheDest\r
         GlobalData.gBinCacheSource = BuildOptions.BinCacheSource\r
         GlobalData.gEnableGenfdsMultiThread = BuildOptions.GenfdsMultiThread\r
+        GlobalData.gDisableIncludePathCheck = BuildOptions.DisableIncludePathCheck\r
 \r
         if GlobalData.gBinCacheDest and not GlobalData.gUseHashCache:\r
             EdkLogger.error("build", OPTION_NOT_SUPPORTED, ExtraData="--binary-destination must be used together with --hash.")\r
@@ -1143,6 +1145,37 @@ class Build():
             if Process.returncode != 0 :\r
                 EdkLogger.error("Postbuild", POSTBUILD_ERROR, 'Postbuild process is not success!')\r
             EdkLogger.info("\n- Postbuild Done -\n")\r
+\r
+    ## Error handling for hash feature\r
+    #\r
+    # On BuildTask error, iterate through the Module Build tracking\r
+    # dictionary to determine wheather a module failed to build. Invalidate\r
+    # the hash associated with that module by removing it from storage.\r
+    #\r
+    #\r
+    def invalidateHash(self):\r
+        # GlobalData.gModuleBuildTracking contains only modules that cannot be skipped by hash\r
+        for moduleAutoGenObj in GlobalData.gModuleBuildTracking.keys():\r
+            # False == FAIL : True == Success\r
+            # Skip invalidating for Successful module builds\r
+            if GlobalData.gModuleBuildTracking[moduleAutoGenObj] == True:\r
+                continue\r
+\r
+            # The module failed to build or failed to start building, from this point on\r
+\r
+            # Remove .hash from build\r
+            if GlobalData.gUseHashCache:\r
+                ModuleHashFile = path.join(moduleAutoGenObj.BuildDir, moduleAutoGenObj.Name + ".hash")\r
+                if os.path.exists(ModuleHashFile):\r
+                    os.remove(ModuleHashFile)\r
+\r
+            # Remove .hash file from cache\r
+            if GlobalData.gBinCacheDest:\r
+                FileDir = path.join(GlobalData.gBinCacheDest, moduleAutoGenObj.Arch, moduleAutoGenObj.SourceDir, moduleAutoGenObj.MetaFile.BaseName)\r
+                HashFile = path.join(FileDir, moduleAutoGenObj.Name + '.hash')\r
+                if os.path.exists(HashFile):\r
+                    os.remove(HashFile)\r
+\r
     ## Build a module or platform\r
     #\r
     # Create autogen code and makefile for a module or platform, and the launch\r
@@ -1199,10 +1232,6 @@ class Build():
 \r
         # run\r
         if Target == 'run':\r
-            RunDir = os.path.normpath(os.path.join(AutoGenObject.BuildDir, GlobalData.gGlobalDefines['ARCH']))\r
-            Command = '.\SecMain'\r
-            os.chdir(RunDir)\r
-            LaunchCommand(Command, RunDir)\r
             return True\r
 \r
         # build modules\r
@@ -1331,10 +1360,6 @@ class Build():
 \r
         # run\r
         if Target == 'run':\r
-            RunDir = os.path.normpath(os.path.join(AutoGenObject.BuildDir, GlobalData.gGlobalDefines['ARCH']))\r
-            Command = '.\SecMain'\r
-            os.chdir(RunDir)\r
-            LaunchCommand(Command, RunDir)\r
             return True\r
 \r
         # build library\r
@@ -1668,7 +1693,7 @@ class Build():
                 # Add ffs build to makefile\r
                 CmdListDict = {}\r
                 if GlobalData.gEnableGenfdsMultiThread and self.Fdf:\r
-                    CmdListDict = self._GenFfsCmd()\r
+                    CmdListDict = self._GenFfsCmd(Wa.ArchList)\r
 \r
                 for Arch in Wa.ArchList:\r
                     GlobalData.gGlobalDefines['ARCH'] = Arch\r
@@ -1761,7 +1786,7 @@ class Build():
                 # Add ffs build to makefile\r
                 CmdListDict = None\r
                 if GlobalData.gEnableGenfdsMultiThread and self.Fdf:\r
-                    CmdListDict = self._GenFfsCmd()\r
+                    CmdListDict = self._GenFfsCmd(Wa.ArchList)\r
                 self.Progress.Stop("done!")\r
                 MaList = []\r
                 ExitFlag = threading.Event()\r
@@ -1774,7 +1799,8 @@ class Build():
                     for Module in Pa.Platform.Modules:\r
                         if self.ModuleFile.Dir == Module.Dir and self.ModuleFile.Name == Module.Name:\r
                             Ma = ModuleAutoGen(Wa, Module, BuildTarget, ToolChain, Arch, self.PlatformFile)\r
-                            if Ma is None: continue\r
+                            if Ma is None:\r
+                                continue\r
                             MaList.append(Ma)\r
                             if Ma.CanSkipbyHash():\r
                                 self.HashSkipModules.append(Ma)\r
@@ -1799,6 +1825,9 @@ class Build():
                                 if self.Target == "genmake":\r
                                     return True\r
                             self.BuildModules.append(Ma)\r
+                            # Initialize all modules in tracking to False (FAIL)\r
+                            if Ma not in GlobalData.gModuleBuildTracking:\r
+                                GlobalData.gModuleBuildTracking[Ma] = False\r
                     self.AutoGenTime += int(round((time.time() - AutoGenStart)))\r
                     MakeStart = time.time()\r
                     for Ma in self.BuildModules:\r
@@ -1809,6 +1838,7 @@ class Build():
                             # we need a full version of makefile for platform\r
                             ExitFlag.set()\r
                             BuildTask.WaitForComplete()\r
+                            self.invalidateHash()\r
                             Pa.CreateMakeFile(False)\r
                             EdkLogger.error("build", BUILD_ERROR, "Failed to build module", ExtraData=GlobalData.gBuildingModule)\r
                         # Start task scheduler\r
@@ -1818,6 +1848,7 @@ class Build():
                     # in case there's an interruption. we need a full version of makefile for platform\r
                     Pa.CreateMakeFile(False)\r
                     if BuildTask.HasError():\r
+                        self.invalidateHash()\r
                         EdkLogger.error("build", BUILD_ERROR, "Failed to build module", ExtraData=GlobalData.gBuildingModule)\r
                     self.MakeTime += int(round((time.time() - MakeStart)))\r
 \r
@@ -1827,6 +1858,7 @@ class Build():
                 self.CreateAsBuiltInf()\r
                 self.MakeTime += int(round((time.time() - MakeContiue)))\r
                 if BuildTask.HasError():\r
+                    self.invalidateHash()\r
                     EdkLogger.error("build", BUILD_ERROR, "Failed to build module", ExtraData=GlobalData.gBuildingModule)\r
 \r
                 self.BuildReport.AddPlatformReport(Wa, MaList)\r
@@ -1880,11 +1912,11 @@ class Build():
                     #\r
                     self._SaveMapFile (MapBuffer, Wa)\r
 \r
-    def _GenFfsCmd(self):\r
+    def _GenFfsCmd(self,ArchList):\r
         # convert dictionary of Cmd:(Inf,Arch)\r
         # to a new dictionary of (Inf,Arch):Cmd,Cmd,Cmd...\r
         CmdSetDict = defaultdict(set)\r
-        GenFfsDict = GenFds.GenFfsMakefile('', GlobalData.gFdfParser, self, self.ArchList, GlobalData)\r
+        GenFfsDict = GenFds.GenFfsMakefile('', GlobalData.gFdfParser, self, ArchList, GlobalData)\r
         for Cmd in GenFfsDict:\r
             tmpInf, tmpArch = GenFfsDict[Cmd]\r
             CmdSetDict[tmpInf, tmpArch].add(Cmd)\r
@@ -1928,7 +1960,7 @@ class Build():
                 # Add ffs build to makefile\r
                 CmdListDict = None\r
                 if GlobalData.gEnableGenfdsMultiThread and self.Fdf:\r
-                    CmdListDict = self._GenFfsCmd()\r
+                    CmdListDict = self._GenFfsCmd(Wa.ArchList)\r
 \r
                 # multi-thread exit flag\r
                 ExitFlag = threading.Event()\r
@@ -1977,6 +2009,9 @@ class Build():
                             if self.Target == "genmake":\r
                                 continue\r
                         self.BuildModules.append(Ma)\r
+                        # Initialize all modules in tracking to False (FAIL)\r
+                        if Ma not in GlobalData.gModuleBuildTracking:\r
+                            GlobalData.gModuleBuildTracking[Ma] = False\r
                     self.Progress.Stop("done!")\r
                     self.AutoGenTime += int(round((time.time() - AutoGenStart)))\r
                     MakeStart = time.time()\r
@@ -1989,6 +2024,7 @@ class Build():
                             # we need a full version of makefile for platform\r
                             ExitFlag.set()\r
                             BuildTask.WaitForComplete()\r
+                            self.invalidateHash()\r
                             Pa.CreateMakeFile(False)\r
                             EdkLogger.error("build", BUILD_ERROR, "Failed to build module", ExtraData=GlobalData.gBuildingModule)\r
                         # Start task scheduler\r
@@ -1998,6 +2034,7 @@ class Build():
                     # in case there's an interruption. we need a full version of makefile for platform\r
                     Pa.CreateMakeFile(False)\r
                     if BuildTask.HasError():\r
+                        self.invalidateHash()\r
                         EdkLogger.error("build", BUILD_ERROR, "Failed to build module", ExtraData=GlobalData.gBuildingModule)\r
                     self.MakeTime += int(round((time.time() - MakeStart)))\r
 \r
@@ -2017,6 +2054,7 @@ class Build():
                 # has been signaled.\r
                 #\r
                 if BuildTask.HasError():\r
+                    self.invalidateHash()\r
                     EdkLogger.error("build", BUILD_ERROR, "Failed to build module", ExtraData=GlobalData.gBuildingModule)\r
 \r
                 # Create MAP file when Load Fix Address is enabled.\r
@@ -2148,10 +2186,21 @@ class Build():
             RemoveDirectory(os.path.dirname(GlobalData.gDatabasePath), True)\r
 \r
     def CreateAsBuiltInf(self):\r
+        all_lib_set = set()\r
+        all_mod_set = set()\r
         for Module in self.BuildModules:\r
             Module.CreateAsBuiltInf()\r
+            all_mod_set.add(Module)\r
         for Module in self.HashSkipModules:\r
             Module.CreateAsBuiltInf(True)\r
+            all_mod_set.add(Module)\r
+        for Module in all_mod_set:\r
+            for lib in Module.LibraryAutoGenList:\r
+                all_lib_set.add(lib)\r
+        for lib in all_lib_set:\r
+            lib.CreateAsBuiltInf(True)\r
+        all_lib_set.clear()\r
+        all_mod_set.clear()\r
         self.BuildModules = []\r
         self.HashSkipModules = []\r
     ## Do some clean-up works when error occurred\r
@@ -2268,6 +2317,7 @@ def MyOptionParser():
     Parser.add_option("--binary-destination", action="store", type="string", dest="BinCacheDest", help="Generate a cache of binary files in the specified directory.")\r
     Parser.add_option("--binary-source", action="store", type="string", dest="BinCacheSource", help="Consume a cache of binary files from the specified directory.")\r
     Parser.add_option("--genfds-multi-thread", action="store_true", dest="GenfdsMultiThread", default=False, help="Enable GenFds multi thread to generate ffs file.")\r
+    Parser.add_option("--disable-include-path-check", action="store_true", dest="DisableIncludePathCheck", default=False, help="Disable the include path check for outside of package.")\r
     (Opt, Args) = Parser.parse_args()\r
     return (Opt, Args)\r
 \r
@@ -2427,7 +2477,7 @@ def Main():
                     "\nbuild",\r
                     CODE_ERROR,\r
                     "Unknown fatal error when processing [%s]" % MetaFile,\r
-                    ExtraData="\n(Please send email to edk2-devel@lists.01.org for help, attaching following call stack trace!)\n",\r
+                    ExtraData="\n(Please send email to %s for help, attaching following call stack trace!)\n" % MSG_EDKII_MAIL_ADDR,\r
                     RaiseError=False\r
                     )\r
         EdkLogger.quiet("(Python %s on %s) " % (platform.python_version(), sys.platform) + traceback.format_exc())\r