From nobody Wed Apr 24 19:08:38 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) client-ip=66.175.222.12; envelope-from=bounce+27952+53144+1787277+3901457@groups.io; helo=web01.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+53144+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1578644992; cv=none; d=zohomail.com; s=zohoarc; b=mXLC6+Z7JP+eguvg2UrUZcwbSm9nOCuYW4F13tkPNk4Y42l45oaukqvuarKbii2f9JcpqYc3lymyVbGQgeOCNvogmqhLAx0TUc9Az3RESxyA+3U/B6ugz9WNcJE10awhNCmQzmCtrWtHU6SrhMR7yqO5+q9zFG4gN6aeTyeoxB8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1578644992; h=Content-Type:Cc:Date:From:List-Id:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Sender:Subject:To; bh=8qQ713C0avkhgtrVZyoYGABoThTbJXVUnXkruMh2uMk=; b=C0INr/niBBIvMHNWMkjWTRjaSIT9AivgznkNjnvIhqK2jlpxrnyFZv+uC1BEzj1ukAbhiUrW3x9CbysTJJeI+MMyrQpL+RzP86Cze8+5V9xhz8AV4zfgYRBAQfHpuc5BGQbDX96/oe4uCNwuZEhLhOGv39daKmthIYdzuJmvVp4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+53144+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) header.from= Received: from web01.groups.io (web01.groups.io [66.175.222.12]) by mx.zohomail.com with SMTPS id 1578644992270482.198356537569; Fri, 10 Jan 2020 00:29:52 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id yjHzYY1788612xX3NEwnySbT; Fri, 10 Jan 2020 00:29:51 -0800 X-Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by mx.groups.io with SMTP id smtpd.web09.7643.1578644989852546235 for ; Fri, 10 Jan 2020 00:29:49 -0800 X-Amp-Result: UNKNOWN X-Amp-Original-Verdict: FILE UNKNOWN X-Amp-File-Uploaded: False X-Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by fmsmga104.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 10 Jan 2020 00:29:49 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.69,415,1571727600"; d="dat'59?scan'59,208,59";a="230168761" X-Received: from fmsmsx104.amr.corp.intel.com ([10.18.124.202]) by fmsmga001.fm.intel.com with ESMTP; 10 Jan 2020 00:29:48 -0800 X-Received: from fmsmsx125.amr.corp.intel.com (10.18.125.40) by fmsmsx104.amr.corp.intel.com (10.18.124.202) with Microsoft SMTP Server (TLS) id 14.3.439.0; Fri, 10 Jan 2020 00:29:48 -0800 X-Received: from shsmsx103.ccr.corp.intel.com (10.239.4.69) by FMSMSX125.amr.corp.intel.com (10.18.125.40) with Microsoft SMTP Server (TLS) id 14.3.439.0; Fri, 10 Jan 2020 00:29:47 -0800 X-Received: from shsmsx101.ccr.corp.intel.com ([169.254.1.30]) by SHSMSX103.ccr.corp.intel.com ([169.254.4.245]) with mapi id 14.03.0439.000; Fri, 10 Jan 2020 16:29:46 +0800 From: "Fan, ZhijuX" To: "devel@edk2.groups.io" CC: "Gao, Liming" , "Feng, Bob C" Subject: [edk2-devel] [PATCH V2] BaseTools:Fix GenFds issue for BuildOption replace GenFdsOption Thread-Topic: [PATCH V2] BaseTools:Fix GenFds issue for BuildOption replace GenFdsOption Thread-Index: AdXHkBKPq0xBBzczSeKw1AXu6q3W3g== Date: Fri, 10 Jan 2020 08:29:45 +0000 Message-ID: Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: dlp-product: dlpe-windows dlp-version: 11.2.0.6 dlp-reaction: no-action x-originating-ip: [10.239.127.40] MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,zhijux.fan@intel.com X-Gm-Message-State: P5DQO9Y2DDohFAdS57Wg3pUjx1787277AA= Content-Type: multipart/mixed; boundary="_000_FAD0D7E0AE0FA54D987F6E72435CAFD50B004C7CSHSMSX101ccrcor_" Content-Language: en-US DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1578644991; bh=Lwfgm+c93BV1D64wrQio21vgBTBeT3mMPrn4ozg66gE=; h=CC:Content-Type:Date:From:Reply-To:Subject:To; b=hoYHq71R4TrhnyKg7kHfDJoxmzvGq1egxNDIBtFabkczvKcQngVBaVp1TYWWjdtly1b c4dYUkKAfE/cbxa8G/mGqxMSPyu3Lx2WKa+7raNFBIsbwsqpwtd0S5c4AU5SnR2QuedOI Cc0FYNPH1oA10o/hnbcirtsRhJsTQ5RGDck= X-Zoho-Virus-Status: 1 X-ZohoMail-DKIM: pass (identity @groups.io) --_000_FAD0D7E0AE0FA54D987F6E72435CAFD50B004C7CSHSMSX101ccrcor_ Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" BZ:https://bugzilla.tianocore.org/show_bug.cgi?id=3D2455 BuildOption is used by TargetTxtClassObj.py GenFdsOption is used by GenFds.py When the GenFds tool is used alone (e.g. python3 -m GenFds.GenFds -h) With the OptionParser function, the first detected function prints the help message import TargetTxtClassObj to GenFds, The BuildOption will be executed and replace GenFdsOption We removed all objects associated with this problem that were created directly during the import process (e.g. BuildOption, BuildTarget =3D MyOptionParser(), TargetTxt =3D TargetTxtDict()) The Patch is going to fix this issue Signed-off-by: Zhiju.Fan Cc: Liming Gao Cc: Bob Feng Reviewed-by: Bob Feng --- BaseTools/Source/Python/AutoGen/BuildEngine.py | 56 +++++++---- BaseTools/Source/Python/Common/GlobalData.py | 2 +- .../Source/Python/Common/TargetTxtClassObject.py | 64 +++++++++------ .../Source/Python/Common/ToolDefClassObject.py | 48 +++++++--- BaseTools/Source/Python/Common/buildoptions.py | 93 ------------------ BaseTools/Source/Python/GenFds/GenFds.py | 4 +- .../Source/Python/GenFds/GenFdsGlobalVariable.py | 17 ++-- BaseTools/Source/Python/Workspace/DscBuildData.py | 9 +- BaseTools/Source/Python/build/build.py | 32 +++++-- BaseTools/Source/Python/build/buildoptions.py | 105 +++++++++++++++++= ++++ 10 files changed, 261 insertions(+), 169 deletions(-) delete mode 100644 BaseTools/Source/Python/Common/buildoptions.py create mode 100644 BaseTools/Source/Python/build/buildoptions.py The method by which the optimization function gets the=20 parameter value add bugzilla to patch diff --git a/BaseTools/Source/Python/AutoGen/BuildEngine.py b/BaseTools/Sou= rce/Python/AutoGen/BuildEngine.py index 069a3a1c9d..d602414ca4 100644 --- a/BaseTools/Source/Python/AutoGen/BuildEngine.py +++ b/BaseTools/Source/Python/AutoGen/BuildEngine.py @@ -20,7 +20,7 @@ from Common.BuildToolError import * from Common.Misc import tdict, PathClass from Common.StringUtils import NormPath from Common.DataType import * -from Common.TargetTxtClassObject import TargetTxt +from Common.TargetTxtClassObject import TargetTxtDict gDefaultBuildRuleFile =3D 'build_rule.txt' AutoGenReqBuildRuleVerNum =3D '0.1' =20 @@ -588,24 +588,42 @@ class BuildRule: _UnknownSection : SkipSection, } =20 -def GetBuildRule(): - BuildRuleFile =3D None - if TAB_TAT_DEFINES_BUILD_RULE_CONF in TargetTxt.TargetTxtDictionary: - BuildRuleFile =3D TargetTxt.TargetTxtDictionary[TAB_TAT_DEFINES_BU= ILD_RULE_CONF] - if not BuildRuleFile: - BuildRuleFile =3D gDefaultBuildRuleFile - RetVal =3D BuildRule(BuildRuleFile) - if RetVal._FileVersion =3D=3D "": - RetVal._FileVersion =3D AutoGenReqBuildRuleVerNum - else: - if RetVal._FileVersion < AutoGenReqBuildRuleVerNum : - # If Build Rule's version is less than the version number requ= ired by the tools, halting the build. - EdkLogger.error("build", AUTOGEN_ERROR, - ExtraData=3D"The version number [%s] of build_= rule.txt is less than the version number required by the AutoGen.(the minim= um required version number is [%s])"\ - % (RetVal._FileVersion, AutoGenReqBuildRuleVe= rNum)) - return RetVal - -BuildRuleObj =3D GetBuildRule() +class ToolBuildRule(): + + def __new__(cls, *args, **kw): + if not hasattr(cls, '_instance'): + orig =3D super(ToolBuildRule, cls) + cls._instance =3D orig.__new__(cls, *args, **kw) + return cls._instance + + def __init__(self): + if not hasattr(self, 'ToolBuildRule'): + self._ToolBuildRule =3D None + + @property + def ToolBuildRule(self): + if not self._ToolBuildRule: + self._GetBuildRule() + return self._ToolBuildRule + + def _GetBuildRule(self): + BuildRuleFile =3D None + TargetObj =3D TargetTxtDict() + TargetTxt =3D TargetObj.Target + if TAB_TAT_DEFINES_BUILD_RULE_CONF in TargetTxt.TargetTxtDictionar= y: + BuildRuleFile =3D TargetTxt.TargetTxtDictionary[TAB_TAT_DEFINE= S_BUILD_RULE_CONF] + if not BuildRuleFile: + BuildRuleFile =3D gDefaultBuildRuleFile + RetVal =3D BuildRule(BuildRuleFile) + if RetVal._FileVersion =3D=3D "": + RetVal._FileVersion =3D AutoGenReqBuildRuleVerNum + else: + if RetVal._FileVersion < AutoGenReqBuildRuleVerNum : + # If Build Rule's version is less than the version number = required by the tools, halting the build. + EdkLogger.error("build", AUTOGEN_ERROR, + ExtraData=3D"The version number [%s] of bu= ild_rule.txt is less than the version number required by the AutoGen.(the m= inimum required version number is [%s])"\ + % (RetVal._FileVersion, AutoGenReqBuildRu= leVerNum)) + self._ToolBuildRule =3D RetVal =20 # This acts like the main() function for the script, unless it is 'import'= ed into another # script. diff --git a/BaseTools/Source/Python/Common/GlobalData.py b/BaseTools/Sourc= e/Python/Common/GlobalData.py index 0b3ebe035d..8ac29eb7a6 100755 --- a/BaseTools/Source/Python/Common/GlobalData.py +++ b/BaseTools/Source/Python/Common/GlobalData.py @@ -70,7 +70,7 @@ gAutoGenPhase =3D False # The Conf dir outside the workspace dir # gConfDirectory =3D '' - +gCmdConfDir =3D '' gBuildDirectory =3D '' # # The relative default database file path diff --git a/BaseTools/Source/Python/Common/TargetTxtClassObject.py b/BaseT= ools/Source/Python/Common/TargetTxtClassObject.py index 723b9405bf..57212172fe 100644 --- a/BaseTools/Source/Python/Common/TargetTxtClassObject.py +++ b/BaseTools/Source/Python/Common/TargetTxtClassObject.py @@ -10,7 +10,7 @@ # from __future__ import print_function from __future__ import absolute_import -from Common.buildoptions import BuildOption,BuildTarget + import Common.GlobalData as GlobalData import Common.LongFilePathOs as os from . import EdkLogger @@ -144,29 +144,47 @@ class TargetTxtClassObject(object): # # @retval Target An instance of TargetTxtClassObject() with loaded target.= txt # -def TargetTxtDict(): - Target =3D TargetTxtClassObject() - if BuildOption.ConfDirectory: - # Get alternate Conf location, if it is absolute, then just use th= e absolute directory name - ConfDirectoryPath =3D os.path.normpath(BuildOption.ConfDirectory) - - if not os.path.isabs(ConfDirectoryPath): - # Since alternate directory name is not absolute, the alternat= e directory is located within the WORKSPACE - # This also handles someone specifying the Conf directory in t= he workspace. Using --conf=3DConf - ConfDirectoryPath =3D mws.join(os.environ["WORKSPACE"], ConfDi= rectoryPath) - else: - if "CONF_PATH" in os.environ: - ConfDirectoryPath =3D os.path.normcase(os.path.normpath(os.env= iron["CONF_PATH"])) + +class TargetTxtDict(): + + def __new__(cls, *args, **kw): + if not hasattr(cls, '_instance'): + orig =3D super(TargetTxtDict, cls) + cls._instance =3D orig.__new__(cls, *args, **kw) + return cls._instance + + def __init__(self): + if not hasattr(self, 'Target'): + self.TxtTarget =3D None + + @property + def Target(self): + if not self.TxtTarget: + self._GetTarget() + return self.TxtTarget + + def _GetTarget(self): + Target =3D TargetTxtClassObject() + ConfDirectory =3D GlobalData.gCmdConfDir + if ConfDirectory: + # Get alternate Conf location, if it is absolute, then just us= e the absolute directory name + ConfDirectoryPath =3D os.path.normpath(ConfDirectory) + + if not os.path.isabs(ConfDirectoryPath): + # Since alternate directory name is not absolute, the alte= rnate directory is located within the WORKSPACE + # This also handles someone specifying the Conf directory = in the workspace. Using --conf=3DConf + ConfDirectoryPath =3D mws.join(os.environ["WORKSPACE"], Co= nfDirectoryPath) else: - # Get standard WORKSPACE/Conf use the absolute path to the WOR= KSPACE/Conf - ConfDirectoryPath =3D mws.join(os.environ["WORKSPACE"], 'Conf') - GlobalData.gConfDirectory =3D ConfDirectoryPath - targettxt =3D os.path.normpath(os.path.join(ConfDirectoryPath, gDefaul= tTargetTxtFile)) - if os.path.exists(targettxt): - Target.LoadTargetTxtFile(targettxt) - return Target - -TargetTxt =3D TargetTxtDict() + if "CONF_PATH" in os.environ: + ConfDirectoryPath =3D os.path.normcase(os.path.normpath(os= .environ["CONF_PATH"])) + else: + # Get standard WORKSPACE/Conf use the absolute path to the= WORKSPACE/Conf + ConfDirectoryPath =3D mws.join(os.environ["WORKSPACE"], 'C= onf') + GlobalData.gConfDirectory =3D ConfDirectoryPath + targettxt =3D os.path.normpath(os.path.join(ConfDirectoryPath, gDe= faultTargetTxtFile)) + if os.path.exists(targettxt): + Target.LoadTargetTxtFile(targettxt) + self.TxtTarget =3D Target =20 ## # diff --git a/BaseTools/Source/Python/Common/ToolDefClassObject.py b/BaseToo= ls/Source/Python/Common/ToolDefClassObject.py index 063fa00584..8e70407cb9 100644 --- a/BaseTools/Source/Python/Common/ToolDefClassObject.py +++ b/BaseTools/Source/Python/Common/ToolDefClassObject.py @@ -14,7 +14,7 @@ import re from . import EdkLogger =20 from .BuildToolError import * -from Common.TargetTxtClassObject import TargetTxt +from Common.TargetTxtClassObject import TargetTxtDict from Common.LongFilePathSupport import OpenLongFilePath as open from Common.Misc import PathClass from Common.StringUtils import NormPath @@ -262,20 +262,40 @@ class ToolDefClassObject(object): # # @retval ToolDef An instance of ToolDefClassObject() with loaded tools_de= f.txt # -def ToolDefDict(ConfDir): - Target =3D TargetTxt - ToolDef =3D ToolDefClassObject() - if TAB_TAT_DEFINES_TOOL_CHAIN_CONF in Target.TargetTxtDictionary: - ToolsDefFile =3D Target.TargetTxtDictionary[TAB_TAT_DEFINES_TOOL_C= HAIN_CONF] - if ToolsDefFile: - ToolDef.LoadToolDefFile(os.path.normpath(ToolsDefFile)) - else: - ToolDef.LoadToolDefFile(os.path.normpath(os.path.join(ConfDir,= gDefaultToolsDefFile))) - else: - ToolDef.LoadToolDefFile(os.path.normpath(os.path.join(ConfDir, gDe= faultToolsDefFile))) - return ToolDef =20 -ToolDef =3D ToolDefDict((os.path.join(os.getenv("WORKSPACE"),"Conf"))) + +class ToolDefDict(): + + def __new__(cls, ConfDir, *args, **kw): + if not hasattr(cls, '_instance'): + orig =3D super(ToolDefDict, cls) + cls._instance =3D orig.__new__(cls, *args, **kw) + return cls._instance + + def __init__(self, ConfDir): + self.ConfDir =3D ConfDir + if not hasattr(self, 'ToolDef'): + self._ToolDef =3D None + + @property + def ToolDef(self): + if not self._ToolDef: + self._GetToolDef() + return self._ToolDef + + def _GetToolDef(self): + TargetObj =3D TargetTxtDict() + Target =3D TargetObj.Target + ToolDef =3D ToolDefClassObject() + if TAB_TAT_DEFINES_TOOL_CHAIN_CONF in Target.TargetTxtDictionary: + ToolsDefFile =3D Target.TargetTxtDictionary[TAB_TAT_DEFINES_TO= OL_CHAIN_CONF] + if ToolsDefFile: + ToolDef.LoadToolDefFile(os.path.normpath(ToolsDefFile)) + else: + ToolDef.LoadToolDefFile(os.path.normpath(os.path.join(self= .ConfDir, gDefaultToolsDefFile))) + else: + ToolDef.LoadToolDefFile(os.path.normpath(os.path.join(self.Con= fDir, gDefaultToolsDefFile))) + self._ToolDef =3D ToolDef =20 ## # diff --git a/BaseTools/Source/Python/Common/buildoptions.py b/BaseTools/Sou= rce/Python/Common/buildoptions.py deleted file mode 100644 index a717c58d8c..0000000000 --- a/BaseTools/Source/Python/Common/buildoptions.py +++ /dev/null @@ -1,93 +0,0 @@ -## @file -# build a platform or a module -# -# Copyright (c) 2014, Hewlett-Packard Development Company, L.P.
-# Copyright (c) 2007 - 2019, Intel Corporation. All rights reserved.
-# Copyright (c) 2018, Hewlett Packard Enterprise Development, L.P.
-# -# SPDX-License-Identifier: BSD-2-Clause-Patent -# - -# Version and Copyright -from Common.BuildVersion import gBUILD_VERSION -from optparse import OptionParser -VersionNumber =3D "0.60" + ' ' + gBUILD_VERSION -__version__ =3D "%prog Version " + VersionNumber -__copyright__ =3D "Copyright (c) 2007 - 2018, Intel Corporation All right= s reserved." - -gParamCheck =3D [] -def SingleCheckCallback(option, opt_str, value, parser): - if option not in gParamCheck: - setattr(parser.values, option.dest, value) - gParamCheck.append(option) - else: - parser.error("Option %s only allows one instance in command line!"= % option) - -def MyOptionParser(): - Parser =3D OptionParser(description=3D__copyright__, version=3D__versi= on__, prog=3D"build.exe", usage=3D"%prog [options] [all|fds|genc|genmake|cl= ean|cleanall|cleanlib|modules|libraries|run]") - Parser.add_option("-a", "--arch", action=3D"append", type=3D"choice", = choices=3D['IA32', 'X64', 'EBC', 'ARM', 'AARCH64'], dest=3D"TargetArch", - help=3D"ARCHS is one of list: IA32, X64, ARM, AARCH64 or EBC, whic= h overrides target.txt's TARGET_ARCH definition. To specify more archs, ple= ase repeat this option.") - Parser.add_option("-p", "--platform", action=3D"callback", type=3D"str= ing", dest=3D"PlatformFile", callback=3DSingleCheckCallback, - help=3D"Build the platform specified by the DSC file name argument= , overriding target.txt's ACTIVE_PLATFORM definition.") - Parser.add_option("-m", "--module", action=3D"callback", type=3D"strin= g", dest=3D"ModuleFile", callback=3DSingleCheckCallback, - help=3D"Build the module specified by the INF file name argument.") - Parser.add_option("-b", "--buildtarget", type=3D"string", dest=3D"Buil= dTarget", help=3D"Using the TARGET to build the platform, overriding target= .txt's TARGET definition.", - action=3D"append") - Parser.add_option("-t", "--tagname", action=3D"append", type=3D"string= ", dest=3D"ToolChain", - help=3D"Using the Tool Chain Tagname to build the platform, overri= ding target.txt's TOOL_CHAIN_TAG definition.") - Parser.add_option("-x", "--sku-id", action=3D"callback", type=3D"strin= g", dest=3D"SkuId", callback=3DSingleCheckCallback, - help=3D"Using this name of SKU ID to build the platform, overridin= g SKUID_IDENTIFIER in DSC file.") - - Parser.add_option("-n", action=3D"callback", type=3D"int", dest=3D"Thr= eadNumber", callback=3DSingleCheckCallback, - help=3D"Build the platform using multi-threaded compiler. The valu= e overrides target.txt's MAX_CONCURRENT_THREAD_NUMBER. When value is set to= 0, tool automatically detect number of "\ - "processor threads, set value to 1 means disable multi-thread= build, and set value to more than 1 means user specify the threads number = to build.") - - Parser.add_option("-f", "--fdf", action=3D"callback", type=3D"string",= dest=3D"FdfFile", callback=3DSingleCheckCallback, - help=3D"The name of the FDF file to use, which overrides the setti= ng in the DSC file.") - Parser.add_option("-r", "--rom-image", action=3D"append", type=3D"stri= ng", dest=3D"RomImage", default=3D[], - help=3D"The name of FD to be generated. The name must be from [FD]= section in FDF file.") - Parser.add_option("-i", "--fv-image", action=3D"append", type=3D"strin= g", dest=3D"FvImage", default=3D[], - help=3D"The name of FV to be generated. The name must be from [FV]= section in FDF file.") - Parser.add_option("-C", "--capsule-image", action=3D"append", type=3D"= string", dest=3D"CapName", default=3D[], - help=3D"The name of Capsule to be generated. The name must be from= [Capsule] section in FDF file.") - Parser.add_option("-u", "--skip-autogen", action=3D"store_true", dest= =3D"SkipAutoGen", help=3D"Skip AutoGen step.") - Parser.add_option("-e", "--re-parse", action=3D"store_true", dest=3D"R= eparse", help=3D"Re-parse all meta-data files.") - - Parser.add_option("-c", "--case-insensitive", action=3D"store_true", d= est=3D"CaseInsensitive", default=3DFalse, help=3D"Don't check case of file = name.") - - Parser.add_option("-w", "--warning-as-error", action=3D"store_true", d= est=3D"WarningAsError", help=3D"Treat warning in tools as error.") - Parser.add_option("-j", "--log", action=3D"store", dest=3D"LogFile", h= elp=3D"Put log in specified file as well as on console.") - - Parser.add_option("-s", "--silent", action=3D"store_true", type=3DNone= , dest=3D"SilentMode", - help=3D"Make use of silent mode of (n)make.") - Parser.add_option("-q", "--quiet", action=3D"store_true", type=3DNone,= help=3D"Disable all messages except FATAL ERRORS.") - Parser.add_option("-v", "--verbose", action=3D"store_true", type=3DNon= e, help=3D"Turn on verbose output with informational messages printed, "\ - = "including library instances selected, final dependency expression, "\ - = "and warning messages, etc.") - Parser.add_option("-d", "--debug", action=3D"store", type=3D"int", hel= p=3D"Enable debug messages at specified level.") - Parser.add_option("-D", "--define", action=3D"append", type=3D"string"= , dest=3D"Macros", help=3D"Macro: \"Name [=3D Value]\".") - - Parser.add_option("-y", "--report-file", action=3D"store", dest=3D"Rep= ortFile", help=3D"Create/overwrite the report to the specified filename.") - Parser.add_option("-Y", "--report-type", action=3D"append", type=3D"ch= oice", choices=3D['PCD', 'LIBRARY', 'FLASH', 'DEPEX', 'BUILD_FLAGS', 'FIXED= _ADDRESS', 'HASH', 'EXECUTION_ORDER'], dest=3D"ReportType", default=3D[], - help=3D"Flags that control the type of build report to generate. = Must be one of: [PCD, LIBRARY, FLASH, DEPEX, BUILD_FLAGS, FIXED_ADDRESS, HA= SH, EXECUTION_ORDER]. "\ - "To specify more than one flag, repeat this option on the com= mand line and the default flag set is [PCD, LIBRARY, FLASH, DEPEX, HASH, BU= ILD_FLAGS, FIXED_ADDRESS]") - Parser.add_option("-F", "--flag", action=3D"store", type=3D"string", d= est=3D"Flag", - help=3D"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. "\ - "This option can also be specified by setting *_*_*_BUILD_FLA= GS in [BuildOptions] section of platform DSC. If they are both specified, t= his value "\ - "will override the setting in [BuildOptions] section of platf= orm DSC.") - Parser.add_option("-N", "--no-cache", action=3D"store_true", dest=3D"D= isableCache", default=3DFalse, help=3D"Disable build cache mechanism") - Parser.add_option("--conf", action=3D"store", type=3D"string", dest=3D= "ConfDirectory", help=3D"Specify the customized Conf directory.") - Parser.add_option("--check-usage", action=3D"store_true", dest=3D"Chec= kUsage", default=3DFalse, help=3D"Check usage content of entries listed in = INF file.") - Parser.add_option("--ignore-sources", action=3D"store_true", dest=3D"I= gnoreSources", default=3DFalse, help=3D"Focus to a binary build and ignore = all source files") - Parser.add_option("--pcd", action=3D"append", dest=3D"OptionPcd", help= =3D"Set PCD value by command line. Format: \"PcdName=3DValue\" ") - Parser.add_option("-l", "--cmd-len", action=3D"store", type=3D"int", d= est=3D"CommandLength", help=3D"Specify the maximum line length of build com= mand. Default is 4096.") - Parser.add_option("--hash", action=3D"store_true", dest=3D"UseHashCach= e", default=3DFalse, help=3D"Enable hash-based caching during build process= .") - Parser.add_option("--binary-destination", action=3D"store", type=3D"st= ring", dest=3D"BinCacheDest", help=3D"Generate a cache of binary files in t= he specified directory.") - Parser.add_option("--binary-source", action=3D"store", type=3D"string"= , dest=3D"BinCacheSource", help=3D"Consume a cache of binary files from the= specified directory.") - Parser.add_option("--genfds-multi-thread", action=3D"store_true", dest= =3D"GenfdsMultiThread", default=3DTrue, help=3D"Enable GenFds multi thread = to generate ffs file.") - Parser.add_option("--no-genfds-multi-thread", action=3D"store_true", d= est=3D"NoGenfdsMultiThread", default=3DFalse, help=3D"Disable GenFds multi = thread to generate ffs file.") - Parser.add_option("--disable-include-path-check", action=3D"store_true= ", dest=3D"DisableIncludePathCheck", default=3DFalse, help=3D"Disable the i= nclude path check for outside of package.") - (Opt, Args) =3D Parser.parse_args() - return (Opt, Args) - -BuildOption, BuildTarget =3D MyOptionParser() diff --git a/BaseTools/Source/Python/GenFds/GenFds.py b/BaseTools/Source/Py= thon/GenFds/GenFds.py index d8bc28e4d0..d5511f4c40 100644 --- a/BaseTools/Source/Python/GenFds/GenFds.py +++ b/BaseTools/Source/Python/GenFds/GenFds.py @@ -20,7 +20,7 @@ from linecache import getlines from io import BytesIO =20 import Common.LongFilePathOs as os -from Common.TargetTxtClassObject import TargetTxt +from Common.TargetTxtClassObject import TargetTxtDict from Common.DataType import * import Common.GlobalData as GlobalData from Common import EdkLogger @@ -210,6 +210,8 @@ def GenFdsApi(FdsCommandDict, WorkSpaceDataBase=3DNone): BuildConfigurationFile =3D os.path.normpath(os.path.join(ConfDirec= toryPath, "target.txt")) if os.path.isfile(BuildConfigurationFile) =3D=3D True: # if no build target given in command line, get it from target= .txt + TargetObj =3D TargetTxtDict() + TargetTxt =3D TargetObj.Target if not GenFdsGlobalVariable.TargetName: BuildTargetList =3D TargetTxt.TargetTxtDictionary[TAB_TAT_= DEFINES_TARGET] if len(BuildTargetList) !=3D 1: diff --git a/BaseTools/Source/Python/GenFds/GenFdsGlobalVariable.py b/BaseT= ools/Source/Python/GenFds/GenFdsGlobalVariable.py index 6e1ff7fe04..dc1727c466 100644 --- a/BaseTools/Source/Python/GenFds/GenFdsGlobalVariable.py +++ b/BaseTools/Source/Python/GenFds/GenFdsGlobalVariable.py @@ -23,9 +23,9 @@ from Common.BuildToolError import COMMAND_FAILURE,GENFDS_= ERROR from Common import EdkLogger from Common.Misc import SaveFileOnChange =20 -from Common.TargetTxtClassObject import TargetTxt -from Common.ToolDefClassObject import ToolDef -from AutoGen.BuildEngine import BuildRuleObj +from Common.TargetTxtClassObject import TargetTxtDict +from Common.ToolDefClassObject import ToolDefDict +from AutoGen.BuildEngine import ToolBuildRule import Common.DataType as DataType from Common.Misc import PathClass from Common.LongFilePathSupport import OpenLongFilePath as open @@ -96,12 +96,15 @@ class GenFdsGlobalVariable: def _LoadBuildRule(): if GenFdsGlobalVariable.__BuildRuleDatabase: return GenFdsGlobalVariable.__BuildRuleDatabase - GenFdsGlobalVariable.__BuildRuleDatabase =3D BuildRuleObj - ToolDefinitionFile =3D TargetTxt.TargetTxtDictionary[DataType.TAB_= TAT_DEFINES_TOOL_CHAIN_CONF] + BuildRule =3D ToolBuildRule() + GenFdsGlobalVariable.__BuildRuleDatabase =3D BuildRule.ToolBuildRu= le + TargetObj =3D TargetTxtDict() + ToolDefinitionFile =3D TargetObj.Target.TargetTxtDictionary[DataTy= pe.TAB_TAT_DEFINES_TOOL_CHAIN_CONF] if ToolDefinitionFile =3D=3D '': ToolDefinitionFile =3D "Conf/tools_def.txt" if os.path.isfile(ToolDefinitionFile): - ToolDefinition =3D ToolDef.ToolsDefTxtDatabase + ToolDefObj =3D ToolDefDict((os.path.join(os.getenv("WORKSPACE"= ), "Conf"))) + ToolDefinition =3D ToolDefObj.ToolDef.ToolsDefTxtDatabase if DataType.TAB_TOD_DEFINES_BUILDRULEFAMILY in ToolDefinition \ and GenFdsGlobalVariable.ToolChainTag in ToolDefinition[Dat= aType.TAB_TOD_DEFINES_BUILDRULEFAMILY] \ and ToolDefinition[DataType.TAB_TOD_DEFINES_BUILDRULEFAMILY= ][GenFdsGlobalVariable.ToolChainTag]: @@ -830,6 +833,8 @@ class GenFdsGlobalVariable: # @param NameGuid The Guid name # def FindExtendTool(KeyStringList, CurrentArchList, NameGuid): + ToolDefObj =3D ToolDefDict((os.path.join(os.getenv("WORKSPACE"), "Conf= "))) + ToolDef =3D ToolDefObj.ToolDef ToolDb =3D ToolDef.ToolsDefTxtDatabase # if user not specify filter, try to deduce it from global data. if KeyStringList is None or KeyStringList =3D=3D []: diff --git a/BaseTools/Source/Python/Workspace/DscBuildData.py b/BaseTools/= Source/Python/Workspace/DscBuildData.py index 03a15bbf3e..c65a0dd346 100644 --- a/BaseTools/Source/Python/Workspace/DscBuildData.py +++ b/BaseTools/Source/Python/Workspace/DscBuildData.py @@ -19,8 +19,8 @@ from Common.Misc import * from types import * from Common.Expression import * from CommonDataClass.CommonClass import SkuInfoClass -from Common.TargetTxtClassObject import TargetTxt -from Common.ToolDefClassObject import ToolDef +from Common.TargetTxtClassObject import TargetTxtDict +from Common.ToolDefClassObject import ToolDefDict from .MetaDataTable import * from .MetaFileTable import * from .MetaFileParser import * @@ -3296,6 +3296,8 @@ class DscBuildData(PlatformBuildClassObject): @property def ToolChainFamily(self): self._ToolChainFamily =3D TAB_COMPILER_MSFT + TargetObj =3D TargetTxtDict() + TargetTxt =3D TargetObj.Target BuildConfigurationFile =3D os.path.normpath(os.path.join(GlobalDat= a.gConfDirectory, "target.txt")) if os.path.isfile(BuildConfigurationFile) =3D=3D True: ToolDefinitionFile =3D TargetTxt.TargetTxtDictionary[DataType.= TAB_TAT_DEFINES_TOOL_CHAIN_CONF] @@ -3303,7 +3305,8 @@ class DscBuildData(PlatformBuildClassObject): ToolDefinitionFile =3D "tools_def.txt" ToolDefinitionFile =3D os.path.normpath(mws.join(self.Work= spaceDir, 'Conf', ToolDefinitionFile)) if os.path.isfile(ToolDefinitionFile) =3D=3D True: - ToolDefinition =3D ToolDef.ToolsDefTxtDatabase + ToolDefObj =3D ToolDefDict((os.path.join(os.getenv("WORKSP= ACE"), "Conf"))) + ToolDefinition =3D ToolDefObj.ToolDef.ToolsDefTxtDatabase if TAB_TOD_DEFINES_FAMILY not in ToolDefinition \ or self._Toolchain not in ToolDefinition[TAB_TOD_DEFINE= S_FAMILY] \ or not ToolDefinition[TAB_TOD_DEFINES_FAMILY][self._Too= lchain]: diff --git a/BaseTools/Source/Python/build/build.py b/BaseTools/Source/Pyth= on/build/build.py index 3cc4220e2f..34acdccbdb 100755 --- a/BaseTools/Source/Python/build/build.py +++ b/BaseTools/Source/Python/build/build.py @@ -26,7 +26,7 @@ from threading import Thread,Event,BoundedSemaphore import threading from subprocess import Popen,PIPE, STDOUT from collections import OrderedDict, defaultdict -from Common.buildoptions import BuildOption,BuildTarget + from AutoGen.PlatformAutoGen import PlatformAutoGen from AutoGen.ModuleAutoGen import ModuleAutoGen from AutoGen.WorkspaceAutoGen import WorkspaceAutoGen @@ -35,8 +35,9 @@ from AutoGen.AutoGenWorker import AutoGenWorkerInProcess,= AutoGenManager,\ from AutoGen import GenMake from Common import Misc as Utils =20 -from Common.TargetTxtClassObject import TargetTxt -from Common.ToolDefClassObject import ToolDef +from Common.TargetTxtClassObject import TargetTxtDict +from Common.ToolDefClassObject import ToolDefDict +from buildoptions import MyOptionParser from Common.Misc import PathClass,SaveFileOnChange,RemoveDirectory from Common.StringUtils import NormPath from Common.MultipleWorkspace import MultipleWorkspace as mws @@ -731,11 +732,13 @@ class Build(): self.ConfDirectory =3D BuildOptions.ConfDirectory self.SpawnMode =3D True self.BuildReport =3D BuildReport(BuildOptions.ReportFile, Build= Options.ReportType) - self.TargetTxt =3D TargetTxt - self.ToolDef =3D ToolDef self.AutoGenTime =3D 0 self.MakeTime =3D 0 self.GenFdsTime =3D 0 + TargetObj =3D TargetTxtDict() + ToolDefObj =3D ToolDefDict((os.path.join(os.getenv("WORKSPACE"),"C= onf"))) + self.TargetTxt =3D TargetObj.Target + self.ToolDef =3D ToolDefObj.ToolDef GlobalData.BuildOptionPcd =3D BuildOptions.OptionPcd if BuildO= ptions.OptionPcd else [] #Set global flag for build mode GlobalData.gIgnoreSource =3D BuildOptions.IgnoreSources @@ -816,8 +819,10 @@ class Build(): EdkLogger.quiet("%-16s =3D %s" % ("POSTBUILD", self.Postbuild)) if self.Prebuild: self.LaunchPrebuild() - self.TargetTxt =3D TargetTxt - self.ToolDef =3D ToolDef + TargetObj =3D TargetTxtDict() + ToolDefObj =3D ToolDefDict((os.path.join(os.getenv("WORKSPACE"= ), "Conf"))) + self.TargetTxt =3D TargetObj.Target + self.ToolDef =3D ToolDefObj.ToolDef if not (self.LaunchPrebuildFlag and os.path.exists(self.PlatformBu= ildPath)): self.InitBuild() =20 @@ -2438,9 +2443,15 @@ def LogBuildTime(Time): else: return None def ThreadNum(): + OptionParser =3D MyOptionParser() + if not OptionParser.BuildOption and not OptionParser.BuildTarget: + OptionParser.GetOption() + BuildOption, BuildTarget =3D OptionParser.BuildOption, OptionParser.Bu= ildTarget ThreadNumber =3D BuildOption.ThreadNumber + GlobalData.gCmdConfDir =3D BuildOption.ConfDirectory if ThreadNumber is None: - ThreadNumber =3D TargetTxt.TargetTxtDictionary[TAB_TAT_DEFINES_MAX= _CONCURRENT_THREAD_NUMBER] + TargetObj =3D TargetTxtDict() + ThreadNumber =3D TargetObj.Target.TargetTxtDictionary[TAB_TAT_DEFI= NES_MAX_CONCURRENT_THREAD_NUMBER] if ThreadNumber =3D=3D '': ThreadNumber =3D 0 else: @@ -2475,7 +2486,10 @@ def Main(): # # Parse the options and args # - Option, Target =3D BuildOption, BuildTarget + OptionParser =3D MyOptionParser() + if not OptionParser.BuildOption and not OptionParser.BuildTarget: + OptionParser.GetOption() + Option, Target =3D OptionParser.BuildOption, OptionParser.BuildTarget GlobalData.gOptions =3D Option GlobalData.gCaseInsensitive =3D Option.CaseInsensitive =20 diff --git a/BaseTools/Source/Python/build/buildoptions.py b/BaseTools/Sour= ce/Python/build/buildoptions.py new file mode 100644 index 0000000000..4ad95b9f4f --- /dev/null +++ b/BaseTools/Source/Python/build/buildoptions.py @@ -0,0 +1,105 @@ +## @file +# build a platform or a module +# +# Copyright (c) 2014, Hewlett-Packard Development Company, L.P.
+# Copyright (c) 2007 - 2019, Intel Corporation. All rights reserved.
+# Copyright (c) 2018, Hewlett Packard Enterprise Development, L.P.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# + +# Version and Copyright +from Common.BuildVersion import gBUILD_VERSION +from optparse import OptionParser +VersionNumber =3D "0.60" + ' ' + gBUILD_VERSION +__version__ =3D "%prog Version " + VersionNumber +__copyright__ =3D "Copyright (c) 2007 - 2018, Intel Corporation All right= s reserved." + +gParamCheck =3D [] +def SingleCheckCallback(option, opt_str, value, parser): + if option not in gParamCheck: + setattr(parser.values, option.dest, value) + gParamCheck.append(option) + else: + parser.error("Option %s only allows one instance in command line!"= % option) + + +class MyOptionParser(): + + def __new__(cls, *args, **kw): + if not hasattr(cls, '_instance'): + orig =3D super(MyOptionParser, cls) + cls._instance =3D orig.__new__(cls, *args, **kw) + return cls._instance + + def __init__(self): + if not hasattr(self, 'BuildOption'): + self.BuildOption =3D None + if not hasattr(self, 'BuildTarget'): + self.BuildTarget =3D None + + def GetOption(self): + Parser =3D OptionParser(description=3D__copyright__, version=3D__v= ersion__, prog=3D"build.exe", usage=3D"%prog [options] [all|fds|genc|genmak= e|clean|cleanall|cleanlib|modules|libraries|run]") + Parser.add_option("-a", "--arch", action=3D"append", type=3D"choic= e", choices=3D['IA32', 'X64', 'EBC', 'ARM', 'AARCH64'], dest=3D"TargetArch", + help=3D"ARCHS is one of list: IA32, X64, ARM, AARCH64 or EBC, = which overrides target.txt's TARGET_ARCH definition. To specify more archs,= please repeat this option.") + Parser.add_option("-p", "--platform", action=3D"callback", type=3D= "string", dest=3D"PlatformFile", callback=3DSingleCheckCallback, + help=3D"Build the platform specified by the DSC file name argu= ment, overriding target.txt's ACTIVE_PLATFORM definition.") + Parser.add_option("-m", "--module", action=3D"callback", type=3D"s= tring", dest=3D"ModuleFile", callback=3DSingleCheckCallback, + help=3D"Build the module specified by the INF file name argume= nt.") + Parser.add_option("-b", "--buildtarget", type=3D"string", dest=3D"= BuildTarget", help=3D"Using the TARGET to build the platform, overriding ta= rget.txt's TARGET definition.", + action=3D"append") + Parser.add_option("-t", "--tagname", action=3D"append", type=3D"st= ring", dest=3D"ToolChain", + help=3D"Using the Tool Chain Tagname to build the platform, ov= erriding target.txt's TOOL_CHAIN_TAG definition.") + Parser.add_option("-x", "--sku-id", action=3D"callback", type=3D"s= tring", dest=3D"SkuId", callback=3DSingleCheckCallback, + help=3D"Using this name of SKU ID to build the platform, overr= iding SKUID_IDENTIFIER in DSC file.") + + Parser.add_option("-n", action=3D"callback", type=3D"int", dest=3D= "ThreadNumber", callback=3DSingleCheckCallback, + help=3D"Build the platform using multi-threaded compiler. The = value overrides target.txt's MAX_CONCURRENT_THREAD_NUMBER. When value is se= t to 0, tool automatically detect number of "\ + "processor threads, set value to 1 means disable multi-th= read build, and set value to more than 1 means user specify the threads num= ber to build.") + + Parser.add_option("-f", "--fdf", action=3D"callback", type=3D"stri= ng", dest=3D"FdfFile", callback=3DSingleCheckCallback, + help=3D"The name of the FDF file to use, which overrides the s= etting in the DSC file.") + Parser.add_option("-r", "--rom-image", action=3D"append", type=3D"= string", dest=3D"RomImage", default=3D[], + help=3D"The name of FD to be generated. The name must be from = [FD] section in FDF file.") + Parser.add_option("-i", "--fv-image", action=3D"append", type=3D"s= tring", dest=3D"FvImage", default=3D[], + help=3D"The name of FV to be generated. The name must be from = [FV] section in FDF file.") + Parser.add_option("-C", "--capsule-image", action=3D"append", type= =3D"string", dest=3D"CapName", default=3D[], + help=3D"The name of Capsule to be generated. The name must be = from [Capsule] section in FDF file.") + Parser.add_option("-u", "--skip-autogen", action=3D"store_true", d= est=3D"SkipAutoGen", help=3D"Skip AutoGen step.") + Parser.add_option("-e", "--re-parse", action=3D"store_true", dest= =3D"Reparse", help=3D"Re-parse all meta-data files.") + + Parser.add_option("-c", "--case-insensitive", action=3D"store_true= ", dest=3D"CaseInsensitive", default=3DFalse, help=3D"Don't check case of f= ile name.") + + Parser.add_option("-w", "--warning-as-error", action=3D"store_true= ", dest=3D"WarningAsError", help=3D"Treat warning in tools as error.") + Parser.add_option("-j", "--log", action=3D"store", dest=3D"LogFile= ", help=3D"Put log in specified file as well as on console.") + + Parser.add_option("-s", "--silent", action=3D"store_true", type=3D= None, dest=3D"SilentMode", + help=3D"Make use of silent mode of (n)make.") + Parser.add_option("-q", "--quiet", action=3D"store_true", type=3DN= one, help=3D"Disable all messages except FATAL ERRORS.") + Parser.add_option("-v", "--verbose", action=3D"store_true", type= =3DNone, help=3D"Turn on verbose output with informational messages printed= , "\ + = "including library instances selected, final dependency expression= , "\ + = "and warning messages, etc.") + Parser.add_option("-d", "--debug", action=3D"store", type=3D"int",= help=3D"Enable debug messages at specified level.") + Parser.add_option("-D", "--define", action=3D"append", type=3D"str= ing", dest=3D"Macros", help=3D"Macro: \"Name [=3D Value]\".") + + Parser.add_option("-y", "--report-file", action=3D"store", dest=3D= "ReportFile", help=3D"Create/overwrite the report to the specified filename= .") + Parser.add_option("-Y", "--report-type", action=3D"append", type= =3D"choice", choices=3D['PCD', 'LIBRARY', 'FLASH', 'DEPEX', 'BUILD_FLAGS', = 'FIXED_ADDRESS', 'HASH', 'EXECUTION_ORDER'], dest=3D"ReportType", default= =3D[], + help=3D"Flags that control the type of build report to generat= e. Must be one of: [PCD, LIBRARY, FLASH, DEPEX, BUILD_FLAGS, FIXED_ADDRESS= , HASH, EXECUTION_ORDER]. "\ + "To specify more than one flag, repeat this option on the= command line and the default flag set is [PCD, LIBRARY, FLASH, DEPEX, HASH= , BUILD_FLAGS, FIXED_ADDRESS]") + Parser.add_option("-F", "--flag", action=3D"store", type=3D"string= ", dest=3D"Flag", + help=3D"Specify the specific option to parse EDK UNI file. Mus= t be one of: [-c, -s]. -c is for EDK framework UNI file, and -s is for EDK = UEFI UNI file. "\ + "This option can also be specified by setting *_*_*_BUILD= _FLAGS in [BuildOptions] section of platform DSC. If they are both specifie= d, this value "\ + "will override the setting in [BuildOptions] section of p= latform DSC.") + Parser.add_option("-N", "--no-cache", action=3D"store_true", dest= =3D"DisableCache", default=3DFalse, help=3D"Disable build cache mechanism") + Parser.add_option("--conf", action=3D"store", type=3D"string", des= t=3D"ConfDirectory", help=3D"Specify the customized Conf directory.") + Parser.add_option("--check-usage", action=3D"store_true", dest=3D"= CheckUsage", default=3DFalse, help=3D"Check usage content of entries listed= in INF file.") + Parser.add_option("--ignore-sources", action=3D"store_true", dest= =3D"IgnoreSources", default=3DFalse, help=3D"Focus to a binary build and ig= nore all source files") + Parser.add_option("--pcd", action=3D"append", dest=3D"OptionPcd", = help=3D"Set PCD value by command line. Format: \"PcdName=3DValue\" ") + Parser.add_option("-l", "--cmd-len", action=3D"store", type=3D"int= ", dest=3D"CommandLength", help=3D"Specify the maximum line length of build= command. Default is 4096.") + Parser.add_option("--hash", action=3D"store_true", dest=3D"UseHash= Cache", default=3DFalse, help=3D"Enable hash-based caching during build pro= cess.") + Parser.add_option("--binary-destination", action=3D"store", type= =3D"string", dest=3D"BinCacheDest", help=3D"Generate a cache of binary file= s in the specified directory.") + Parser.add_option("--binary-source", action=3D"store", type=3D"str= ing", dest=3D"BinCacheSource", help=3D"Consume a cache of binary files from= the specified directory.") + Parser.add_option("--genfds-multi-thread", action=3D"store_true", = dest=3D"GenfdsMultiThread", default=3DTrue, help=3D"Enable GenFds multi thr= ead to generate ffs file.") + Parser.add_option("--no-genfds-multi-thread", action=3D"store_true= ", dest=3D"NoGenfdsMultiThread", default=3DFalse, help=3D"Disable GenFds mu= lti thread to generate ffs file.") + Parser.add_option("--disable-include-path-check", action=3D"store_= true", dest=3D"DisableIncludePathCheck", default=3DFalse, help=3D"Disable t= he include path check for outside of package.") + self.BuildOption, self.BuildTarget =3D Parser.parse_args() --=20 2.14.1.windows.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#53144): https://edk2.groups.io/g/devel/message/53144 Mute This Topic: https://groups.io/mt/69596912/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- --_000_FAD0D7E0AE0FA54D987F6E72435CAFD50B004C7CSHSMSX101ccrcor_ Content-Disposition: attachment; filename="winmail.dat" Content-Transfer-Encoding: base64 Content-Type: application/ms-tnef; name="winmail.dat" eJ8+IqlyAQaQCAAEAAAAAAABAAEAAQeQBgAIAAAA5AQAAAAAAADoAAEJgAEAIQAAAEREMzNFRjVF REUyODNBNDNBQkQ0MTUxMzdCOEQ3RDE1AFwHAQ2ABAACAAAAAgACAAEFgAMADgAAAOQHAQAKAAgA HQAtAAUATQEBIIADAA4AAADkBwEACgAIAB0ALQAFAE0BAQiABwAYAAAASVBNLk1pY3Jvc29mdCBN YWlsLk5vdGUAMQgBBIABAEwAAABbUEFUQ0ggVjJdIEJhc2VUb29sczpGaXggR2VuRmRzIGlzc3Vl IGZvciBCdWlsZE9wdGlvbiByZXBsYWNlICBHZW5GZHNPcHRpb24AWRoBC4ABACEAAABERDMzRUY1 RURFMjgzQTQzQUJENDE1MTM3QjhEN0QxNQBcBwEDkAYApEQAADUAAAACAX8AAQAAAEgAAAA8RkFE MEQ3RTBBRTBGQTU0RDk4N0Y2RTcyNDM1Q0FGRDUwQjAwNEM3Q0BTSFNNU1gxMDEuY2NyLmNvcnAu aW50ZWwuY29tPgALAB8OAQAAAAIBCRABAAAAPDoAADg6AAA8rAAATFpGdf2i8kZhAApmYmlkBAAA Y2PAcGcxMjUyAP4DQ/B0ZXh0AfcCpAPjAgAEY2gKwHNldDAg7wdtAoMAUBFNMgqABrQCgJZ9CoAI yDsJYjE5DsC/CcMWcgoyFnECgBViKgmwcwnwBJBhdAWyDlADYHOibwGAIEV4EcFuGDBdBlJ2BJAX tgIQcgDAdH0IUG4aMRAgBcAFoBtkZJogA1IgECIXslx2CJDkd2sLgGQ1HVME8AdADRdwMApxF/Ji a21rBnMBkAAgIEJNX0LgRUdJTn0K/AHxC/ERH7BaOmgCQHBzOsAvL2J1Z3oDEAtgJC50BzBubwWh ZS4BBbBnL3Nob3dfQSJRLmNnaT8N0D2oMjQ1HeBsC4BlCoFJJRRCdQMQZE8FMGllAiAgBAAgdRIA HGBiTnkSQArAGDB0VBBAQwMLYAQQT2JqLnB55SUFRwnwRmQoICZPKQT5KGhXaAnwHMArkCp1HMC+ bwbwJpcHQAIgGeAoI2AdJDAgKHAr0AIgMyAtRxywKoUsFS1oKSsWaTcr0CvDKWRQEeIFwGZ1lG5j JlIsK8NmaRHwfwVAAQAQIDHQHFIxtSUFcB8FEAIwLGEr4SuQbHAguQeBc2EYMCUMB3BwCRGtJ09q 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 aQBqAHUAWAAAAFMATQBUAFAAAAB6AGgAaQBqAHUAeAAuAGYAYQBuAEAAaQBuAHQAZQBsAC4AYwBv AG0AAAAfAAJdAQAAACoAAAB6AGgAaQBqAHUAeAAuAGYAYQBuAEAAaQBuAHQAZQBsAC4AYwBvAG0A AAAAAB8A5V8BAAAAMgAAAHMAaQBwADoAegBoAGkAagB1AHgALgBmAGEAbgBAAGkAbgB0AGUAbAAu AGMAbwBtAAAAAAAfABoMAQAAABgAAABGAGEAbgAsACAAWgBoAGkAagB1AFgAAAAfAB8MAQAAACoA AAB6AGgAaQBqAHUAeAAuAGYAYQBuAEAAaQBuAHQAZQBsAC4AYwBvAG0AAAAAAB8AHgwBAAAACgAA AFMATQBUAFAAAAAAAAIBGQwBAAAAZAAAAAAAAACBKx+kvqMQGZ1uAN0BD1QCAAAAgEYAYQBuACwA IABaAGgAaQBqAHUAWAAAAFMATQBUAFAAAAB6AGgAaQBqAHUAeAAuAGYAYQBuAEAAaQBuAHQAZQBs AC4AYwBvAG0AAAAfAAFdAQAAACoAAAB6AGgAaQBqAHUAeAAuAGYAYQBuAEAAaQBuAHQAZQBsAC4A YwBvAG0AAAAAAB8A+D8BAAAAGAAAAEYAYQBuACwAIABaAGgAaQBqAHUAWAAAAB8AI0ABAAAAKgAA AHoAaABpAGoAdQB4AC4AZgBhAG4AQABpAG4AdABlAGwALgBjAG8AbQAAAAAAHwAiQAEAAAAKAAAA UwBNAFQAUAAAAAAAAgH5PwEAAABkAAAAAAAAAIErH6S+oxAZnW4A3QEPVAIAAACARgBhAG4ALAAg AFoAaABpAGoAdQBYAAAAUwBNAFQAUAAAAHoAaABpAGoAdQB4AC4AZgBhAG4AQABpAG4AdABlAGwA LgBjAG8AbQAAAB8ACV0BAAAAKgAAAHoAaABpAGoAdQB4AC4AZgBhAG4AQABpAG4AdABlAGwALgBj AG8AbQAAAAAACwBAOgEAAAAfABoAAQAAABIAAABJAFAATQAuAE4AbwB0AGUAAAAAAAMA8T8JBAAA CwBAOgEAAAADAP0/5AQAAAIBCzABAAAAEAAAAN0z717eKDpDq9QVE3uNfRUDABcAAQAAAEAAOQCA YtEckMfVAUAACDB1YyQdkMfVAR8AAICGAwIAAAAAAMAAAAAAAABGAQAAAB4AAABhAGMAYwBlAHAA dABsAGEAbgBnAHUAYQBnAGUAAAAAAAEAAAAMAAAAZQBuAC0AVQBTAAAAHwA3AAEAAACYAAAAWwBQ AEEAVABDAEgAIABWADIAXQAgAEIAYQBzAGUAVABvAG8AbABzADoARgBpAHgAIABHAGUAbgBGAGQA cwAgAGkAcwBzAHUAZQAgAGYAbwByACAAQgB1AGkAbABkAE8AcAB0AGkAbwBuACAAcgBlAHAAbABh AGMAZQAgACAARwBlAG4ARgBkAHMATwBwAHQAaQBvAG4AAAAfAD0AAQAAAAIAAAAAAAAAAwA2AAAA AAACAXEAAQAAABYAAAAB1ceQEo+rTEEHNzNJ4rDUBe7qrdbeAAAfAHAAAQAAAJgAAABbAFAAQQBU AEMASAAgAFYAMgBdACAAQgBhAHMAZQBUAG8AbwBsAHMAOgBGAGkAeAAgAEcAZQBuAEYAZABzACAA aQBzAHMAdQBlACAAZgBvAHIAIABCAHUAaQBsAGQATwBwAHQAaQBvAG4AIAByAGUAcABsAGEAYwBl ACAAIABHAGUAbgBGAGQAcwBPAHAAdABpAG8AbgAAAB8ANRABAAAAkAAAADwARgBBAEQAMABEADcA RQAwAEEARQAwAEYAQQA1ADQARAA5ADgANwBGADYARQA3ADIANAAzADUAQwBBAEYARAA1ADAAQgAw ADAANABDADcAQwBAAFMASABTAE0AUwBYADEAMAAxAC4AYwBjAHIALgBjAG8AcgBwAC4AaQBuAHQA ZQBsAC4AYwBvAG0APgAAAAMA3j+fTgAAQAAHME8/HR2Qx9UBAgELAAEAAAAQAAAA3TPvXt4oOkOr 1BUTe419FQMAJgAAAAAAAgFHAAEAAAAyAAAAYz1VUzthPU1DSTtwPUludGVsO2w9U0hTTVNYMTAx LTIwMDExMDA4Mjk0NVotNzc3OQAAAAIBEDABAAAARgAAAAAAAAAmd705O+w4SaSmFT3LpXtCBwD6 0Nfgrg+lTZh/bnJDXK/VAAAARBFeAACmk2g2iHZsS6dK0+tHmkxkAAAJVMBZAAAAAB8A+j8BAAAA GAAAAEYAYQBuACwAIABaAGgAaQBqAHUAWAAAAAMACVkBAAAAQAAAgAggBgAAAAAAwAAAAAAAAEYA AAAAv4UAAMBNMxyQx9UBCwAAgAggBgAAAAAAwAAAAAAAAEYAAAAAgoUAAAAAAAADAACACCAGAAAA AADAAAAAAAAARgAAAADrhQAACQQAAB8AAICGAwIAAAAAAMAAAAAAAABGAQAAABgAAABkAGwAcAAt AHAAcgBvAGQAdQBjAHQAAAABAAAAGgAAAGQAbABwAGUALQB3AGkAbgBkAG8AdwBzAAAAAAAfAACA hgMCAAAAAADAAAAAAAAARgEAAAAYAAAAZABsAHAALQB2AGUAcgBzAGkAbwBuAAAAAQAAABIAAAAx ADEALgAyAC4AMAAuADYAAAAAAB8AAICGAwIAAAAAAMAAAAAAAABGAQAAABoAAABkAGwAcAAtAHIA ZQBhAGMAdABpAG8AbgAAAAAAAQAAABQAAABuAG8ALQBhAGMAdABpAG8AbgAAAAIBAIAIIAYAAAAA AMAAAAAAAABGAQAAADYAAABJAG4AVAByAGEAbgBzAGkAdABNAGUAcwBzAGEAZwBlAEMAbwByAHIA ZQBsAGEAdABvAHIAAAAAAAEAAAAQAAAAFiY4FaVvgUSSf/k0AfLygQMADTT9PwAAHwAAgIYDAgAA AAAAwAAAAAAAAEYBAAAAIAAAAHgALQBtAHMALQBoAGEAcwAtAGEAdAB0AGEAYwBoAAAAAQAAAAIA AAAAAAAAHwAAgIYDAgAAAAAAwAAAAAAAAEYBAAAAIgAAAHgALQBvAHIAaQBnAGkAbgBhAHQAaQBu AGcALQBpAHAAAAAAAAEAAAAgAAAAWwAxADAALgAyADMAOQAuADEAMgA3AC4ANAAwAF0AAAA7tg== --_000_FAD0D7E0AE0FA54D987F6E72435CAFD50B004C7CSHSMSX101ccrcor_--