## @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
##\r
# Import Modules\r
#\r
-import os\r
+import Common.LongFilePathOs as os\r
import re\r
import StringIO\r
import sys\r
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
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
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
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
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
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
#\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
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%-16s = %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
#\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
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
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
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
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
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
#\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
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
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
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
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
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
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
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
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
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
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
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
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
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
#\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
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