BaseTools: Decouple AutoGen Objects
BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=1875 1. Separate the AutoGen.py into 3 small py files. One is for AutoGen base class, one is for WorkspaceAutoGen class and PlatformAutoGen class, and the one for ModuleAutoGen class. 2. Create a new class DataPipe to store the Platform scope settings. Create a new class PlatformInfo to provide the same interface as PlatformAutoGen. PlatformInfo class is initialized by DataPipe instance. Create a new class WorkspaceInfo to provide the same interface as WorkspaceAutoGen. WorkspaceInfo class is initialized by DataPipe instance. 3. Change ModuleAutoGen to depends on DataPipe, PlatformInfo and WorkspaceInfo. Remove the dependency of ModuleAutoGen to PlatformAutoGen. Cc: Liming Gao <liming.gao@intel.com> Cc: Steven Shi <steven.shi@intel.com> Signed-off-by: Bob Feng <bob.c.feng@intel.com> Acked-by: Laszlo Ersek <lersek@redhat.com> Tested-by: Laszlo Ersek <lersek@redhat.com> Acked-by: Liming Gao <liming.gao@intel.com>
This commit is contained in:
@ -1373,11 +1373,11 @@ class DscBuildData(PlatformBuildClassObject):
|
||||
self._PCD_TYPE_STRING_[MODEL_PCD_FEATURE_FLAG],
|
||||
self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC],
|
||||
self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX]]:
|
||||
self.Pcds[Name, Guid] = copy.deepcopy(PcdInDec)
|
||||
self.Pcds[Name, Guid].DefaultValue = NoFiledValues[( Guid, Name)][0]
|
||||
self._Pcds[Name, Guid] = copy.deepcopy(PcdInDec)
|
||||
self._Pcds[Name, Guid].DefaultValue = NoFiledValues[( Guid, Name)][0]
|
||||
if PcdInDec.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC],
|
||||
self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX]]:
|
||||
self.Pcds[Name, Guid].SkuInfoList = {TAB_DEFAULT:SkuInfoClass(TAB_DEFAULT, self.SkuIds[TAB_DEFAULT][0], '', '', '', '', '', NoFiledValues[( Guid, Name)][0])}
|
||||
self._Pcds[Name, Guid].SkuInfoList = {TAB_DEFAULT:SkuInfoClass(TAB_DEFAULT, self.SkuIds[TAB_DEFAULT][0], '', '', '', '', '', NoFiledValues[( Guid, Name)][0])}
|
||||
return AllPcds
|
||||
|
||||
def OverrideByFdfOverAll(self,AllPcds):
|
||||
@ -1419,8 +1419,8 @@ class DscBuildData(PlatformBuildClassObject):
|
||||
if PcdInDec.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD],
|
||||
self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE],
|
||||
self._PCD_TYPE_STRING_[MODEL_PCD_FEATURE_FLAG]]:
|
||||
self.Pcds[Name, Guid] = copy.deepcopy(PcdInDec)
|
||||
self.Pcds[Name, Guid].DefaultValue = Value
|
||||
self._Pcds[Name, Guid] = copy.deepcopy(PcdInDec)
|
||||
self._Pcds[Name, Guid].DefaultValue = Value
|
||||
return AllPcds
|
||||
|
||||
def ParsePcdNameStruct(self,NamePart1,NamePart2):
|
||||
|
@ -154,6 +154,13 @@ class InfBuildData(ModuleBuildClassObject):
|
||||
self._PcdComments = None
|
||||
self._BuildOptions = None
|
||||
self._DependencyFileList = None
|
||||
self.LibInstances = []
|
||||
self.ReferenceModules = set()
|
||||
self.Guids
|
||||
self.Pcds
|
||||
def SetReferenceModule(self,Module):
|
||||
self.ReferenceModules.add(Module)
|
||||
return self
|
||||
|
||||
## XXX[key] = value
|
||||
def __setitem__(self, key, value):
|
||||
@ -705,6 +712,25 @@ class InfBuildData(ModuleBuildClassObject):
|
||||
return RetVal
|
||||
|
||||
@cached_property
|
||||
def ModulePcdList(self):
|
||||
RetVal = self.Pcds
|
||||
return RetVal
|
||||
@cached_property
|
||||
def LibraryPcdList(self):
|
||||
if bool(self.LibraryClass):
|
||||
return []
|
||||
RetVal = {}
|
||||
Pcds = set()
|
||||
for Library in self.LibInstances:
|
||||
PcdsInLibrary = OrderedDict()
|
||||
for Key in Library.Pcds:
|
||||
if Key in self.Pcds or Key in Pcds:
|
||||
continue
|
||||
Pcds.add(Key)
|
||||
PcdsInLibrary[Key] = copy.copy(Library.Pcds[Key])
|
||||
RetVal[Library] = PcdsInLibrary
|
||||
return RetVal
|
||||
@cached_property
|
||||
def PcdsName(self):
|
||||
PcdsName = set()
|
||||
for Type in (MODEL_PCD_FIXED_AT_BUILD,MODEL_PCD_PATCHABLE_IN_MODULE,MODEL_PCD_FEATURE_FLAG,MODEL_PCD_DYNAMIC,MODEL_PCD_DYNAMIC_EX):
|
||||
@ -1030,3 +1056,6 @@ class InfBuildData(ModuleBuildClassObject):
|
||||
if (self.Binaries and not self.Sources) or GlobalData.gIgnoreSource:
|
||||
return True
|
||||
return False
|
||||
def ExtendCopyDictionaryLists(CopyToDict, CopyFromDict):
|
||||
for Key in CopyFromDict:
|
||||
CopyToDict[Key].extend(CopyFromDict[Key])
|
||||
|
@ -88,6 +88,8 @@ def GetLiabraryInstances(Module, Platform, BuildDatabase, Arch, Target, Toolchai
|
||||
return GetModuleLibInstances(Module, Platform, BuildDatabase, Arch, Target, Toolchain)
|
||||
|
||||
def GetModuleLibInstances(Module, Platform, BuildDatabase, Arch, Target, Toolchain, FileName = '', EdkLogger = None):
|
||||
if Module.LibInstances:
|
||||
return Module.LibInstances
|
||||
ModuleType = Module.ModuleType
|
||||
|
||||
# add forced library instances (specified under LibraryClasses sections)
|
||||
@ -246,4 +248,6 @@ def GetModuleLibInstances(Module, Platform, BuildDatabase, Arch, Target, Toolcha
|
||||
# The DAG Topo sort produces the destructor order, so the list of constructors must generated in the reverse order
|
||||
#
|
||||
SortedLibraryList.reverse()
|
||||
Module.LibInstances = SortedLibraryList
|
||||
SortedLibraryList = [lib.SetReferenceModule(Module) for lib in SortedLibraryList]
|
||||
return SortedLibraryList
|
||||
|
@ -62,6 +62,8 @@ class WorkspaceDatabase(object):
|
||||
}
|
||||
|
||||
_CACHE_ = {} # (FilePath, Arch) : <object>
|
||||
def GetCache(self):
|
||||
return self._CACHE_
|
||||
|
||||
# constructor
|
||||
def __init__(self, WorkspaceDb):
|
||||
@ -203,6 +205,7 @@ class WorkspaceDatabase(object):
|
||||
EdkLogger.error('build', PARSER_ERROR, "Failed to parser DSC file: %s" % Dscfile)
|
||||
return Platform
|
||||
|
||||
BuildDB = WorkspaceDatabase()
|
||||
##
|
||||
#
|
||||
# This acts like the main() function for the script, unless it is 'import'ed into another
|
||||
|
Reference in New Issue
Block a user