]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/build/build.py
There is a limitation on WINDOWS OS for the length of entire file path can’t be large...
[mirror_edk2.git] / BaseTools / Source / Python / build / build.py
index 0319103138bacfaa0d9e985549fd99c4f3e0201b..bd43f2cff1c73b4a9ea4caa9ad2b9c3aa9083765 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # build a platform or a module\r
 #\r
-#  Copyright (c) 2007 - 2011, Intel Corporation. All rights reserved.<BR>\r
+#  Copyright (c) 2007 - 2014, 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
@@ -15,7 +15,7 @@
 ##\r
 # Import Modules\r
 #\r
-import os\r
+import Common.LongFilePathOs as os\r
 import re\r
 import StringIO\r
 import sys\r
@@ -23,7 +23,7 @@ import glob
 import time\r
 import platform\r
 import traceback\r
-import encodings.ascii \r
+import encodings.ascii\r
 \r
 from struct import *\r
 from threading import *\r
@@ -31,6 +31,8 @@ from optparse import OptionParser
 from subprocess import *\r
 from Common import Misc as Utils\r
 \r
+from Common.LongFilePathSupport import OpenLongFilePath as open\r
+from Common.LongFilePathSupport import LongFilePath\r
 from Common.TargetTxtClassObject import *\r
 from Common.ToolDefClassObject import *\r
 from Common.DataType import *\r
@@ -47,9 +49,9 @@ import Common.EdkLogger
 import Common.GlobalData as GlobalData\r
 \r
 # Version and Copyright\r
-VersionNumber = "0.5" + ' ' + gBUILD_VERSION\r
+VersionNumber = "0.51" + ' ' + gBUILD_VERSION\r
 __version__ = "%prog Version " + VersionNumber\r
-__copyright__ = "Copyright (c) 2007 - 2010, Intel Corporation  All rights reserved."\r
+__copyright__ = "Copyright (c) 2007 - 2014, Intel Corporation  All rights reserved."\r
 \r
 ## standard targets of build command\r
 gSupportedTarget = ['all', 'genc', 'genmake', 'modules', 'libraries', 'fds', 'clean', 'cleanall', 'cleanlib', 'run']\r
@@ -59,6 +61,9 @@ gBuildConfiguration = "Conf/target.txt"
 gBuildCacheDir = "Conf/.cache"\r
 gToolsDefinition = "Conf/tools_def.txt"\r
 \r
+TemporaryTablePattern = re.compile(r'^_\d+_\d+_[a-fA-F0-9]+$')\r
+TmpTableDict = {}\r
+\r
 ## Check environment PATH variable to make sure the specified tool is found\r
 #\r
 #   If the tool is found in the PATH, then True is returned\r
@@ -116,12 +121,12 @@ def CheckEnvVariable():
     EfiSourceDir = os.path.normcase(os.path.normpath(os.environ["EFI_SOURCE"]))\r
     EdkSourceDir = os.path.normcase(os.path.normpath(os.environ["EDK_SOURCE"]))\r
     EcpSourceDir = os.path.normcase(os.path.normpath(os.environ["ECP_SOURCE"]))\r
\r
+\r
     os.environ["EFI_SOURCE"] = EfiSourceDir\r
     os.environ["EDK_SOURCE"] = EdkSourceDir\r
     os.environ["ECP_SOURCE"] = EcpSourceDir\r
     os.environ["EDK_TOOLS_PATH"] = os.path.normcase(os.environ["EDK_TOOLS_PATH"])\r
-    \r
+\r
     if not os.path.exists(EcpSourceDir):\r
         EdkLogger.verbose("ECP_SOURCE = %s doesn't exist. Edk modules could not be built." % EcpSourceDir)\r
     elif ' ' in EcpSourceDir:\r
@@ -310,7 +315,7 @@ class BuildUnit:
         if not BuildCommand:\r
             EdkLogger.error("build", OPTION_MISSING,\r
                             "No build command found for this module. "\r
-                            "Please check your setting of %s_%s_%s_MAKE_PATH in Conf/tools_def.txt file." % \r
+                            "Please check your setting of %s_%s_%s_MAKE_PATH in Conf/tools_def.txt file." %\r
                                 (Obj.BuildTarget, Obj.ToolChain, Obj.Arch),\r
                             ExtraData=str(Obj))\r
 \r
@@ -666,7 +671,7 @@ class PeImageInfo():
     #\r
     # Constructor will load all required image information.\r
     #\r
-    #   @param  BaseName          The full file path of image. \r
+    #   @param  BaseName          The full file path of image.\r
     #   @param  Guid              The GUID for image.\r
     #   @param  Arch              Arch of this image.\r
     #   @param  OutputDir         The output directory for image.\r
@@ -745,17 +750,8 @@ class Build():
         EdkLogger.quiet("%-16s = %s" % ("EDK_TOOLS_PATH", os.environ["EDK_TOOLS_PATH"]))\r
 \r
         EdkLogger.info("")\r
-        if self.ArchList:\r
-            EdkLogger.info('%-16s = %s' % ("Architecture(s)", ' '.join(self.ArchList)))\r
-        EdkLogger.info('%-16s = %s' % ("Build target", ' '.join(self.BuildTargetList)))\r
-        EdkLogger.info('%-16s = %s' % ("Toolchain", ' '.join(self.ToolChainList)))\r
-\r
-        #EdkLogger.info('\n%-24s = %s' % ("Active Platform", self.PlatformFile))\r
-        if self.ModuleFile:\r
-            EdkLogger.info('%-16s = %s' % ("Active Module", self.ModuleFile))\r
 \r
         os.chdir(self.WorkspaceDir)\r
-        self.Progress.Start("\nProcessing meta-data")\r
 \r
     ## Load configuration\r
     #\r
@@ -844,7 +840,7 @@ class Build():
     #\r
     def InitBuild(self):\r
         # parse target.txt, tools_def.txt, and platform file\r
-        self.LoadConfiguration()        \r
+        self.LoadConfiguration()\r
 \r
         # Allow case-insensitive for those from command line or configuration file\r
         ErrorCode, ErrorInfo = self.PlatformFile.Validate(".dsc", False)\r
@@ -903,7 +899,7 @@ class Build():
         if BuildCommand == None or len(BuildCommand) == 0:\r
             EdkLogger.error("build", OPTION_MISSING,\r
                             "No build command found for this module. "\r
-                            "Please check your setting of %s_%s_%s_MAKE_PATH in Conf/tools_def.txt file." % \r
+                            "Please check your setting of %s_%s_%s_MAKE_PATH in Conf/tools_def.txt file." %\r
                                 (AutoGenObject.BuildTarget, AutoGenObject.ToolChain, AutoGenObject.Arch),\r
                             ExtraData=str(AutoGenObject))\r
 \r
@@ -1000,9 +996,9 @@ class Build():
                 elif SectionHeader[0] in ['.data', '.sdata']:\r
                     DataSectionAddress = SectionHeader[1]\r
             if AddrIsOffset:\r
-                MapBuffer.write('(GUID=%s, .textbaseaddress=-0x%010X, .databaseaddress=-0x%010X)\n' % (ModuleInfo.Guid, 0 - (BaseAddress + TextSectionAddress), 0 - (BaseAddress + DataSectionAddress))) \r
+                MapBuffer.write('(GUID=%s, .textbaseaddress=-0x%010X, .databaseaddress=-0x%010X)\n' % (ModuleInfo.Guid, 0 - (BaseAddress + TextSectionAddress), 0 - (BaseAddress + DataSectionAddress)))\r
             else:\r
-                MapBuffer.write('(GUID=%s, .textbaseaddress=0x%010X, .databaseaddress=0x%010X)\n' % (ModuleInfo.Guid, BaseAddress + TextSectionAddress, BaseAddress + DataSectionAddress)) \r
+                MapBuffer.write('(GUID=%s, .textbaseaddress=0x%010X, .databaseaddress=0x%010X)\n' % (ModuleInfo.Guid, BaseAddress + TextSectionAddress, BaseAddress + DataSectionAddress))\r
             #\r
             # Add debug image full path.\r
             #\r
@@ -1034,7 +1030,7 @@ class Build():
                 FvMapBuffer = os.path.join(Wa.FvDir, FvName + '.Fv.map')\r
                 if not os.path.exists(FvMapBuffer):\r
                     continue\r
-                FvMap = open (FvMapBuffer, 'r')\r
+                FvMap = open(FvMapBuffer, 'r')\r
                 #skip FV size information\r
                 FvMap.readline()\r
                 FvMap.readline()\r
@@ -1082,7 +1078,7 @@ class Build():
         for ModuleGuid in ModuleList:\r
             Module = ModuleList[ModuleGuid]\r
             GlobalData.gProcessingFile = "%s [%s, %s, %s]" % (Module.MetaFile, Module.Arch, Module.ToolChain, Module.BuildTarget)\r
-            \r
+\r
             OutputImageFile = ''\r
             for ResultFile in Module.CodaTargetList:\r
                 if str(ResultFile.Target).endswith('.efi'):\r
@@ -1133,15 +1129,15 @@ class Build():
                         if Pcd.Type == TAB_PCDS_PATCHABLE_IN_MODULE and Pcd.TokenCName in TAB_PCDS_PATCHABLE_LOAD_FIX_ADDRESS_LIST:\r
                             ModuleIsPatch = True\r
                             break\r
-                \r
+\r
                 if not ModuleIsPatch:\r
                     continue\r
                 #\r
                 # Module includes the patchable load fix address PCDs.\r
-                # It will be fixed up later. \r
+                # It will be fixed up later.\r
                 #\r
                 PatchEfiImageList.append (OutputImageFile)\r
-        \r
+\r
         #\r
         # Get Top Memory address\r
         #\r
@@ -1161,14 +1157,14 @@ class Build():
         #\r
         # Patch FixAddress related PCDs into EFI image\r
         #\r
-        for EfiImage in PatchEfiImageList: \r
+        for EfiImage in PatchEfiImageList:\r
             EfiImageMap = EfiImage.replace('.efi', '.map')\r
             if not os.path.exists(EfiImageMap):\r
                 continue\r
             #\r
             # Get PCD offset in EFI image by GenPatchPcdTable function\r
             #\r
-            PcdTable = parsePcdInfoFromMapFile(EfiImageMap, EfiImage) \r
+            PcdTable = parsePcdInfoFromMapFile(EfiImageMap, EfiImage)\r
             #\r
             # Patch real PCD value by PatchPcdValue tool\r
             #\r
@@ -1184,16 +1180,16 @@ class Build():
                     ReturnValue, ErrorInfo = PatchBinaryFile (EfiImage, PcdInfo[1], TAB_PCDS_PATCHABLE_LOAD_FIX_ADDRESS_SMM_PAGE_SIZE_DATA_TYPE, str (SmmSize/0x1000))\r
                 if ReturnValue != 0:\r
                     EdkLogger.error("build", PARAMETER_INVALID, "Patch PCD value failed", ExtraData=ErrorInfo)\r
-        \r
+\r
         MapBuffer.write('PEI_CODE_PAGE_NUMBER      = 0x%x\n' % (PeiSize/0x1000))\r
         MapBuffer.write('BOOT_CODE_PAGE_NUMBER     = 0x%x\n' % (BtSize/0x1000))\r
         MapBuffer.write('RUNTIME_CODE_PAGE_NUMBER  = 0x%x\n' % (RtSize/0x1000))\r
         if len (SmmModuleList) > 0:\r
             MapBuffer.write('SMM_CODE_PAGE_NUMBER      = 0x%x\n' % (SmmSize/0x1000))\r
-        \r
-        PeiBaseAddr = TopMemoryAddress - RtSize - BtSize \r
+\r
+        PeiBaseAddr = TopMemoryAddress - RtSize - BtSize\r
         BtBaseAddr  = TopMemoryAddress - RtSize\r
-        RtBaseAddr  = TopMemoryAddress - ReservedRuntimeMemorySize \r
+        RtBaseAddr  = TopMemoryAddress - ReservedRuntimeMemorySize\r
 \r
         self._RebaseModule (MapBuffer, PeiBaseAddr, PeiModuleList, TopMemoryAddress == 0)\r
         self._RebaseModule (MapBuffer, BtBaseAddr, BtModuleList, TopMemoryAddress == 0)\r
@@ -1202,7 +1198,7 @@ class Build():
         MapBuffer.write('\n\n')\r
         sys.stdout.write ("\n")\r
         sys.stdout.flush()\r
-    \r
+\r
     ## Save platform Map file\r
     #\r
     def _SaveMapFile (self, MapBuffer, Wa):\r
@@ -1241,14 +1237,15 @@ class Build():
                         self.FvList,\r
                         self.CapList,\r
                         self.SkuId,\r
-                        self.UniFlag\r
+                        self.UniFlag,\r
+                        self.Progress\r
                         )\r
                 self.Fdf = Wa.FdfFile\r
                 self.LoadFixAddress = Wa.Platform.LoadFixAddress\r
                 self.BuildReport.AddPlatformReport(Wa)\r
                 self.Progress.Stop("done!")\r
                 self._Build(self.Target, Wa)\r
-                \r
+\r
                 # Create MAP file when Load Fix Address is enabled.\r
                 if self.Target in ["", "all", "fds"]:\r
                     for Arch in Wa.ArchList:\r
@@ -1297,7 +1294,7 @@ class Build():
             GlobalData.gGlobalDefines['TARGET'] = BuildTarget\r
             for ToolChain in self.ToolChainList:\r
                 GlobalData.gGlobalDefines['TOOLCHAIN'] = ToolChain\r
-                GlobalData.gGlobalDefines['TOOL_CHAIN_TAG'] = ToolChain             \r
+                GlobalData.gGlobalDefines['TOOL_CHAIN_TAG'] = ToolChain\r
                 #\r
                 # module build needs platform build information, so get platform\r
                 # AutoGen first\r
@@ -1316,7 +1313,9 @@ class Build():
                         self.FvList,\r
                         self.CapList,\r
                         self.SkuId,\r
-                        self.UniFlag\r
+                        self.UniFlag,\r
+                        self.Progress,\r
+                        self.ModuleFile\r
                         )\r
                 self.Fdf = Wa.FdfFile\r
                 self.LoadFixAddress = Wa.Platform.LoadFixAddress\r
@@ -1386,7 +1385,7 @@ class Build():
             GlobalData.gGlobalDefines['TARGET'] = BuildTarget\r
             for ToolChain in self.ToolChainList:\r
                 GlobalData.gGlobalDefines['TOOLCHAIN'] = ToolChain\r
-                GlobalData.gGlobalDefines['TOOL_CHAIN_TAG'] = ToolChain  \r
+                GlobalData.gGlobalDefines['TOOL_CHAIN_TAG'] = ToolChain\r
                 Wa = WorkspaceAutoGen(\r
                         self.WorkspaceDir,\r
                         self.PlatformFile,\r
@@ -1401,7 +1400,8 @@ class Build():
                         self.FvList,\r
                         self.CapList,\r
                         self.SkuId,\r
-                        self.UniFlag\r
+                        self.UniFlag,\r
+                        self.Progress\r
                         )\r
                 self.Fdf = Wa.FdfFile\r
                 self.LoadFixAddress = Wa.Platform.LoadFixAddress\r
@@ -1416,6 +1416,7 @@ class Build():
                     Pa = PlatformAutoGen(Wa, self.PlatformFile, BuildTarget, ToolChain, Arch)\r
                     if Pa == None:\r
                         continue\r
+                    pModules = []\r
                     for Module in Pa.Platform.Modules:\r
                         # Get ModuleAutoGen object to generate C code file and makefile\r
                         Ma = ModuleAutoGen(Wa, Module, BuildTarget, ToolChain, Arch, self.PlatformFile)\r
@@ -1434,7 +1435,10 @@ class Build():
                                 Ma.CreateAsBuiltInf()\r
                             if self.Target == "genmake":\r
                                 continue\r
-                        self.Progress.Stop("done!")\r
+                        pModules.append(Ma)\r
+                    self.Progress.Stop("done!")\r
+\r
+                    for Ma in pModules:\r
                         # Generate build task for the module\r
                         Bt = BuildTask.New(ModuleMakeUnit(Ma, self.Target))\r
                         # Break build if any build thread has error\r
@@ -1453,6 +1457,14 @@ class Build():
                     if BuildTask.HasError():\r
                         EdkLogger.error("build", BUILD_ERROR, "Failed to build module", ExtraData=GlobalData.gBuildingModule)\r
 \r
+                #\r
+                # Save temp tables to a TmpTableDict.\r
+                #\r
+                for Key in Wa.BuildDatabase._CACHE_:\r
+                    if Wa.BuildDatabase._CACHE_[Key]._RawData and Wa.BuildDatabase._CACHE_[Key]._RawData._Table and Wa.BuildDatabase._CACHE_[Key]._RawData._Table.Table:\r
+                        if TemporaryTablePattern.match(Wa.BuildDatabase._CACHE_[Key]._RawData._Table.Table):\r
+                            TmpTableDict[Wa.BuildDatabase._CACHE_[Key]._RawData._Table.Table] = Wa.BuildDatabase._CACHE_[Key]._RawData._Table.Cur\r
+                #\r
                 #\r
                 # All modules have been put in build tasks queue. Tell task scheduler\r
                 # to exit if all tasks are completed\r
@@ -1531,10 +1543,10 @@ class Build():
                 if not os.path.exists(FvDir):\r
                     continue\r
 \r
-                for Arch in self.ArchList:    \r
+                for Arch in self.ArchList:\r
                     # Build up the list of supported architectures for this build\r
                     prefix = '%s_%s_%s_' % (BuildTarget, ToolChain, Arch)\r
-    \r
+\r
                     # Look through the tool definitions for GUIDed tools\r
                     guidAttribs = []\r
                     for (attrib, value) in self.ToolDef.ToolsDefTxtDictionary.iteritems():\r
@@ -1549,7 +1561,7 @@ class Build():
                                 path = self.ToolDef.ToolsDefTxtDictionary[path]\r
                                 path = self.GetFullPathOfTool(path)\r
                                 guidAttribs.append((guid, toolName, path))\r
-    \r
+\r
                     # Write out GuidedSecTools.txt\r
                     toolsFile = os.path.join(FvDir, 'GuidedSectionTools.txt')\r
                     toolsFile = open(toolsFile, 'wt')\r
@@ -1626,7 +1638,7 @@ def ParseDefines(DefineList=[]):
                 EdkLogger.error('build', FORMAT_INVALID,\r
                                 "The macro name must be in the pattern [A-Z][A-Z0-9_]*",\r
                                 ExtraData=DefineTokenList[0])\r
-                \r
+\r
             if len(DefineTokenList) == 1:\r
                 DefineDict[DefineTokenList[0]] = "TRUE"\r
             else:\r
@@ -1650,14 +1662,14 @@ def SingleCheckCallback(option, opt_str, value, parser):
 #\r
 def MyOptionParser():\r
     Parser = OptionParser(description=__copyright__,version=__version__,prog="build.exe",usage="%prog [options] [all|fds|genc|genmake|clean|cleanall|cleanlib|modules|libraries|run]")\r
-    Parser.add_option("-a", "--arch", action="append", type="choice", choices=['IA32','X64','IPF','EBC','ARM'], dest="TargetArch",\r
-        help="ARCHS is one of list: IA32, X64, IPF, ARM or EBC, which overrides target.txt's TARGET_ARCH definition. To specify more archs, please repeat this option.")\r
+    Parser.add_option("-a", "--arch", action="append", type="choice", choices=['IA32','X64','IPF','EBC','ARM', 'AARCH64'], dest="TargetArch",\r
+        help="ARCHS is one of list: IA32, X64, IPF, ARM, AARCH64 or EBC, which overrides target.txt's TARGET_ARCH definition. To specify more archs, please repeat this option.")\r
     Parser.add_option("-p", "--platform", action="callback", type="string", dest="PlatformFile", callback=SingleCheckCallback,\r
         help="Build the platform specified by the DSC file name argument, overriding target.txt's ACTIVE_PLATFORM definition.")\r
     Parser.add_option("-m", "--module", action="callback", type="string", dest="ModuleFile", callback=SingleCheckCallback,\r
         help="Build the module specified by the INF file name argument.")\r
-    Parser.add_option("-b", "--buildtarget", action="append", type="choice", choices=['DEBUG','RELEASE','NOOPT'], dest="BuildTarget",\r
-        help="BuildTarget is one of list: DEBUG, RELEASE, NOOPT, which overrides target.txt's TARGET definition. To specify more TARGET, please repeat this option.")\r
+    Parser.add_option("-b", "--buildtarget", type="string", dest="BuildTarget", help="Using the TARGET to build the platform, overriding target.txt's TARGET definition.",\r
+                      action="append")\r
     Parser.add_option("-t", "--tagname", action="append", type="string", dest="ToolChain",\r
         help="Using the Tool Chain Tagname to build the platform, overriding target.txt's TOOL_CHAIN_TAG definition.")\r
     Parser.add_option("-x", "--sku-id", action="callback", type="string", dest="SkuId", callback=SingleCheckCallback,\r
@@ -1814,7 +1826,12 @@ def Main():
             EdkLogger.error("build", OPTION_VALUE_INVALID, "UNI flag must be one of -c or -s")\r
 \r
         MyBuild = Build(Target, Workspace, Option)\r
+        GlobalData.gCommandLineDefines['ARCH'] = ' '.join(MyBuild.ArchList)\r
         MyBuild.Launch()\r
+        # Drop temp tables to avoid database locked.\r
+        for TmpTableName in TmpTableDict:\r
+            SqlCommand = """drop table IF EXISTS %s""" % TmpTableName\r
+            TmpTableDict[TmpTableName].execute(SqlCommand)\r
         #MyBuild.DumpBuildData()\r
     except FatalError, X:\r
         if MyBuild != None:\r
@@ -1856,8 +1873,7 @@ def Main():
                     ExtraData="\n(Please send email to edk2-buildtools-devel@lists.sourceforge.net for help, attaching following call stack trace!)\n",\r
                     RaiseError=False\r
                     )\r
-        if Option != None and Option.debug != None:\r
-            EdkLogger.quiet("(Python %s on %s) " % (platform.python_version(), sys.platform) + traceback.format_exc())\r
+        EdkLogger.quiet("(Python %s on %s) " % (platform.python_version(), sys.platform) + traceback.format_exc())\r
         ReturnCode = CODE_ERROR\r
     finally:\r
         Utils.Progressor.Abort()\r