From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by mx.groups.io with SMTP id smtpd.web08.7416.1623120643568088771 for ; Mon, 07 Jun 2021 19:50:44 -0700 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: intel.com, ip: 134.134.136.65, mailfrom: bob.c.feng@intel.com) IronPort-SDR: Qj0dcpMMBqZkLdhYnFrrLzHgTsTQJPWwR6EBFzs78kxMABbqdNLsouWx8AsBBZx0WIEBko492Y EUNyVVXBIJdA== X-IronPort-AV: E=McAfee;i="6200,9189,10008"; a="204783668" X-IronPort-AV: E=Sophos;i="5.83,256,1616482800"; d="scan'208";a="204783668" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 Jun 2021 19:50:41 -0700 IronPort-SDR: GKeUcsRIDhvfSuXHZhTPFR/4eNr6u/qlj+2e+K6KkMTWx8AczpS0HkSdPgOfzRHuoabY9xee5e G1BRU97RuCag== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.83,256,1616482800"; d="scan'208";a="447727726" Received: from shwdepsi1121.ccr.corp.intel.com ([10.239.158.137]) by orsmga008.jf.intel.com with ESMTP; 07 Jun 2021 19:50:38 -0700 From: "Bob Feng" To: devel@edk2.groups.io Cc: Liming Gao , Yuwei Chen , Michael D Kinney , Nate DeSimone Subject: [Patch V2] BaseTools: Enable the flag to treat dynamic pcd as dynamicEx Date: Tue, 8 Jun 2021 10:50:14 +0800 Message-Id: <20210608025014.558-1-bob.c.feng@intel.com> X-Mailer: git-send-email 2.29.1.windows.1 MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=3D1688 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 =3D 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 Cc: Liming Gao Cc: Yuwei Chen Cc: Michael D Kinney Cc: Nate DeSimone ---=0D 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 =3D 'DSC_SPECIFICAT= ION' TAB_DSC_DEFINES_OUTPUT_DIRECTORY =3D 'OUTPUT_DIRECTORY'=0D TAB_DSC_DEFINES_SUPPORTED_ARCHITECTURES =3D 'SUPPORTED_ARCHITECTURES'=0D TAB_DSC_DEFINES_BUILD_TARGETS =3D 'BUILD_TARGETS'=0D TAB_DSC_DEFINES_SKUID_IDENTIFIER =3D 'SKUID_IDENTIFIER'=0D TAB_DSC_DEFINES_PCD_INFO_GENERATION =3D 'PCD_INFO_GENERATION'=0D +TAB_DSC_DEFINES_PCD_DYNAMIC_AS_DYNAMICEX =3D 'PCD_DYNAMIC_AS_DYNAMICEX'=0D TAB_DSC_DEFINES_PCD_VAR_CHECK_GENERATION =3D 'PCD_VAR_CHECK_GENERATION'=0D TAB_DSC_DEFINES_FLASH_DEFINITION =3D 'FLASH_DEFINITION'=0D TAB_DSC_DEFINES_BUILD_NUMBER =3D 'BUILD_NUMBER'=0D TAB_DSC_DEFINES_MAKEFILE_NAME =3D 'MAKEFILE_NAME'=0D TAB_DSC_DEFINES_BS_BASE_ADDRESS =3D 'BsBaseAddress'=0D diff --git a/BaseTools/Source/Python/Workspace/BuildClassObject.py b/BaseTo= ols/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=0D import re=0D from collections import OrderedDict=0D from Common.Misc import CopyDict,ArrayIndex=0D import copy=0D +from CommonDataClass.DataClass import *=0D import Common.EdkLogger as EdkLogger=0D +import Common.GlobalData as GlobalData=0D from Common.BuildToolError import OPTION_VALUE_INVALID=0D from Common.caching import cached_property=0D StructPattern =3D re.compile(r'[_a-zA-Z][0-9A-Za-z_\[\]]*$')=0D =0D ## PcdClassObject=0D @@ -396,10 +398,71 @@ class StructurePcd(PcdClassObject): new_pcd.ValueChain =3D {item for item in self.ValueChain}=0D return new_pcd=0D =0D LibraryClassObject =3D namedtuple('LibraryClassObject', ['LibraryClass','S= upModList'])=0D =0D +class BuildData(object):=0D + # dict used to convert PCD type in database to string used by build to= ol=0D +=0D + _PCD_TYPE_STRING_ =3D {=0D + MODEL_PCD_FIXED_AT_BUILD : TAB_PCDS_FIXED_AT_BUILD,=0D + MODEL_PCD_PATCHABLE_IN_MODULE : TAB_PCDS_PATCHABLE_IN_MODULE,= =0D + MODEL_PCD_FEATURE_FLAG : TAB_PCDS_FEATURE_FLAG,=0D + MODEL_PCD_DYNAMIC : TAB_PCDS_DYNAMIC,=0D + MODEL_PCD_DYNAMIC_DEFAULT : TAB_PCDS_DYNAMIC,=0D + MODEL_PCD_DYNAMIC_HII : TAB_PCDS_DYNAMIC_HII,=0D + MODEL_PCD_DYNAMIC_VPD : TAB_PCDS_DYNAMIC_VPD,=0D + MODEL_PCD_DYNAMIC_EX : TAB_PCDS_DYNAMIC_EX,=0D + MODEL_PCD_DYNAMIC_EX_DEFAULT : TAB_PCDS_DYNAMIC_EX,=0D + MODEL_PCD_DYNAMIC_EX_HII : TAB_PCDS_DYNAMIC_EX_HII,=0D + MODEL_PCD_DYNAMIC_EX_VPD : TAB_PCDS_DYNAMIC_EX_VPD,=0D + }=0D +=0D + def UpdatePcdTypeDict(self):=0D + if GlobalData.gCommandLineDefines.get(TAB_DSC_DEFINES_PCD_DYNAMIC_= AS_DYNAMICEX,"FALSE").upper() =3D=3D "TRUE":=0D + self._PCD_TYPE_STRING_ =3D {=0D + MODEL_PCD_FIXED_AT_BUILD : TAB_PCDS_FIXED_AT_BUIL= D,=0D + MODEL_PCD_PATCHABLE_IN_MODULE : TAB_PCDS_PATCHABLE_IN_= MODULE,=0D + MODEL_PCD_FEATURE_FLAG : TAB_PCDS_FEATURE_FLAG,= =0D + MODEL_PCD_DYNAMIC : TAB_PCDS_DYNAMIC_EX,=0D + MODEL_PCD_DYNAMIC_DEFAULT : TAB_PCDS_DYNAMIC_EX,=0D + MODEL_PCD_DYNAMIC_HII : TAB_PCDS_DYNAMIC_EX_HI= I,=0D + MODEL_PCD_DYNAMIC_VPD : TAB_PCDS_DYNAMIC_EX_VP= D,=0D + MODEL_PCD_DYNAMIC_EX : TAB_PCDS_DYNAMIC_EX,=0D + MODEL_PCD_DYNAMIC_EX_DEFAULT : TAB_PCDS_DYNAMIC_EX,=0D + MODEL_PCD_DYNAMIC_EX_HII : TAB_PCDS_DYNAMIC_EX_HI= I,=0D + MODEL_PCD_DYNAMIC_EX_VPD : TAB_PCDS_DYNAMIC_EX_VP= D,=0D + }=0D +=0D + ## Convert the class to a string=0D + #=0D + # Convert member MetaFile of the class to a string=0D + #=0D + # @retval string Formatted String=0D + #=0D + def __str__(self):=0D + return str(self.MetaFile)=0D +=0D + ## Override __eq__ function=0D + #=0D + # Check whether ModuleBuildClassObjects are the same=0D + #=0D + # @retval False The two ModuleBuildClassObjects are different=0D + # @retval True The two ModuleBuildClassObjects are the same=0D + #=0D + def __eq__(self, Other):=0D + return self.MetaFile =3D=3D Other=0D +=0D + ## Override __hash__ function=0D + #=0D + # Use MetaFile as key in hash table=0D + #=0D + # @retval string Key for hash table=0D + #=0D + def __hash__(self):=0D + return hash(self.MetaFile)=0D +=0D ## ModuleBuildClassObject=0D #=0D # This Class defines ModuleBuildClass=0D #=0D # @param object: Inherited from object class=0D @@ -440,11 +503,11 @@ LibraryClassObject =3D namedtuple('LibraryClassObject= ', ['LibraryClass','SupModLis # { [(PcdCName, PcdGuidCName)] : PcdClassObje= ct}=0D # @var BuildOptions: To store value for BuildOptions, it is a se= t structure as=0D # { [BuildOptionKey] : BuildOptionValue}=0D # @var Depex: To store value for Depex=0D #=0D -class ModuleBuildClassObject(object):=0D +class ModuleBuildClassObject(BuildData):=0D def __init__(self):=0D self.AutoGenVersion =3D 0=0D self.MetaFile =3D ''=0D self.BaseName =3D ''=0D self.ModuleType =3D ''=0D @@ -474,38 +537,10 @@ class ModuleBuildClassObject(object): self.BuildOptions =3D {}=0D self.Depex =3D {}=0D self.StrPcdSet =3D []=0D self.StrPcdOverallValue =3D {}=0D =0D - ## Convert the class to a string=0D - #=0D - # Convert member MetaFile of the class to a string=0D - #=0D - # @retval string Formatted String=0D - #=0D - def __str__(self):=0D - return str(self.MetaFile)=0D -=0D - ## Override __eq__ function=0D - #=0D - # Check whether ModuleBuildClassObjects are the same=0D - #=0D - # @retval False The two ModuleBuildClassObjects are different=0D - # @retval True The two ModuleBuildClassObjects are the same=0D - #=0D - def __eq__(self, Other):=0D - return self.MetaFile =3D=3D Other=0D -=0D - ## Override __hash__ function=0D - #=0D - # Use MetaFile as key in hash table=0D - #=0D - # @retval string Key for hash table=0D - #=0D - def __hash__(self):=0D - return hash(self.MetaFile)=0D -=0D ## PackageBuildClassObject=0D #=0D # This Class defines PackageBuildClass=0D #=0D # @param object: Inherited from object class=0D @@ -525,11 +560,11 @@ class ModuleBuildClassObject(object): # @var LibraryClasses: To store value for LibraryClasses, it is a set str= ucture as=0D # { [LibraryClassName] : LibraryClassInfFile }=0D # @var Pcds: To store value for Pcds, it is a set structure as= =0D # { [(PcdCName, PcdGuidCName)] : PcdClassObject}=0D #=0D -class PackageBuildClassObject(object):=0D +class PackageBuildClassObject(BuildData):=0D def __init__(self):=0D self.MetaFile =3D ''=0D self.PackageName =3D ''=0D self.Guid =3D ''=0D self.Version =3D ''=0D @@ -539,38 +574,10 @@ class PackageBuildClassObject(object): self.Guids =3D {}=0D self.Includes =3D []=0D self.LibraryClasses =3D {}=0D self.Pcds =3D {}=0D =0D - ## Convert the class to a string=0D - #=0D - # Convert member MetaFile of the class to a string=0D - #=0D - # @retval string Formatted String=0D - #=0D - def __str__(self):=0D - return str(self.MetaFile)=0D -=0D - ## Override __eq__ function=0D - #=0D - # Check whether PackageBuildClassObjects are the same=0D - #=0D - # @retval False The two PackageBuildClassObjects are different=0D - # @retval True The two PackageBuildClassObjects are the same=0D - #=0D - def __eq__(self, Other):=0D - return self.MetaFile =3D=3D Other=0D -=0D - ## Override __hash__ function=0D - #=0D - # Use MetaFile as key in hash table=0D - #=0D - # @retval string Key for hash table=0D - #=0D - def __hash__(self):=0D - return hash(self.MetaFile)=0D -=0D ## PlatformBuildClassObject=0D #=0D # This Class defines PlatformBuildClass=0D #=0D # @param object: Inherited from object class=0D @@ -595,11 +602,11 @@ class PackageBuildClassObject(object): # @var Pcds: To store value for Pcds, it is a set structure a= s=0D # { [(PcdCName, PcdGuidCName)] : PcdClassObject }= =0D # @var BuildOptions: To store value for BuildOptions, it is a set str= ucture as=0D # { [BuildOptionKey] : BuildOptionValue }=0D #=0D -class PlatformBuildClassObject(object):=0D +class PlatformBuildClassObject(BuildData):=0D def __init__(self):=0D self.MetaFile =3D ''=0D self.PlatformName =3D ''=0D self.Guid =3D ''=0D self.Version =3D ''=0D @@ -614,33 +621,5 @@ class PlatformBuildClassObject(object): self.LibraryInstances =3D []=0D self.LibraryClasses =3D {}=0D self.Libraries =3D {}=0D self.Pcds =3D {}=0D self.BuildOptions =3D {}=0D -=0D - ## Convert the class to a string=0D - #=0D - # Convert member MetaFile of the class to a string=0D - #=0D - # @retval string Formatted String=0D - #=0D - def __str__(self):=0D - return str(self.MetaFile)=0D -=0D - ## Override __eq__ function=0D - #=0D - # Check whether PlatformBuildClassObjects are the same=0D - #=0D - # @retval False The two PlatformBuildClassObjects are different=0D - # @retval True The two PlatformBuildClassObjects are the same=0D - #=0D - def __eq__(self, Other):=0D - return self.MetaFile =3D=3D Other=0D -=0D - ## Override __hash__ function=0D - #=0D - # Use MetaFile as key in hash table=0D - #=0D - # @retval string Key for hash table=0D - #=0D - def __hash__(self):=0D - return hash(self.MetaFile)=0D 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 #=0D # This class is used to retrieve information stored in database and conve= rt them=0D # into PackageBuildClassObject form for easier use for AutoGen.=0D #=0D class DecBuildData(PackageBuildClassObject):=0D - # dict used to convert PCD type in database to string used by build to= ol=0D - _PCD_TYPE_STRING_ =3D {=0D - MODEL_PCD_FIXED_AT_BUILD : TAB_PCDS_FIXED_AT_BUILD,=0D - MODEL_PCD_PATCHABLE_IN_MODULE : TAB_PCDS_PATCHABLE_IN_MODULE,= =0D - MODEL_PCD_FEATURE_FLAG : TAB_PCDS_FEATURE_FLAG,=0D - MODEL_PCD_DYNAMIC : TAB_PCDS_DYNAMIC,=0D - MODEL_PCD_DYNAMIC_DEFAULT : TAB_PCDS_DYNAMIC,=0D - MODEL_PCD_DYNAMIC_HII : TAB_PCDS_DYNAMIC_HII,=0D - MODEL_PCD_DYNAMIC_VPD : TAB_PCDS_DYNAMIC_VPD,=0D - MODEL_PCD_DYNAMIC_EX : TAB_PCDS_DYNAMIC_EX,=0D - MODEL_PCD_DYNAMIC_EX_DEFAULT : TAB_PCDS_DYNAMIC_EX,=0D - MODEL_PCD_DYNAMIC_EX_HII : TAB_PCDS_DYNAMIC_EX_HII,=0D - MODEL_PCD_DYNAMIC_EX_VPD : TAB_PCDS_DYNAMIC_EX_VPD,=0D - }=0D =0D # dict used to convert part of [Defines] to members of DecBuildData di= rectly=0D _PROPERTY_ =3D {=0D #=0D # Required Fields=0D @@ -66,10 +52,11 @@ class DecBuildData(PackageBuildClassObject): self._Bdb =3D BuildDataBase=0D self._Arch =3D Arch=0D self._Target =3D Target=0D self._Toolchain =3D Toolchain=0D self._Clear()=0D + self.UpdatePcdTypeDict()=0D =0D ## XXX[key] =3D value=0D def __setitem__(self, key, value):=0D self.__dict__[self._PROPERTY_[key]] =3D value=0D =0D 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 =3D list(DependencySet) # remove duplicate ones=0D =0D return DependencyList=0D =0D class DscBuildData(PlatformBuildClassObject):=0D - # dict used to convert PCD type in database to string used by build to= ol=0D - _PCD_TYPE_STRING_ =3D {=0D - MODEL_PCD_FIXED_AT_BUILD : TAB_PCDS_FIXED_AT_BUILD,=0D - MODEL_PCD_PATCHABLE_IN_MODULE : TAB_PCDS_PATCHABLE_IN_MODULE,= =0D - MODEL_PCD_FEATURE_FLAG : TAB_PCDS_FEATURE_FLAG,=0D - MODEL_PCD_DYNAMIC : TAB_PCDS_DYNAMIC,=0D - MODEL_PCD_DYNAMIC_DEFAULT : TAB_PCDS_DYNAMIC,=0D - MODEL_PCD_DYNAMIC_HII : TAB_PCDS_DYNAMIC_HII,=0D - MODEL_PCD_DYNAMIC_VPD : TAB_PCDS_DYNAMIC_VPD,=0D - MODEL_PCD_DYNAMIC_EX : TAB_PCDS_DYNAMIC_EX,=0D - MODEL_PCD_DYNAMIC_EX_DEFAULT : TAB_PCDS_DYNAMIC_EX,=0D - MODEL_PCD_DYNAMIC_EX_HII : TAB_PCDS_DYNAMIC_EX_HII,=0D - MODEL_PCD_DYNAMIC_EX_VPD : TAB_PCDS_DYNAMIC_EX_VPD,=0D - }=0D =0D # dict used to convert part of [Defines] to members of DscBuildData di= rectly=0D _PROPERTY_ =3D {=0D #=0D # Required Fields=0D @@ -240,11 +226,11 @@ class DscBuildData(PlatformBuildClassObject): self._ToolChainFamily =3D None=0D self._Clear()=0D self.WorkspaceDir =3D os.getenv("WORKSPACE") if os.getenv("WORKSPA= CE") else ""=0D self.DefaultStores =3D None=0D self.SkuIdMgr =3D SkuClass(self.SkuName, self.SkuIds)=0D -=0D + self.UpdatePcdTypeDict()=0D @property=0D def OutputPath(self):=0D if os.getenv("WORKSPACE"):=0D return os.path.join(os.getenv("WORKSPACE"), self.OutputDirecto= ry, self._Target + "_" + self._Toolchain, PcdValueInitName)=0D else:=0D @@ -409,10 +395,13 @@ class DscBuildData(PlatformBuildClassObject): try:=0D uuid.UUID(Record[2])=0D except:=0D EdkLogger.error("build", FORMAT_INVALID, "Invalid GUID= format for VPD_TOOL_GUID", File=3Dself.MetaFile)=0D self._VpdToolGuid =3D Record[2]=0D + elif Name =3D=3D TAB_DSC_DEFINES_PCD_DYNAMIC_AS_DYNAMICEX:=0D + if TAB_DSC_DEFINES_PCD_DYNAMIC_AS_DYNAMICEX not in gComman= dLineDefines:=0D + gCommandLineDefines[TAB_DSC_DEFINES_PCD_DYNAMIC_AS_DYN= AMICEX] =3D Record[2].strip()=0D elif Name in self:=0D self[Name] =3D Record[2]=0D # set _Header to non-None in order to avoid database re-querying=0D self._Header =3D 'DUMMY'=0D =0D 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 =3D None): #=0D # This class is used to retrieve information stored in database and conve= rt them=0D # into ModuleBuildClassObject form for easier use for AutoGen.=0D #=0D class InfBuildData(ModuleBuildClassObject):=0D - # dict used to convert PCD type in database to string used by build to= ol=0D - _PCD_TYPE_STRING_ =3D {=0D - MODEL_PCD_FIXED_AT_BUILD : TAB_PCDS_FIXED_AT_BUILD,=0D - MODEL_PCD_PATCHABLE_IN_MODULE : TAB_PCDS_PATCHABLE_IN_MODULE,= =0D - MODEL_PCD_FEATURE_FLAG : TAB_PCDS_FEATURE_FLAG,=0D - MODEL_PCD_DYNAMIC : TAB_PCDS_DYNAMIC,=0D - MODEL_PCD_DYNAMIC_DEFAULT : TAB_PCDS_DYNAMIC,=0D - MODEL_PCD_DYNAMIC_HII : TAB_PCDS_DYNAMIC_HII,=0D - MODEL_PCD_DYNAMIC_VPD : TAB_PCDS_DYNAMIC_VPD,=0D - MODEL_PCD_DYNAMIC_EX : TAB_PCDS_DYNAMIC_EX,=0D - MODEL_PCD_DYNAMIC_EX_DEFAULT : TAB_PCDS_DYNAMIC_EX,=0D - MODEL_PCD_DYNAMIC_EX_HII : TAB_PCDS_DYNAMIC_EX_HII,=0D - MODEL_PCD_DYNAMIC_EX_VPD : TAB_PCDS_DYNAMIC_EX_VPD,=0D - }=0D =0D # dict used to convert part of [Defines] to members of InfBuildData di= rectly=0D _PROPERTY_ =3D {=0D #=0D # Required Fields=0D @@ -152,10 +138,11 @@ class InfBuildData(ModuleBuildClassObject): self._GuidsUsedByPcd =3D OrderedDict()=0D self._GuidComments =3D None=0D self._PcdComments =3D None=0D self._BuildOptions =3D None=0D self._DependencyFileList =3D None=0D + self.UpdatePcdTypeDict()=0D self.LibInstances =3D []=0D self.ReferenceModules =3D set()=0D =0D def SetReferenceModule(self,Module):=0D self.ReferenceModules.add(Module)=0D --=20 2.29.1.windows.1