]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/build/build.py
BaseTools: Add a VPD report subsection of FLASH to the Report
[mirror_edk2.git] / BaseTools / Source / Python / build / build.py
index 9b48ac094bffe6868041587d09f71bc8eeda784f..6d83ac9701ba0dd92df254625a2674466d837bec 100644 (file)
@@ -41,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
@@ -104,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
@@ -151,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
@@ -182,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
@@ -198,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
@@ -748,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
@@ -772,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
@@ -796,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
@@ -1965,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
@@ -2035,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
@@ -2095,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