GlobalData.gEdkSource = EdkSourceDir\r
GlobalData.gEcpSource = EcpSourceDir\r
\r
+ GlobalData.gGlobalDefines["WORKSPACE"] = WorkspaceDir\r
+ GlobalData.gGlobalDefines["EFI_SOURCE"] = EfiSourceDir\r
+ GlobalData.gGlobalDefines["EDK_SOURCE"] = EdkSourceDir\r
+ GlobalData.gGlobalDefines["ECP_SOURCE"] = EcpSourceDir\r
+ GlobalData.gGlobalDefines["EDK_TOOLS_PATH"] = os.environ["EDK_TOOLS_PATH"]\r
+\r
## Get normalized file path\r
#\r
# Convert the path to be local format, and remove the WORKSPACE path at the\r
self.WorkingDir = WorkingDir\r
self.Target = Target\r
self.BuildCommand = BuildCommand\r
- if BuildCommand == None or len(BuildCommand) == 0:\r
- EdkLogger.error("build", OPTION_MISSING, "No build command found for",\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
+ (Obj.BuildTarget, Obj.ToolChain, Obj.Arch),\r
ExtraData=str(Obj))\r
\r
+\r
## str() method\r
#\r
# It just returns the string representation of self.BuildObject\r
#\r
# @param Target The build command target, one of gSupportedTarget\r
# @param WorkspaceDir The directory of workspace\r
- # @param Platform The DSC file of active platform\r
- # @param Module The INF file of active module, if any\r
- # @param Arch The Arch list of platform or module\r
- # @param ToolChain The name list of toolchain\r
- # @param BuildTarget The "DEBUG" or "RELEASE" build\r
- # @param FlashDefinition The FDF file of active platform\r
- # @param FdList=[] The FD names to be individually built\r
- # @param FvList=[] The FV names to be individually built\r
- # @param MakefileType The type of makefile (for MSFT make or GNU make)\r
- # @param SilentMode Indicate multi-thread build mode\r
- # @param ThreadNumber The maximum number of thread if in multi-thread build mode\r
- # @param SkipAutoGen Skip AutoGen step\r
- # @param Reparse Re-parse all meta files\r
- # @param SkuId SKU id from command line\r
- #\r
- def __init__(self, Target, WorkspaceDir, Platform, Module, Arch, ToolChain,\r
- BuildTarget, FlashDefinition, FdList=[], FvList=[], CapList=[],\r
- MakefileType="nmake", SilentMode=False, ThreadNumber=2,\r
- SkipAutoGen=False, Reparse=False, SkuId=None, \r
- ReportFile=None, ReportType=None, UniFlag=None):\r
-\r
- self.WorkspaceDir = WorkspaceDir\r
+ # @param BuildOptions Build options passed from command line\r
+ #\r
+ def __init__(self, Target, WorkspaceDir, BuildOptions):\r
+ self.WorkspaceDir = WorkspaceDir\r
self.Target = Target\r
- self.PlatformFile = Platform\r
- self.ModuleFile = Module\r
- self.ArchList = Arch\r
- self.ToolChainList = ToolChain\r
- self.BuildTargetList= BuildTarget\r
- self.Fdf = FlashDefinition\r
- self.FdList = FdList\r
- self.FvList = FvList\r
- self.CapList = CapList\r
- self.MakefileType = MakefileType\r
- self.SilentMode = SilentMode\r
- self.ThreadNumber = ThreadNumber\r
- self.SkipAutoGen = SkipAutoGen\r
- self.Reparse = Reparse\r
- self.SkuId = SkuId\r
+ self.PlatformFile = BuildOptions.PlatformFile\r
+ self.ModuleFile = BuildOptions.ModuleFile\r
+ self.ArchList = BuildOptions.TargetArch\r
+ self.ToolChainList = BuildOptions.ToolChain\r
+ self.BuildTargetList= BuildOptions.BuildTarget\r
+ self.Fdf = BuildOptions.FdfFile\r
+ self.FdList = BuildOptions.RomImage\r
+ self.FvList = BuildOptions.FvImage\r
+ self.CapList = BuildOptions.CapName\r
+ self.SilentMode = BuildOptions.SilentMode\r
+ self.ThreadNumber = BuildOptions.ThreadNumber\r
+ self.SkipAutoGen = BuildOptions.SkipAutoGen\r
+ self.Reparse = BuildOptions.Reparse\r
+ self.SkuId = BuildOptions.SkuId\r
self.SpawnMode = True\r
- self.BuildReport = BuildReport(ReportFile, ReportType)\r
+ self.BuildReport = BuildReport(BuildOptions.ReportFile, BuildOptions.ReportType)\r
self.TargetTxt = TargetTxtClassObject()\r
self.ToolDef = ToolDefClassObject()\r
- self.Db = WorkspaceDatabase(None, GlobalData.gGlobalDefines, self.Reparse)\r
- #self.Db = WorkspaceDatabase(None, {}, self.Reparse)\r
+ if BuildOptions.DisableCache:\r
+ self.Db = WorkspaceDatabase(":memory:")\r
+ else:\r
+ self.Db = WorkspaceDatabase(None, self.Reparse)\r
self.BuildDatabase = self.Db.BuildObject\r
self.Platform = None\r
self.LoadFixAddress = 0\r
- self.UniFlag = UniFlag\r
+ self.UniFlag = BuildOptions.Flag\r
\r
# print dot character during doing some time-consuming work\r
self.Progress = Utils.Progressor()\r
\r
- # parse target.txt, tools_def.txt, and platform file\r
- #self.RestoreBuildData()\r
- self.LoadConfiguration()\r
- \r
- #\r
- # @attention Treat $(TARGET)/$(TOOL_CHAIN_TAG) in meta data files as special macro when it has only one build target/toolchain.\r
- # This is not a complete support for $(TARGET)/$(TOOL_CHAIN_TAG) macro as it can only support one build target/toolchain in ONE\r
- # invocation of build command. However, it should cover the frequent usage model that $(TARGET)/$(TOOL_CHAIN_TAG) macro\r
- # is used in DSC/FDF files to specify different libraries & PCD setting for debug/release build.\r
- #\r
- if len(self.BuildTargetList) == 1:\r
- self.Db._GlobalMacros.setdefault("TARGET", self.BuildTargetList[0])\r
- if len(self.ToolChainList) == 1: \r
- self.Db._GlobalMacros.setdefault("TOOL_CHAIN_TAG", self.ToolChainList[0])\r
- \r
self.InitBuild()\r
\r
# print current build environment and configuration\r
- EdkLogger.quiet("%-24s = %s" % ("WORKSPACE", os.environ["WORKSPACE"]))\r
- EdkLogger.quiet("%-24s = %s" % ("ECP_SOURCE", os.environ["ECP_SOURCE"]))\r
- EdkLogger.quiet("%-24s = %s" % ("EDK_SOURCE", os.environ["EDK_SOURCE"]))\r
- EdkLogger.quiet("%-24s = %s" % ("EFI_SOURCE", os.environ["EFI_SOURCE"]))\r
- EdkLogger.quiet("%-24s = %s" % ("EDK_TOOLS_PATH", os.environ["EDK_TOOLS_PATH"]))\r
-\r
- EdkLogger.info('\n%-24s = %s' % ("TARGET_ARCH", ' '.join(self.ArchList)))\r
- EdkLogger.info('%-24s = %s' % ("TARGET", ' '.join(self.BuildTargetList)))\r
- EdkLogger.info('%-24s = %s' % ("TOOL_CHAIN_TAG", ' '.join(self.ToolChainList)))\r
-\r
- EdkLogger.info('\n%-24s = %s' % ("Active Platform", self.PlatformFile))\r
-\r
- if self.Fdf != None and self.Fdf != "":\r
- EdkLogger.info('%-24s = %s' % ("Flash Image Definition", self.Fdf))\r
-\r
- if self.ModuleFile != None and self.ModuleFile != "":\r
- EdkLogger.info('%-24s = %s' % ("Active Module", self.ModuleFile))\r
+ EdkLogger.quiet("%-16s = %s" % ("WORKSPACE", os.environ["WORKSPACE"]))\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
+\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
EdkLogger.error("build", FILE_NOT_FOUND, ExtraData=BuildConfigurationFile)\r
\r
# if no ARCH given in command line, get it from target.txt\r
- if self.ArchList == None or len(self.ArchList) == 0:\r
+ if not self.ArchList:\r
self.ArchList = self.TargetTxt.TargetTxtDictionary[DataType.TAB_TAT_DEFINES_TARGET_ARCH]\r
+ self.ArchList = tuple(self.ArchList)\r
\r
# if no build target given in command line, get it from target.txt\r
- if self.BuildTargetList == None or len(self.BuildTargetList) == 0:\r
+ if not self.BuildTargetList:\r
self.BuildTargetList = self.TargetTxt.TargetTxtDictionary[DataType.TAB_TAT_DEFINES_TARGET]\r
\r
# if no tool chain given in command line, get it from target.txt\r
- if self.ToolChainList == None or len(self.ToolChainList) == 0:\r
+ if not self.ToolChainList:\r
self.ToolChainList = self.TargetTxt.TargetTxtDictionary[DataType.TAB_TAT_DEFINES_TOOL_CHAIN_TAG]\r
if self.ToolChainList == None or len(self.ToolChainList) == 0:\r
EdkLogger.error("build", RESOURCE_NOT_AVAILABLE, ExtraData="No toolchain given. Don't know how to build.\n")\r
ExtraData="No active platform specified in target.txt or command line! Nothing can be built.\n")\r
\r
self.PlatformFile = PathClass(NormFile(PlatformFile, self.WorkspaceDir), self.WorkspaceDir)\r
- ErrorCode, ErrorInfo = self.PlatformFile.Validate(".dsc", False)\r
- if ErrorCode != 0:\r
- EdkLogger.error("build", ErrorCode, ExtraData=ErrorInfo)\r
\r
## Initialize build configuration\r
#\r
# command line and target.txt, then get the final build configurations.\r
#\r
def InitBuild(self):\r
- ErrorCode, ErrorInfo = self.PlatformFile.Validate(".dsc")\r
+ # parse target.txt, tools_def.txt, and platform file\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 ErrorCode != 0:\r
EdkLogger.error("build", ErrorCode, ExtraData=ErrorInfo)\r
\r
# create metafile database\r
self.Db.InitDatabase()\r
\r
- # we need information in platform description file to determine how to build\r
- self.Platform = self.BuildDatabase[self.PlatformFile, 'COMMON']\r
- if not self.Fdf:\r
- self.Fdf = self.Platform.FlashDefinition\r
- \r
- LoadFixAddressString = None\r
- if TAB_FIX_LOAD_TOP_MEMORY_ADDRESS in GlobalData.gGlobalDefines:\r
- LoadFixAddressString = GlobalData.gGlobalDefines[TAB_FIX_LOAD_TOP_MEMORY_ADDRESS]\r
- else:\r
- LoadFixAddressString = self.Platform.LoadFixAddress\r
-\r
- if LoadFixAddressString != None and LoadFixAddressString != '':\r
- try:\r
- if LoadFixAddressString.upper().startswith('0X'):\r
- self.LoadFixAddress = int (LoadFixAddressString, 16)\r
- else:\r
- self.LoadFixAddress = int (LoadFixAddressString)\r
- except:\r
- EdkLogger.error("build", PARAMETER_INVALID, "FIX_LOAD_TOP_MEMORY_ADDRESS %s is not valid dec or hex string" % (LoadFixAddressString))\r
- if self.LoadFixAddress < 0:\r
- EdkLogger.error("build", PARAMETER_INVALID, "FIX_LOAD_TOP_MEMORY_ADDRESS is set to the invalid negative value %s" % (LoadFixAddressString))\r
- if self.LoadFixAddress != 0xFFFFFFFFFFFFFFFF and self.LoadFixAddress % 0x1000 != 0:\r
- EdkLogger.error("build", PARAMETER_INVALID, "FIX_LOAD_TOP_MEMORY_ADDRESS is set to the invalid unaligned 4K value %s" % (LoadFixAddressString))\r
-\r
- if self.SkuId == None or self.SkuId == '':\r
- self.SkuId = self.Platform.SkuName\r
-\r
- # check FD/FV build target\r
- if self.Fdf == None or self.Fdf == "":\r
- if self.FdList != []:\r
- EdkLogger.info("No flash definition file found. FD [%s] will be ignored." % " ".join(self.FdList))\r
- self.FdList = []\r
- if self.FvList != []:\r
- EdkLogger.info("No flash definition file found. FV [%s] will be ignored." % " ".join(self.FvList))\r
- self.FvList = []\r
- else:\r
- #\r
- # Mark now build in AutoGen Phase\r
- #\r
- GlobalData.gAutoGenPhase = True\r
- FdfParserObj = FdfParser(str(self.Fdf))\r
- for key in self.Db._GlobalMacros:\r
- InputMacroDict[key] = self.Db._GlobalMacros[key]\r
- FdfParserObj.ParseFile()\r
- for fvname in self.FvList:\r
- if fvname.upper() not in FdfParserObj.Profile.FvDict.keys():\r
- EdkLogger.error("build", OPTION_VALUE_INVALID,\r
- "No such an FV in FDF file: %s" % fvname)\r
- GlobalData.gAutoGenPhase = False\r
-\r
- #\r
- # Merge Arch\r
- #\r
- if self.ArchList == None or len(self.ArchList) == 0:\r
- ArchList = set(self.Platform.SupArchList)\r
- else:\r
- ArchList = set(self.ArchList) & set(self.Platform.SupArchList)\r
- if len(ArchList) == 0:\r
- EdkLogger.error("build", PARAMETER_INVALID,\r
- ExtraData = "Active platform supports [%s] only, but [%s] is given."\r
- % (" ".join(self.Platform.SupArchList), " ".join(self.ArchList)))\r
- elif len(ArchList) != len(self.ArchList):\r
- SkippedArchList = set(self.ArchList).symmetric_difference(set(self.Platform.SupArchList))\r
- EdkLogger.verbose("\nArch [%s] is ignored because active platform supports [%s] but [%s] is specified !"\r
- % (" ".join(SkippedArchList), " ".join(self.Platform.SupArchList), " ".join(self.ArchList)))\r
- self.ArchList = tuple(ArchList)\r
-\r
- # Merge build target\r
- if self.BuildTargetList == None or len(self.BuildTargetList) == 0:\r
- BuildTargetList = self.Platform.BuildTargets\r
- else:\r
- BuildTargetList = list(set(self.BuildTargetList) & set(self.Platform.BuildTargets))\r
- if BuildTargetList == []:\r
- EdkLogger.error("build", PARAMETER_INVALID, "Active platform only supports [%s], but [%s] is given"\r
- % (" ".join(self.Platform.BuildTargets), " ".join(self.BuildTargetList)))\r
- self.BuildTargetList = BuildTargetList\r
-\r
## Build a module or platform\r
#\r
# Create autogen code and makefile for a module or platform, and the launch\r
\r
BuildCommand = AutoGenObject.BuildCommand\r
if BuildCommand == None or len(BuildCommand) == 0:\r
- EdkLogger.error("build", OPTION_MISSING, ExtraData="No MAKE command found for [%s, %s, %s]" % Key)\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
+ (AutoGenObject.BuildTarget, AutoGenObject.ToolChain, AutoGenObject.Arch),\r
+ ExtraData=str(AutoGenObject))\r
\r
BuildCommand = BuildCommand + [Target]\r
LaunchCommand(BuildCommand, AutoGenObject.MakeFileDir)\r
#\r
# First should close DB.\r
#\r
- self.Db.Close() \r
+ self.Db.Close()\r
RemoveDirectory(gBuildCacheDir, True)\r
except WindowsError, X:\r
EdkLogger.error("build", FILE_DELETE_FAILURE, ExtraData=str(X))\r
## Collect MAP information of all FVs\r
#\r
def _CollectFvMapBuffer (self, MapBuffer, Wa, ModuleList):\r
- if self.Fdf != '':\r
+ if self.Fdf:\r
# First get the XIP base address for FV map file.\r
GuidPattern = re.compile("[-a-fA-F0-9]+")\r
GuidName = re.compile("\(GUID=[-a-fA-F0-9]+")\r
#\r
def _BuildPlatform(self):\r
for BuildTarget in self.BuildTargetList:\r
+ GlobalData.gGlobalDefines['TARGET'] = BuildTarget\r
for ToolChain in self.ToolChainList:\r
+ GlobalData.gGlobalDefines['TOOLCHAIN'] = ToolChain\r
+ GlobalData.gGlobalDefines['TOOL_CHAIN_TAG'] = ToolChain\r
Wa = WorkspaceAutoGen(\r
self.WorkspaceDir,\r
- self.Platform,\r
+ self.PlatformFile,\r
BuildTarget,\r
ToolChain,\r
self.ArchList,\r
self.SkuId,\r
self.UniFlag\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
# Create MAP file when Load Fix Address is enabled.\r
if self.Target in ["", "all", "fds"]:\r
- for Arch in self.ArchList:\r
+ for Arch in Wa.ArchList:\r
+ GlobalData.gGlobalDefines['ARCH'] = Arch\r
#\r
# Check whether the set fix address is above 4G for 32bit image.\r
#\r
if (Arch == 'IA32' or Arch == 'ARM') and self.LoadFixAddress != 0xFFFFFFFFFFFFFFFF and self.LoadFixAddress >= 0x100000000:\r
- EdkLogger.error("build", PARAMETER_INVALID, "FIX_LOAD_TOP_MEMORY_ADDRESS can't be set to larger than or equal to 4G for the platorm with IA32 or ARM arch modules")\r
+ EdkLogger.error("build", PARAMETER_INVALID, "FIX_LOAD_TOP_MEMORY_ADDRESS can't be set to larger than or equal to 4G for the platform with IA32 or ARM arch modules")\r
#\r
# Get Module List\r
#\r
# Rebase module to the preferred memory address before GenFds\r
#\r
self._CollectModuleMapBuffer(MapBuffer, ModuleList)\r
- if self.Fdf != '':\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
+ if self.Fdf:\r
#\r
# Create MAP file for all platform FVs after GenFds.\r
#\r
#\r
def _BuildModule(self):\r
for BuildTarget in self.BuildTargetList:\r
+ GlobalData.gGlobalDefines['TARGET'] = BuildTarget\r
for ToolChain in self.ToolChainList:\r
+ GlobalData.gGlobalDefines['TOOLCHAIN'] = ToolChain\r
+ GlobalData.gGlobalDefines['TOOL_CHAIN_TAG'] = ToolChain \r
#\r
# module build needs platform build information, so get platform\r
# AutoGen first\r
#\r
Wa = WorkspaceAutoGen(\r
self.WorkspaceDir,\r
- self.Platform,\r
+ self.PlatformFile,\r
BuildTarget,\r
ToolChain,\r
self.ArchList,\r
self.SkuId,\r
self.UniFlag\r
)\r
+ self.Fdf = Wa.FdfFile\r
+ self.LoadFixAddress = Wa.Platform.LoadFixAddress\r
Wa.CreateMakeFile(False)\r
self.Progress.Stop("done!")\r
MaList = []\r
- for Arch in self.ArchList:\r
+ for Arch in Wa.ArchList:\r
+ GlobalData.gGlobalDefines['ARCH'] = Arch\r
Ma = ModuleAutoGen(Wa, self.ModuleFile, BuildTarget, ToolChain, Arch, self.PlatformFile)\r
if Ma == None: continue\r
MaList.append(Ma)\r
"Module for [%s] is not a component of active platform."\\r
" Please make sure that the ARCH and inf file path are"\\r
" given in the same as in [%s]" %\\r
- (', '.join(self.ArchList), self.Platform),\r
+ (', '.join(Wa.ArchList), self.PlatformFile),\r
ExtraData=self.ModuleFile\r
)\r
# Create MAP file when Load Fix Address is enabled.\r
- if self.Target == "fds" and self.Fdf != '':\r
- for Arch in self.ArchList:\r
+ if self.Target == "fds" and self.Fdf:\r
+ for Arch in Wa.ArchList:\r
#\r
# Check whether the set fix address is above 4G for 32bit image.\r
#\r
#\r
def _MultiThreadBuildPlatform(self):\r
for BuildTarget in self.BuildTargetList:\r
+ GlobalData.gGlobalDefines['TARGET'] = BuildTarget\r
for ToolChain in self.ToolChainList:\r
+ GlobalData.gGlobalDefines['TOOLCHAIN'] = ToolChain\r
+ GlobalData.gGlobalDefines['TOOL_CHAIN_TAG'] = ToolChain \r
Wa = WorkspaceAutoGen(\r
self.WorkspaceDir,\r
- self.Platform,\r
+ self.PlatformFile,\r
BuildTarget,\r
ToolChain,\r
self.ArchList,\r
self.SkuId,\r
self.UniFlag\r
)\r
+ self.Fdf = Wa.FdfFile\r
+ self.LoadFixAddress = Wa.Platform.LoadFixAddress\r
self.BuildReport.AddPlatformReport(Wa)\r
Wa.CreateMakeFile(False)\r
\r
# multi-thread exit flag\r
ExitFlag = threading.Event()\r
ExitFlag.clear()\r
- for Arch in self.ArchList:\r
+ for Arch in Wa.ArchList:\r
+ GlobalData.gGlobalDefines['ARCH'] = Arch\r
Pa = PlatformAutoGen(Wa, self.PlatformFile, BuildTarget, ToolChain, Arch)\r
if Pa == None:\r
continue\r
\r
# Create MAP file when Load Fix Address is enabled.\r
if self.Target in ["", "all", "fds"]:\r
- for Arch in self.ArchList:\r
+ for Arch in Wa.ArchList:\r
#\r
# Check whether the set fix address is above 4G for 32bit image.\r
#\r
if self.LoadFixAddress != 0:\r
self._CollectModuleMapBuffer(MapBuffer, ModuleList)\r
\r
- if self.Fdf != '':\r
+ if self.Fdf:\r
#\r
# Generate FD image if there's a FDF file found\r
#\r
## Generate GuidedSectionTools.txt in the FV directories.\r
#\r
def CreateGuidedSectionToolsFile(self):\r
- for Arch in self.ArchList:\r
- for BuildTarget in self.BuildTargetList:\r
- for ToolChain in self.ToolChainList:\r
- FvDir = os.path.join(\r
- self.WorkspaceDir,\r
- self.Platform.OutputDirectory,\r
- '_'.join((BuildTarget, ToolChain)),\r
- 'FV'\r
- )\r
- if not os.path.exists(FvDir):\r
- continue\r
+ for BuildTarget in self.BuildTargetList:\r
+ for ToolChain in self.ToolChainList:\r
+ Wa = WorkspaceAutoGen(\r
+ self.WorkspaceDir,\r
+ self.PlatformFile,\r
+ BuildTarget,\r
+ ToolChain,\r
+ self.ArchList,\r
+ self.BuildDatabase,\r
+ self.TargetTxt,\r
+ self.ToolDef,\r
+ self.Fdf,\r
+ self.FdList,\r
+ self.FvList,\r
+ self.CapList,\r
+ self.SkuId,\r
+ self.UniFlag\r
+ )\r
+ FvDir = Wa.FvDir\r
+ if not os.path.exists(FvDir):\r
+ continue\r
+\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
## Launch the module or platform build\r
#\r
def Launch(self):\r
- if self.ModuleFile == None or self.ModuleFile == "":\r
+ if not self.ModuleFile:\r
if not self.SpawnMode or self.Target not in ["", "all"]:\r
self.SpawnMode = False\r
self._BuildPlatform()\r
if DefineList != None:\r
for Define in DefineList:\r
DefineTokenList = Define.split("=", 1)\r
+ if not GlobalData.gMacroNamePattern.match(DefineTokenList[0]):\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
if len(DefineTokenList) == 1:\r
- DefineDict[DefineTokenList[0]] = ""\r
+ DefineDict[DefineTokenList[0]] = "TRUE"\r
else:\r
DefineDict[DefineTokenList[0]] = DefineTokenList[1].strip()\r
return DefineDict\r
Parser.add_option("-u", "--skip-autogen", action="store_true", dest="SkipAutoGen", help="Skip AutoGen step.")\r
Parser.add_option("-e", "--re-parse", action="store_true", dest="Reparse", help="Re-parse all meta-data files.")\r
\r
- Parser.add_option("-c", "--case-insensitive", action="store_true", dest="CaseInsensitive", help="Don't check case of file name.")\r
-\r
- # Parser.add_option("-D", "--define", action="append", dest="Defines", metavar="NAME[=[VALUE]]",\r
- # help="Define global macro which can be used in DSC/DEC/INF files.")\r
+ Parser.add_option("-c", "--case-insensitive", action="store_true", dest="CaseInsensitive", default=False, help="Don't check case of file name.")\r
\r
Parser.add_option("-w", "--warning-as-error", action="store_true", dest="WarningAsError", help="Treat warning in tools as error.")\r
Parser.add_option("-j", "--log", action="store", dest="LogFile", help="Put log in specified file as well as on console.")\r
help="Specify the specific option to parse EDK UNI file. Must be one of: [-c, -s]. -c is for EDK framework UNI file, and -s is for EDK UEFI UNI file. "\\r
"This option can also be specified by setting *_*_*_BUILD_FLAGS in [BuildOptions] section of platform DSC. If they are both specified, this value "\\r
"will override the setting in [BuildOptions] section of platform DSC.")\r
+ Parser.add_option("-N", "--no-cache", action="store_true", dest="DisableCache", default=False, help="Disable build cache mechanism")\r
\r
(Opt, Args)=Parser.parse_args()\r
return (Opt, Args)\r
EdkLogger.error("build", OPTION_NOT_SUPPORTED, "Not supported target [%s]." % Target,\r
ExtraData="Please select one of: %s" %(' '.join(gSupportedTarget)))\r
\r
- GlobalData.gGlobalDefines = ParseDefines(Option.Macros)\r
#\r
# Check environment variable: EDK_TOOLS_PATH, WORKSPACE, PATH\r
#\r
CheckEnvVariable()\r
+ GlobalData.gCommandLineDefines.update(ParseDefines(Option.Macros))\r
+\r
Workspace = os.getenv("WORKSPACE")\r
#\r
# Get files real name in workspace dir\r
if os.path.normcase (os.path.normpath(Option.PlatformFile)).find (Workspace) == 0:\r
Option.PlatformFile = NormFile(os.path.normpath(Option.PlatformFile), Workspace)\r
Option.PlatformFile = PathClass(Option.PlatformFile, Workspace)\r
- ErrorCode, ErrorInfo = Option.PlatformFile.Validate(".dsc", False)\r
- if ErrorCode != 0:\r
- EdkLogger.error("build", ErrorCode, ExtraData=ErrorInfo)\r
\r
if Option.FdfFile != None:\r
if os.path.isabs (Option.FdfFile):\r
if Option.Flag != None and Option.Flag not in ['-c', '-s']:\r
EdkLogger.error("build", OPTION_VALUE_INVALID, "UNI flag must be one of -c or -s")\r
\r
- MyBuild = Build(Target, Workspace, Option.PlatformFile, Option.ModuleFile,\r
- Option.TargetArch, Option.ToolChain, Option.BuildTarget,\r
- Option.FdfFile, Option.RomImage, Option.FvImage, Option.CapName,\r
- None, Option.SilentMode, Option.ThreadNumber,\r
- Option.SkipAutoGen, Option.Reparse, Option.SkuId, \r
- Option.ReportFile, Option.ReportType, Option.Flag)\r
+ MyBuild = Build(Target, Workspace, Option)\r
MyBuild.Launch()\r
#MyBuild.DumpBuildData()\r
except FatalError, X:\r
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
- EdkLogger.quiet("(Python %s on %s) " % (platform.python_version(), sys.platform) + traceback.format_exc())\r
+ if Option != None and Option.debug != None:\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