From: "gaoliming" <gaoliming@byosoft.com.cn>
To: "'Feng, Bob C'" <bob.c.feng@intel.com>, <devel@edk2.groups.io>,
"'Chen, Christine'" <yuwei.chen@intel.com>
Cc: "'Kinney, Michael D'" <michael.d.kinney@intel.com>,
"'Desimone, Nathaniel L'" <nathaniel.l.desimone@intel.com>
Subject: 回复: [edk2-devel] [Patch V2] BaseTools: Enable the flag to treat dynamic pcd as dynamicEx
Date: Thu, 1 Jul 2021 13:22:10 +0800 [thread overview]
Message-ID: <011101d76e39$0af41ac0$20dc5040$@byosoft.com.cn> (raw)
In-Reply-To: <DM6PR11MB407303F3AF3B4B7E87E03B29C9009@DM6PR11MB4073.namprd11.prod.outlook.com>
Bob:
This patch is good to me. Reviewed-by: Liming Gao
<gaoliming@byosoft.com.cn>
Have you sent the patch to update DSC spec?
Thanks
Liming
> -----邮件原件-----
> 发件人: Feng, Bob C <bob.c.feng@intel.com>
> 发送时间: 2021年7月1日 11:50
> 收件人: devel@edk2.groups.io; Feng, Bob C <bob.c.feng@intel.com>; Liming
> Gao <gaoliming@byosoft.com.cn>; Chen, Christine <yuwei.chen@intel.com>
> 抄送: Kinney, Michael D <michael.d.kinney@intel.com>; Desimone, Nathaniel
> L <nathaniel.l.desimone@intel.com>
> 主题: RE: [edk2-devel] [Patch V2] BaseTools: Enable the flag to treat
dynamic
> pcd as dynamicEx
>
> Hi Liming and Christine,
>
> Do you have any comments on this patch?
>
> Thanks,
> Bob
>
> -----Original Message-----
> From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Bob Feng
> Sent: Tuesday, June 8, 2021 10:50 AM
> To: devel@edk2.groups.io
> Cc: Liming Gao <gaoliming@byosoft.com.cn>; Chen, Christine
> <yuwei.chen@intel.com>; Kinney, Michael D <michael.d.kinney@intel.com>;
> Desimone, Nathaniel L <nathaniel.l.desimone@intel.com>
> Subject: [edk2-devel] [Patch V2] BaseTools: Enable the flag to treat
dynamic
> pcd as dynamicEx
>
> Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=1688
>
> In order to support binary build, build tool add a flag to convert type of
> Dynamic Pcd to DynamicEx Pcd
>
> User can append -D PCD_DYNAMIC_AS_DYNAMICEX to build command to
> enable this function.
> Also, user can add "PCD_DYNAMIC_AS_DYNAMICEX = TRUE/FALSE"
> to the defines section of Dsc file to enable this function.
>
> PCD_DYNAMIC_AS_DYNAMICEX is a new reserved key word for this function.
>
> Signed-off-by: Bob Feng <bob.c.feng@intel.com>
> Cc: Liming Gao <gaoliming@byosoft.com.cn>
> Cc: Yuwei Chen <yuwei.chen@intel.com>
> Cc: Michael D Kinney <michael.d.kinney@intel.com>
> Cc: Nate DeSimone <nathaniel.l.desimone@intel.com> ---Correct Liming's
> email address.
> BaseTools/Source/Python/Common/DataType.py | 1 +
> .../Python/Workspace/BuildClassObject.py | 153 ++++++++----------
> .../Source/Python/Workspace/DecBuildData.py | 15 +-
> .../Source/Python/Workspace/DscBuildData.py | 19 +--
> .../Source/Python/Workspace/InfBuildData.py | 15 +-
> 5 files changed, 73 insertions(+), 130 deletions(-)
>
> diff --git a/BaseTools/Source/Python/Common/DataType.py
> b/BaseTools/Source/Python/Common/DataType.py
> index fb88f20cc4..4e9c9e34af 100644
> --- a/BaseTools/Source/Python/Common/DataType.py
> +++ b/BaseTools/Source/Python/Common/DataType.py
> @@ -402,10 +402,11 @@ TAB_DSC_DEFINES_DSC_SPECIFICATION =
> 'DSC_SPECIFICATION'
> TAB_DSC_DEFINES_OUTPUT_DIRECTORY = 'OUTPUT_DIRECTORY'
> TAB_DSC_DEFINES_SUPPORTED_ARCHITECTURES =
> 'SUPPORTED_ARCHITECTURES' TAB_DSC_DEFINES_BUILD_TARGETS =
> 'BUILD_TARGETS' TAB_DSC_DEFINES_SKUID_IDENTIFIER =
> 'SKUID_IDENTIFIER' TAB_DSC_DEFINES_PCD_INFO_GENERATION =
> 'PCD_INFO_GENERATION'+TAB_DSC_DEFINES_PCD_DYNAMIC_AS_DYNAMI
> CEX = 'PCD_DYNAMIC_AS_DYNAMICEX'
> TAB_DSC_DEFINES_PCD_VAR_CHECK_GENERATION =
> 'PCD_VAR_CHECK_GENERATION' TAB_DSC_DEFINES_FLASH_DEFINITION =
> 'FLASH_DEFINITION' TAB_DSC_DEFINES_BUILD_NUMBER =
> 'BUILD_NUMBER' TAB_DSC_DEFINES_MAKEFILE_NAME = 'MAKEFILE_NAME'
> TAB_DSC_DEFINES_BS_BASE_ADDRESS = 'BsBaseAddress'diff --git
> a/BaseTools/Source/Python/Workspace/BuildClassObject.py
> b/BaseTools/Source/Python/Workspace/BuildClassObject.py
> index ebb65fc2fe..88a1d1582c 100644
> --- a/BaseTools/Source/Python/Workspace/BuildClassObject.py
> +++ b/BaseTools/Source/Python/Workspace/BuildClassObject.py
> @@ -10,11 +10,13 @@ from Common.DataType import * import
> collections import re from collections import OrderedDict from Common.Misc
> import CopyDict,ArrayIndex import copy+from CommonDataClass.DataClass
> import * import Common.EdkLogger as EdkLogger+import
> Common.GlobalData as GlobalData from Common.BuildToolError import
> OPTION_VALUE_INVALID from Common.caching import cached_property
> StructPattern = re.compile(r'[_a-zA-Z][0-9A-Za-z_\[\]]*$') ##
> PcdClassObject@@ -396,10 +398,71 @@ class
> StructurePcd(PcdClassObject):
> new_pcd.ValueChain = {item for item in self.ValueChain}
> return new_pcd LibraryClassObject = namedtuple('LibraryClassObject',
> ['LibraryClass','SupModList']) +class BuildData(object):+ # dict used
to
> convert PCD type in database to string used by build tool++
> _PCD_TYPE_STRING_ = {+ MODEL_PCD_FIXED_AT_BUILD :
> TAB_PCDS_FIXED_AT_BUILD,+
> MODEL_PCD_PATCHABLE_IN_MODULE :
> TAB_PCDS_PATCHABLE_IN_MODULE,+
> MODEL_PCD_FEATURE_FLAG : TAB_PCDS_FEATURE_FLAG,+
> MODEL_PCD_DYNAMIC : TAB_PCDS_DYNAMIC,+
> MODEL_PCD_DYNAMIC_DEFAULT : TAB_PCDS_DYNAMIC,+
> MODEL_PCD_DYNAMIC_HII : TAB_PCDS_DYNAMIC_HII,+
> MODEL_PCD_DYNAMIC_VPD : TAB_PCDS_DYNAMIC_VPD,+
> MODEL_PCD_DYNAMIC_EX : TAB_PCDS_DYNAMIC_EX,+
> MODEL_PCD_DYNAMIC_EX_DEFAULT : TAB_PCDS_DYNAMIC_EX,+
> MODEL_PCD_DYNAMIC_EX_HII : TAB_PCDS_DYNAMIC_EX_HII,+
> MODEL_PCD_DYNAMIC_EX_VPD :
> TAB_PCDS_DYNAMIC_EX_VPD,+ }++ def UpdatePcdTypeDict(self):+
> if
> GlobalData.gCommandLineDefines.get(TAB_DSC_DEFINES_PCD_DYNAMIC_A
> S_DYNAMICEX,"FALSE").upper() == "TRUE":+
> self._PCD_TYPE_STRING_ = {+
> MODEL_PCD_FIXED_AT_BUILD : TAB_PCDS_FIXED_AT_BUILD,+
> MODEL_PCD_PATCHABLE_IN_MODULE :
> TAB_PCDS_PATCHABLE_IN_MODULE,+
> MODEL_PCD_FEATURE_FLAG : TAB_PCDS_FEATURE_FLAG,+
> MODEL_PCD_DYNAMIC : TAB_PCDS_DYNAMIC_EX,+
> MODEL_PCD_DYNAMIC_DEFAULT : TAB_PCDS_DYNAMIC_EX,+
> MODEL_PCD_DYNAMIC_HII : TAB_PCDS_DYNAMIC_EX_HII,+
> MODEL_PCD_DYNAMIC_VPD :
> TAB_PCDS_DYNAMIC_EX_VPD,+
> MODEL_PCD_DYNAMIC_EX : TAB_PCDS_DYNAMIC_EX,+
> MODEL_PCD_DYNAMIC_EX_DEFAULT : TAB_PCDS_DYNAMIC_EX,+
> MODEL_PCD_DYNAMIC_EX_HII : TAB_PCDS_DYNAMIC_EX_HII,+
> MODEL_PCD_DYNAMIC_EX_VPD :
> TAB_PCDS_DYNAMIC_EX_VPD,+ }++ ## Convert the class
> to a string+ #+ # Convert member MetaFile of the class to a string+
> #+ # @retval string Formatted String+ #+ def __str__(self):+
> return str(self.MetaFile)++ ## Override __eq__ function+ #+ #
> Check whether ModuleBuildClassObjects are the same+ #+ #
> @retval False The two ModuleBuildClassObjects are different+ # @retval
> True The two ModuleBuildClassObjects are the same+ #+ def
> __eq__(self, Other):+ return self.MetaFile == Other++ ##
> Override __hash__ function+ #+ # Use MetaFile as key in hash
> table+ #+ # @retval string Key for hash table+ #+ def
> __hash__(self):+ return hash(self.MetaFile)+ ##
> ModuleBuildClassObject # # This Class defines ModuleBuildClass # # @param
> object: Inherited from object class@@ -440,11 +503,11
> @@ LibraryClassObject = namedtuple('LibraryClassObject',
> ['LibraryClass','SupModLis
> # { [(PcdCName, PcdGuidCName)] :
> PcdClassObject} # @var BuildOptions: To store value for
> BuildOptions, it is a set structure as #
> { [BuildOptionKey] : BuildOptionValue} # @var Depex:
> To store value for Depex #-class ModuleBuildClassObject(object):+class
> ModuleBuildClassObject(BuildData): def __init__(self):
> self.AutoGenVersion = 0 self.MetaFile
> = '' self.BaseName = ''
> self.ModuleType = ''@@ -474,38 +537,10 @@ class
> ModuleBuildClassObject(object):
> self.BuildOptions = {} self.Depex
> = {} self.StrPcdSet = []
> self.StrPcdOverallValue = {} - ## Convert the class to a string-
> #- # Convert member MetaFile of the class to a string- #- #
> @retval string Formatted String- #- def __str__(self):-
> return str(self.MetaFile)-- ## Override __eq__ function- #- #
> Check whether ModuleBuildClassObjects are the same- #- # @retval
> False The two ModuleBuildClassObjects are different- # @retval True
> The two ModuleBuildClassObjects are the same- #- def __eq__(self,
> Other):- return self.MetaFile == Other-- ## Override __hash__
> function- #- # Use MetaFile as key in hash table- #- #
> @retval string Key for hash table- #- def __hash__(self):-
> return hash(self.MetaFile)- ## PackageBuildClassObject # # This Class
defines
> PackageBuildClass # # @param object: Inherited from object
> class@@ -525,11 +560,11 @@ class ModuleBuildClassObject(object):
> # @var LibraryClasses: To store value for LibraryClasses, it is a set
> structure as # { [LibraryClassName] :
> LibraryClassInfFile } # @var Pcds: To store value for Pcds, it
is a
> set structure as # { [(PcdCName,
> PcdGuidCName)] : PcdClassObject} #-class
> PackageBuildClassObject(object):+class PackageBuildClassObject(BuildData):
> def __init__(self): self.MetaFile = ''
> self.PackageName = '' self.Guid
> = '' self.Version = ''@@ -539,38 +574,10 @@
> class PackageBuildClassObject(object):
> self.Guids = {} self.Includes
> = [] self.LibraryClasses = {} self.Pcds
> = {} - ## Convert the class to a string- #- # Convert member
> MetaFile of the class to a string- #- # @retval string Formatted
> String- #- def __str__(self):- return str(self.MetaFile)--
> ## Override __eq__ function- #- # Check whether
> PackageBuildClassObjects are the same- #- # @retval False The two
> PackageBuildClassObjects are different- # @retval True The two
> PackageBuildClassObjects are the same- #- def __eq__(self, Other):-
> return self.MetaFile == Other-- ## Override __hash__ function- #-
> # Use MetaFile as key in hash table- #- # @retval string Key for
hash
> table- #- def __hash__(self):- return hash(self.MetaFile)- ##
> PlatformBuildClassObject # # This Class defines PlatformBuildClass # #
> @param object: Inherited from object class@@ -595,11 +602,11
> @@ class PackageBuildClassObject(object):
> # @var Pcds: To store value for Pcds, it is a set structure
as
> # { [(PcdCName, PcdGuidCName)] :
> PcdClassObject } # @var BuildOptions: To store value for
BuildOptions,
> it is a set structure as # { [BuildOptionKey] :
> BuildOptionValue } #-class PlatformBuildClassObject(object):+class
> PlatformBuildClassObject(BuildData): def __init__(self):
> self.MetaFile = '' self.PlatformName
> = '' self.Guid = '' self.Version
> = ''@@ -614,33 +621,5 @@ class PlatformBuildClassObject(object):
> self.LibraryInstances = [] self.LibraryClasses
> = {} self.Libraries = {} self.Pcds
> = {} self.BuildOptions = {}-- ## Convert the class
> to a string- #- # Convert member MetaFile of the class to a string-
> #- # @retval string Formatted String- #- def __str__(self):-
> return str(self.MetaFile)-- ## Override __eq__ function- #- #
> Check whether PlatformBuildClassObjects are the same- #- #
> @retval False The two PlatformBuildClassObjects are different- #
> @retval True The two PlatformBuildClassObjects are the same- #-
> def __eq__(self, Other):- return self.MetaFile == Other-- ##
> Override __hash__ function- #- # Use MetaFile as key in hash table-
> #- # @retval string Key for hash table- #- def __hash__(self):-
> return hash(self.MetaFile)diff --git
> a/BaseTools/Source/Python/Workspace/DecBuildData.py
> b/BaseTools/Source/Python/Workspace/DecBuildData.py
> index 30826a3cea..da7a52c5d0 100644
> --- a/BaseTools/Source/Python/Workspace/DecBuildData.py
> +++ b/BaseTools/Source/Python/Workspace/DecBuildData.py
> @@ -19,24 +19,10 @@ from re import compile
> # # This class is used to retrieve information stored in database and
> convert them # into PackageBuildClassObject form for easier use for
AutoGen.
> # class DecBuildData(PackageBuildClassObject):- # dict used to convert
> PCD type in database to string used by build tool- _PCD_TYPE_STRING_ =
> {- MODEL_PCD_FIXED_AT_BUILD :
> TAB_PCDS_FIXED_AT_BUILD,-
> MODEL_PCD_PATCHABLE_IN_MODULE :
> TAB_PCDS_PATCHABLE_IN_MODULE,-
> MODEL_PCD_FEATURE_FLAG : TAB_PCDS_FEATURE_FLAG,-
> MODEL_PCD_DYNAMIC : TAB_PCDS_DYNAMIC,-
> MODEL_PCD_DYNAMIC_DEFAULT : TAB_PCDS_DYNAMIC,-
> MODEL_PCD_DYNAMIC_HII : TAB_PCDS_DYNAMIC_HII,-
> MODEL_PCD_DYNAMIC_VPD : TAB_PCDS_DYNAMIC_VPD,-
> MODEL_PCD_DYNAMIC_EX : TAB_PCDS_DYNAMIC_EX,-
> MODEL_PCD_DYNAMIC_EX_DEFAULT : TAB_PCDS_DYNAMIC_EX,-
> MODEL_PCD_DYNAMIC_EX_HII : TAB_PCDS_DYNAMIC_EX_HII,-
> MODEL_PCD_DYNAMIC_EX_VPD :
> TAB_PCDS_DYNAMIC_EX_VPD,- } # dict used to convert part of
> [Defines] to members of DecBuildData directly _PROPERTY_ =
> { # # Required Fields@@ -66,10 +52,11 @@ class
> DecBuildData(PackageBuildClassObject):
> self._Bdb = BuildDataBase self._Arch = Arch
> self._Target = Target self._Toolchain = Toolchain
> self._Clear()+ self.UpdatePcdTypeDict() ## XXX[key] = value
> def __setitem__(self, key, value):
> self.__dict__[self._PROPERTY_[key]] = value diff --git
> a/BaseTools/Source/Python/Workspace/DscBuildData.py
> b/BaseTools/Source/Python/Workspace/DscBuildData.py
> index 5f07d3e75c..4d5b1ad4d9 100644
> --- a/BaseTools/Source/Python/Workspace/DscBuildData.py
> +++ b/BaseTools/Source/Python/Workspace/DscBuildData.py
> @@ -177,24 +177,10 @@ def GetDependencyList(FileStack, SearchPathList):
> DependencyList = list(DependencySet) # remove duplicate ones
> return DependencyList class DscBuildData(PlatformBuildClassObject):-
> # dict used to convert PCD type in database to string used by build tool-
> _PCD_TYPE_STRING_ = {- MODEL_PCD_FIXED_AT_BUILD :
> TAB_PCDS_FIXED_AT_BUILD,-
> MODEL_PCD_PATCHABLE_IN_MODULE :
> TAB_PCDS_PATCHABLE_IN_MODULE,-
> MODEL_PCD_FEATURE_FLAG : TAB_PCDS_FEATURE_FLAG,-
> MODEL_PCD_DYNAMIC : TAB_PCDS_DYNAMIC,-
> MODEL_PCD_DYNAMIC_DEFAULT : TAB_PCDS_DYNAMIC,-
> MODEL_PCD_DYNAMIC_HII : TAB_PCDS_DYNAMIC_HII,-
> MODEL_PCD_DYNAMIC_VPD : TAB_PCDS_DYNAMIC_VPD,-
> MODEL_PCD_DYNAMIC_EX : TAB_PCDS_DYNAMIC_EX,-
> MODEL_PCD_DYNAMIC_EX_DEFAULT : TAB_PCDS_DYNAMIC_EX,-
> MODEL_PCD_DYNAMIC_EX_HII : TAB_PCDS_DYNAMIC_EX_HII,-
> MODEL_PCD_DYNAMIC_EX_VPD :
> TAB_PCDS_DYNAMIC_EX_VPD,- } # dict used to convert part of
> [Defines] to members of DscBuildData directly _PROPERTY_ =
> { # # Required Fields@@ -240,11 +226,11 @@ class
> DscBuildData(PlatformBuildClassObject):
> self._ToolChainFamily = None self._Clear()
> self.WorkspaceDir = os.getenv("WORKSPACE") if os.getenv("WORKSPACE")
> else "" self.DefaultStores = None self.SkuIdMgr =
> SkuClass(self.SkuName, self.SkuIds)-+ self.UpdatePcdTypeDict()
> @property def OutputPath(self): if os.getenv("WORKSPACE"):
> return os.path.join(os.getenv("WORKSPACE"), self.OutputDirectory,
> self._Target + "_" + self._Toolchain, PcdValueInitName) else:@@
> -409,10 +395,13 @@ class DscBuildData(PlatformBuildClassObject):
> try: uuid.UUID(Record[2])
> except: EdkLogger.error("build", FORMAT_INVALID,
> "Invalid GUID format for VPD_TOOL_GUID", File=self.MetaFile)
> self._VpdToolGuid = Record[2]+ elif Name ==
> TAB_DSC_DEFINES_PCD_DYNAMIC_AS_DYNAMICEX:+ if
> TAB_DSC_DEFINES_PCD_DYNAMIC_AS_DYNAMICEX not in
> gCommandLineDefines:+
> gCommandLineDefines[TAB_DSC_DEFINES_PCD_DYNAMIC_AS_DYNAMICEX]
> = Record[2].strip() elif Name in self:
> self[Name] = Record[2] # set _Header to non-None in order to
> avoid database re-querying self._Header = 'DUMMY' diff --git
> a/BaseTools/Source/Python/Workspace/InfBuildData.py
> b/BaseTools/Source/Python/Workspace/InfBuildData.py
> index 7675b0ea00..45b8ef4716 100644
> --- a/BaseTools/Source/Python/Workspace/InfBuildData.py
> +++ b/BaseTools/Source/Python/Workspace/InfBuildData.py
> @@ -57,24 +57,10 @@ def _PpiValue(CName, PackageList, Inffile = None):
> # # This class is used to retrieve information stored in database and
> convert them # into ModuleBuildClassObject form for easier use for
AutoGen.
> # class InfBuildData(ModuleBuildClassObject):- # dict used to convert
> PCD type in database to string used by build tool- _PCD_TYPE_STRING_ =
> {- MODEL_PCD_FIXED_AT_BUILD :
> TAB_PCDS_FIXED_AT_BUILD,-
> MODEL_PCD_PATCHABLE_IN_MODULE :
> TAB_PCDS_PATCHABLE_IN_MODULE,-
> MODEL_PCD_FEATURE_FLAG : TAB_PCDS_FEATURE_FLAG,-
> MODEL_PCD_DYNAMIC : TAB_PCDS_DYNAMIC,-
> MODEL_PCD_DYNAMIC_DEFAULT : TAB_PCDS_DYNAMIC,-
> MODEL_PCD_DYNAMIC_HII : TAB_PCDS_DYNAMIC_HII,-
> MODEL_PCD_DYNAMIC_VPD : TAB_PCDS_DYNAMIC_VPD,-
> MODEL_PCD_DYNAMIC_EX : TAB_PCDS_DYNAMIC_EX,-
> MODEL_PCD_DYNAMIC_EX_DEFAULT : TAB_PCDS_DYNAMIC_EX,-
> MODEL_PCD_DYNAMIC_EX_HII : TAB_PCDS_DYNAMIC_EX_HII,-
> MODEL_PCD_DYNAMIC_EX_VPD :
> TAB_PCDS_DYNAMIC_EX_VPD,- } # dict used to convert part of
> [Defines] to members of InfBuildData directly _PROPERTY_ =
> { # # Required Fields@@ -152,10 +138,11 @@ class
> InfBuildData(ModuleBuildClassObject):
> self._GuidsUsedByPcd = OrderedDict()
> self._GuidComments = None self._PcdComments = None
> self._BuildOptions = None self._DependencyFileList = None+
> self.UpdatePcdTypeDict() self.LibInstances = []
> self.ReferenceModules = set() def SetReferenceModule(self,Module):
> self.ReferenceModules.add(Module)--
> 2.29.1.windows.1
>
>
>
> -=-=-=-=-=-=
> Groups.io Links: You receive all messages sent to this group.
> View/Reply Online (#76176): https://edk2.groups.io/g/devel/message/76176
> Mute This Topic: https://groups.io/mt/83388055/1768742
> Group Owner: devel+owner@edk2.groups.io
> Unsubscribe: https://edk2.groups.io/g/devel/unsub [bob.c.feng@intel.com]
> -=-=-=-=-=-=
>
next prev parent reply other threads:[~2021-07-01 5:22 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <16867BA05B2FF24C.10003@groups.io>
2021-06-15 0:52 ` [edk2-devel] [Patch V2] BaseTools: Enable the flag to treat dynamic pcd as dynamicEx Bob Feng
2021-07-01 3:50 ` Bob Feng
2021-07-01 5:22 ` gaoliming [this message]
2021-07-12 2:43 ` Bob Feng
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='011101d76e39$0af41ac0$20dc5040$@byosoft.com.cn' \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox