]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/build/build.py
MdeModulePkg/NvmExpressDxe: Fix wrong logic in GetControllerName()
[mirror_edk2.git] / BaseTools / Source / Python / build / build.py
index e9baf3465eaa8909aa3b685f6d0f3e98cc0469e4..6d83ac9701ba0dd92df254625a2674466d837bec 100644 (file)
@@ -1,7 +1,8 @@
 ## @file\r
 # build a platform or a module\r
 #\r
-#  Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR>\r
+#  Copyright (c) 2014, Hewlett-Packard Development Company, L.P.<BR>\r
+#  Copyright (c) 2007 - 2015, Intel Corporation. All rights reserved.<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
@@ -40,6 +41,7 @@ from Common.BuildVersion import gBUILD_VERSION
 from AutoGen.AutoGen import *\r
 from Common.BuildToolError import *\r
 from Workspace.WorkspaceDatabase import *\r
+from Common.MultipleWorkspace import MultipleWorkspace as mws\r
 \r
 from BuildReport import BuildReport\r
 from GenPatchPcdTable.GenPatchPcdTable import *\r
@@ -103,12 +105,16 @@ def CheckEnvVariable():
         EdkLogger.error("build", FORMAT_NOT_SUPPORTED, "No space is allowed in WORKSPACE path",\r
                         ExtraData=WorkspaceDir)\r
     os.environ["WORKSPACE"] = WorkspaceDir\r
+    \r
+    # set multiple workspace\r
+    PackagesPath = os.getenv("PACKAGES_PATH")\r
+    mws.setWs(WorkspaceDir, PackagesPath)\r
 \r
     #\r
     # Check EFI_SOURCE (Edk build convention). EDK_SOURCE will always point to ECP\r
     #\r
     if "ECP_SOURCE" not in os.environ:\r
-        os.environ["ECP_SOURCE"] = os.path.join(WorkspaceDir, GlobalData.gEdkCompatibilityPkg)\r
+        os.environ["ECP_SOURCE"] = mws.join(WorkspaceDir, GlobalData.gEdkCompatibilityPkg)\r
     if "EFI_SOURCE" not in os.environ:\r
         os.environ["EFI_SOURCE"] = os.environ["ECP_SOURCE"]\r
     if "EDK_SOURCE" not in os.environ:\r
@@ -150,16 +156,18 @@ def CheckEnvVariable():
         EdkLogger.error("build", FORMAT_NOT_SUPPORTED, "No space is allowed in EFI_SOURCE path",\r
                         ExtraData=EfiSourceDir)\r
 \r
-    # change absolute path to relative path to WORKSPACE\r
-    if EfiSourceDir.upper().find(WorkspaceDir.upper()) != 0:\r
-        EdkLogger.error("build", PARAMETER_INVALID, "EFI_SOURCE is not under WORKSPACE",\r
-                        ExtraData="WORKSPACE = %s\n    EFI_SOURCE = %s" % (WorkspaceDir, EfiSourceDir))\r
-    if EdkSourceDir.upper().find(WorkspaceDir.upper()) != 0:\r
-        EdkLogger.error("build", PARAMETER_INVALID, "EDK_SOURCE is not under WORKSPACE",\r
-                        ExtraData="WORKSPACE = %s\n    EDK_SOURCE = %s" % (WorkspaceDir, EdkSourceDir))\r
-    if EcpSourceDir.upper().find(WorkspaceDir.upper()) != 0:\r
-        EdkLogger.error("build", PARAMETER_INVALID, "ECP_SOURCE is not under WORKSPACE",\r
-                        ExtraData="WORKSPACE = %s\n    ECP_SOURCE = %s" % (WorkspaceDir, EcpSourceDir))\r
+    # check those variables on single workspace case\r
+    if not PackagesPath:\r
+        # change absolute path to relative path to WORKSPACE\r
+        if EfiSourceDir.upper().find(WorkspaceDir.upper()) != 0:\r
+            EdkLogger.error("build", PARAMETER_INVALID, "EFI_SOURCE is not under WORKSPACE",\r
+                            ExtraData="WORKSPACE = %s\n    EFI_SOURCE = %s" % (WorkspaceDir, EfiSourceDir))\r
+        if EdkSourceDir.upper().find(WorkspaceDir.upper()) != 0:\r
+            EdkLogger.error("build", PARAMETER_INVALID, "EDK_SOURCE is not under WORKSPACE",\r
+                            ExtraData="WORKSPACE = %s\n    EDK_SOURCE = %s" % (WorkspaceDir, EdkSourceDir))\r
+        if EcpSourceDir.upper().find(WorkspaceDir.upper()) != 0:\r
+            EdkLogger.error("build", PARAMETER_INVALID, "ECP_SOURCE is not under WORKSPACE",\r
+                            ExtraData="WORKSPACE = %s\n    ECP_SOURCE = %s" % (WorkspaceDir, EcpSourceDir))\r
 \r
     # check EDK_TOOLS_PATH\r
     if "EDK_TOOLS_PATH" not in os.environ:\r
@@ -181,7 +189,7 @@ def CheckEnvVariable():
     GlobalData.gGlobalDefines["EDK_SOURCE"] = EdkSourceDir\r
     GlobalData.gGlobalDefines["ECP_SOURCE"] = EcpSourceDir\r
     GlobalData.gGlobalDefines["EDK_TOOLS_PATH"] = os.environ["EDK_TOOLS_PATH"]\r
-\r
+    \r
 ## Get normalized file path\r
 #\r
 # Convert the path to be local format, and remove the WORKSPACE path at the\r
@@ -197,7 +205,8 @@ def NormFile(FilePath, Workspace):
     if os.path.isabs(FilePath):\r
         FileFullPath = os.path.normpath(FilePath)\r
     else:\r
-        FileFullPath = os.path.normpath(os.path.join(Workspace, FilePath))\r
+        FileFullPath = os.path.normpath(mws.join(Workspace, FilePath))\r
+        Workspace = mws.getWs(Workspace, FilePath)\r
 \r
     # check if the file path exists or not\r
     if not os.path.isfile(FileFullPath):\r
@@ -747,10 +756,10 @@ class Build():
             if not os.path.isabs(ConfDirectoryPath):\r
                 # Since alternate directory name is not absolute, the alternate directory is located within the WORKSPACE\r
                 # This also handles someone specifying the Conf directory in the workspace. Using --conf=Conf\r
-                ConfDirectoryPath = os.path.join(self.WorkspaceDir, ConfDirectoryPath)\r
+                ConfDirectoryPath = mws.join(self.WorkspaceDir, ConfDirectoryPath)\r
         else:\r
             # Get standard WORKSPACE/Conf use the absolute path to the WORKSPACE/Conf\r
-            ConfDirectoryPath = os.path.join(self.WorkspaceDir, 'Conf')\r
+            ConfDirectoryPath = mws.join(self.WorkspaceDir, 'Conf')\r
         GlobalData.gConfDirectory = ConfDirectoryPath\r
         GlobalData.gDatabasePath = os.path.normpath(os.path.join(ConfDirectoryPath, GlobalData.gDatabasePath))\r
 \r
@@ -771,10 +780,16 @@ class Build():
 \r
         # print current build environment and configuration\r
         EdkLogger.quiet("%-16s = %s" % ("WORKSPACE", os.environ["WORKSPACE"]))\r
+        if "PACKAGES_PATH" in os.environ:\r
+            # WORKSPACE env has been converted before. Print the same path style with WORKSPACE env. \r
+            EdkLogger.quiet("%-16s = %s" % ("PACKAGES_PATH", os.path.normcase(os.path.normpath(os.environ["PACKAGES_PATH"]))))\r
         EdkLogger.quiet("%-16s = %s" % ("ECP_SOURCE", os.environ["ECP_SOURCE"]))\r
         EdkLogger.quiet("%-16s = %s" % ("EDK_SOURCE", os.environ["EDK_SOURCE"]))\r
         EdkLogger.quiet("%-16s = %s" % ("EFI_SOURCE", os.environ["EFI_SOURCE"]))\r
         EdkLogger.quiet("%-16s = %s" % ("EDK_TOOLS_PATH", os.environ["EDK_TOOLS_PATH"]))\r
+        if "EDK_TOOLS_BIN" in os.environ:\r
+            # Print the same path style with WORKSPACE env. \r
+            EdkLogger.quiet("%-16s = %s" % ("EDK_TOOLS_BIN", os.path.normcase(os.path.normpath(os.environ["EDK_TOOLS_BIN"]))))\r
 \r
         EdkLogger.info("")\r
 \r
@@ -795,7 +810,7 @@ class Build():
             ToolDefinitionFile = self.TargetTxt.TargetTxtDictionary[DataType.TAB_TAT_DEFINES_TOOL_CHAIN_CONF]\r
             if ToolDefinitionFile == '':\r
                 ToolDefinitionFile = gToolsDefinition\r
-                ToolDefinitionFile = os.path.normpath(os.path.join(self.WorkspaceDir, 'Conf', ToolDefinitionFile))\r
+                ToolDefinitionFile = os.path.normpath(mws.join(self.WorkspaceDir, 'Conf', ToolDefinitionFile))\r
             if os.path.isfile(ToolDefinitionFile) == True:\r
                 StatusCode = self.ToolDef.LoadToolDefFile(ToolDefinitionFile)\r
             else:\r
@@ -931,14 +946,9 @@ class Build():
 \r
         makefile = GenMake.BuildFile(AutoGenObject)._FILE_NAME_[GenMake.gMakeType]\r
 \r
-        # genfds\r
-        if Target == 'fds':\r
-            LaunchCommand(AutoGenObject.GenFdsCommand, AutoGenObject.MakeFileDir)\r
-            return True\r
-\r
         # run\r
         if Target == 'run':\r
-            RunDir = os.path.normpath(os.path.join(AutoGenObject.BuildDir, 'IA32'))\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
@@ -997,11 +1007,6 @@ class Build():
             try:\r
                 #os.rmdir(AutoGenObject.BuildDir)\r
                 RemoveDirectory(AutoGenObject.BuildDir, True)\r
-                #\r
-                # First should close DB.\r
-                #\r
-                self.Db.Close()\r
-                RemoveDirectory(os.path.dirname(GlobalData.gDatabasePath), True)\r
             except WindowsError, X:\r
                 EdkLogger.error("build", FILE_DELETE_FAILURE, ExtraData=str(X))\r
         return True\r
@@ -1059,6 +1064,14 @@ class Build():
                                 (AutoGenObject.BuildTarget, AutoGenObject.ToolChain, AutoGenObject.Arch),\r
                             ExtraData=str(AutoGenObject))\r
 \r
+        # build modules\r
+        if BuildModule:\r
+            if Target != 'fds':\r
+                BuildCommand = BuildCommand + [Target]\r
+            LaunchCommand(BuildCommand, AutoGenObject.MakeFileDir)\r
+            self.CreateAsBuiltInf()\r
+            return True\r
+\r
         # genfds\r
         if Target == 'fds':\r
             LaunchCommand(AutoGenObject.GenFdsCommand, AutoGenObject.MakeFileDir)\r
@@ -1066,19 +1079,12 @@ class Build():
 \r
         # run\r
         if Target == 'run':\r
-            RunDir = os.path.normpath(os.path.join(AutoGenObject.BuildDir, 'IA32'))\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
-        BuildCommand = BuildCommand + [Target]\r
-        if BuildModule:\r
-            LaunchCommand(BuildCommand, AutoGenObject.MakeFileDir)\r
-            self.CreateAsBuiltInf()\r
-            return True\r
-\r
         # build library\r
         if Target == 'libraries':\r
             pass\r
@@ -1091,11 +1097,6 @@ class Build():
             try:\r
                 #os.rmdir(AutoGenObject.BuildDir)\r
                 RemoveDirectory(AutoGenObject.BuildDir, True)\r
-                #\r
-                # First should close DB.\r
-                #\r
-                self.Db.Close()\r
-                RemoveDirectory(os.path.dirname(GlobalData.gDatabasePath), True)\r
             except WindowsError, X:\r
                 EdkLogger.error("build", FILE_DELETE_FAILURE, ExtraData=str(X))\r
         return True\r
@@ -1463,12 +1464,11 @@ class Build():
                         # Rebase module to the preferred memory address before GenFds\r
                         #\r
                         self._CollectModuleMapBuffer(MapBuffer, ModuleList)\r
-                        if self.Fdf:\r
-                            #\r
-                            # create FDS again for the updated EFI image\r
-                            #\r
-                            self._Build("fds", Wa)\r
                     if self.Fdf:\r
+                        #\r
+                        # create FDS again for the updated EFI image\r
+                        #\r
+                        self._Build("fds", Wa)\r
                         #\r
                         # Create MAP file for all platform FVs after GenFds.\r
                         #\r
@@ -1558,10 +1558,10 @@ class Build():
                         # Rebase module to the preferred memory address before GenFds\r
                         #\r
                         self._CollectModuleMapBuffer(MapBuffer, ModuleList)\r
-                        #\r
-                        # create FDS again for the updated EFI image\r
-                        #\r
-                        self._Build("fds", Wa)\r
+                    #\r
+                    # create FDS again for the updated EFI image\r
+                    #\r
+                    self._Build("fds", Wa)\r
                     #\r
                     # Create MAP file for all platform FVs after GenFds.\r
                     #\r
@@ -1805,6 +1805,10 @@ class Build():
             self.SpawnMode = False\r
             self._BuildModule()\r
 \r
+        if self.Target == 'cleanall':\r
+            self.Db.Close()\r
+            RemoveDirectory(os.path.dirname(GlobalData.gDatabasePath), True)\r
+\r
     def CreateAsBuiltInf(self):\r
         for Module in self.BuildModules:\r
             Module.CreateAsBuiltInf()\r
@@ -1975,6 +1979,7 @@ def Main():
     EdkLogger.quiet(time.strftime("Build start time: %H:%M:%S, %b.%d %Y\n", time.localtime()));\r
     ReturnCode = 0\r
     MyBuild = None\r
+    BuildError = True\r
     try:\r
         if len(Target) == 0:\r
             Target = "all"\r
@@ -2045,6 +2050,10 @@ def Main():
             SqlCommand = """drop table IF EXISTS %s""" % TmpTableName\r
             TmpTableDict[TmpTableName].execute(SqlCommand)\r
         #MyBuild.DumpBuildData()\r
+        #\r
+        # All job done, no error found and no exception raised\r
+        #\r
+        BuildError = False\r
     except FatalError, X:\r
         if MyBuild != None:\r
             # for multi-thread build exits safely\r
@@ -2105,7 +2114,8 @@ def Main():
     else:\r
         BuildDurationStr = time.strftime("%H:%M:%S", BuildDuration)\r
     if MyBuild != None:\r
-        MyBuild.BuildReport.GenerateReport(BuildDurationStr)\r
+        if not BuildError:\r
+            MyBuild.BuildReport.GenerateReport(BuildDurationStr)\r
         MyBuild.Db.Close()\r
     EdkLogger.SetLevel(EdkLogger.QUIET)\r
     EdkLogger.quiet("\n- %s -" % Conclusion)\r