From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: intel.com, ip: 134.134.136.20, mailfrom: bob.c.feng@intel.com) Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by groups.io with SMTP; Tue, 09 Apr 2019 00:58:56 -0700 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga004.jf.intel.com ([10.7.209.38]) by orsmga101.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 09 Apr 2019 00:58:56 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.60,328,1549958400"; d="scan'208";a="289962046" Received: from shwdepsi1121.ccr.corp.intel.com ([10.239.158.47]) by orsmga004.jf.intel.com with ESMTP; 09 Apr 2019 00:58:55 -0700 From: "BobCF" To: devel@edk2.groups.io Cc: Bob Feng , Liming Gao Subject: [Patch] BaseTools: Add a build option to treat DynPcd as DynExPcd Date: Tue, 9 Apr 2019 15:58:22 +0800 Message-Id: <20190409075822.25408-1-bob.c.feng@intel.com> X-Mailer: git-send-email 2.20.1.windows.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit BZ: 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. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Bob Feng Cc: Liming Gao --- .../Python/Workspace/BuildClassObject.py | 153 ++++++++---------- .../Source/Python/Workspace/DecBuildData.py | 16 +- .../Source/Python/Workspace/DscBuildData.py | 16 +- .../Source/Python/Workspace/InfBuildData.py | 15 +- 4 files changed, 69 insertions(+), 131 deletions(-) diff --git a/BaseTools/Source/Python/Workspace/BuildClassObject.py b/BaseTools/Source/Python/Workspace/BuildClassObject.py index 3213855e70..36201284e7 100644 --- a/BaseTools/Source/Python/Workspace/BuildClassObject.py +++ b/BaseTools/Source/Python/Workspace/BuildClassObject.py @@ -16,10 +16,12 @@ from Common.DataType import * import collections import re from collections import OrderedDict from Common.Misc import CopyDict import copy +from CommonDataClass.DataClass import * +import Common.GlobalData as GlobalData StructPattern = re.compile(r'[_a-zA-Z][0-9A-Za-z_\[\]]*$') ArrayIndex = re.compile("\[\s*[0-9a-fA-FxX]*\s*\]") ## PcdClassObject # # This Class is used for PcdObject @@ -356,10 +358,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("PCD_DYNAMIC_AS_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 @@ -400,11 +463,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 = '' @@ -432,38 +495,10 @@ class ModuleBuildClassObject(object): self.Packages = [] self.Pcds = {} self.BuildOptions = {} self.Depex = {} - ## 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 @@ -483,11 +518,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 = '' @@ -497,38 +532,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 @@ -553,11 +560,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 = '' @@ -572,33 +579,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 149c057b70..53d656335e 100644 --- a/BaseTools/Source/Python/Workspace/DecBuildData.py +++ b/BaseTools/Source/Python/Workspace/DecBuildData.py @@ -25,24 +25,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 @@ -51,11 +37,10 @@ class DecBuildData(PackageBuildClassObject): TAB_DEC_DEFINES_PACKAGE_GUID : "_Guid", TAB_DEC_DEFINES_PACKAGE_VERSION : "_Version", TAB_DEC_DEFINES_PKG_UNI_FILE : "_PkgUniFile", } - ## Constructor of DecBuildData # # Initialize object of DecBuildData # # @param FilePath The path of package description file @@ -72,10 +57,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 129c0c950b..ce1a62e63e 100644 --- a/BaseTools/Source/Python/Workspace/DscBuildData.py +++ b/BaseTools/Source/Python/Workspace/DscBuildData.py @@ -186,24 +186,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 @@ -249,11 +235,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: diff --git a/BaseTools/Source/Python/Workspace/InfBuildData.py b/BaseTools/Source/Python/Workspace/InfBuildData.py index 9fed1198fd..cc547ce9d4 100644 --- a/BaseTools/Source/Python/Workspace/InfBuildData.py +++ b/BaseTools/Source/Python/Workspace/InfBuildData.py @@ -63,24 +63,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 @@ -158,10 +144,11 @@ class InfBuildData(ModuleBuildClassObject): self._GuidsUsedByPcd = OrderedDict() self._GuidComments = None self._PcdComments = None self._BuildOptions = None self._DependencyFileList = None + self.UpdatePcdTypeDict() ## XXX[key] = value def __setitem__(self, key, value): self.__dict__[self._PROPERTY_[key]] = value -- 2.20.1.windows.1