From 197ca7febf8668be505ff904f75b97f9e465df82 Mon Sep 17 00:00:00 2001 From: "Feng, Bob C" Date: Mon, 27 May 2019 22:19:25 +0800 Subject: [PATCH] BaseTools: Add functions to get platform scope build options BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=1875 These functions are used for get platform scope build options. They will be used in later patches. Cc: Liming Gao Signed-off-by: Bob Feng Acked-by: Laszlo Ersek Tested-by: Laszlo Ersek Acked-by: Liming Gao --- BaseTools/Source/Python/AutoGen/AutoGen.py | 10 +++++++++- .../Source/Python/Workspace/DscBuildData.py | 20 +++++++++++++++++++ .../Source/Python/Workspace/InfBuildData.py | 10 ++++++++++ 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/BaseTools/Source/Python/AutoGen/AutoGen.py b/BaseTools/Source/Python/AutoGen/AutoGen.py index 122696f5ce..bb0da46d74 100644 --- a/BaseTools/Source/Python/AutoGen/AutoGen.py +++ b/BaseTools/Source/Python/AutoGen/AutoGen.py @@ -2486,7 +2486,15 @@ class PlatformAutoGen(AutoGen): else: BuildOptions[Tool][Attr] = Options[Key] return BuildOptions - + def GetGlobalBuildOptions(self,Module): + ModuleTypeOptions = self.Platform.GetBuildOptionsByPkg(Module, Module.ModuleType) + ModuleTypeOptions = self._ExpandBuildOption(ModuleTypeOptions) + if Module in self.Platform.Modules: + PlatformModule = self.Platform.Modules[str(Module)] + PlatformModuleOptions = self._ExpandBuildOption(PlatformModule.BuildOptions) + else: + PlatformModuleOptions = {} + return ModuleTypeOptions, PlatformModuleOptions ## Append build options in platform to a module # # @param Module The module to which the build options will be appended diff --git a/BaseTools/Source/Python/Workspace/DscBuildData.py b/BaseTools/Source/Python/Workspace/DscBuildData.py index 987d9cf13e..fa41e57c4f 100644 --- a/BaseTools/Source/Python/Workspace/DscBuildData.py +++ b/BaseTools/Source/Python/Workspace/DscBuildData.py @@ -1224,7 +1224,27 @@ class DscBuildData(PlatformBuildClassObject): if ' ' + Option not in self._BuildOptions[CurKey]: self._BuildOptions[CurKey] += ' ' + Option return self._BuildOptions + def GetBuildOptionsByPkg(self, Module, ModuleType): + local_pkg = os.path.split(Module.LocalPkg())[0] + if self._ModuleTypeOptions is None: + self._ModuleTypeOptions = OrderedDict() + if ModuleType not in self._ModuleTypeOptions: + options = OrderedDict() + self._ModuleTypeOptions[ ModuleType] = options + RecordList = self._RawData[MODEL_META_DATA_BUILD_OPTION, self._Arch] + for ToolChainFamily, ToolChain, Option, Dummy1, Dummy2, Dummy3, Dummy4, Dummy5 in RecordList: + if Dummy2 not in (TAB_COMMON,local_pkg.upper(),"EDKII"): + continue + Type = Dummy3 + if Type.upper() == ModuleType.upper(): + Key = (ToolChainFamily, ToolChain) + if Key not in options or not ToolChain.endswith('_FLAGS') or Option.startswith('='): + options[Key] = Option + else: + if ' ' + Option not in options[Key]: + options[Key] += ' ' + Option + return self._ModuleTypeOptions[ModuleType] def GetBuildOptionsByModuleType(self, Edk, ModuleType): if self._ModuleTypeOptions is None: self._ModuleTypeOptions = OrderedDict() diff --git a/BaseTools/Source/Python/Workspace/InfBuildData.py b/BaseTools/Source/Python/Workspace/InfBuildData.py index 60970cd928..da35391d3a 100644 --- a/BaseTools/Source/Python/Workspace/InfBuildData.py +++ b/BaseTools/Source/Python/Workspace/InfBuildData.py @@ -819,7 +819,17 @@ class InfBuildData(ModuleBuildClassObject): for Arch, ModuleType in TemporaryDictionary: RetVal[Arch, ModuleType] = TemporaryDictionary[Arch, ModuleType] return RetVal + def LocalPkg(self): + module_path = self.MetaFile.File + subdir = os.path.split(module_path)[0] + TopDir = "" + while subdir: + subdir,TopDir = os.path.split(subdir) + for file_name in os.listdir(os.path.join(self.MetaFile.Root,TopDir)): + if file_name.upper().endswith("DEC"): + pkg = os.path.join(TopDir,file_name) + return pkg @cached_class_function def GetGuidsUsedByPcd(self): self.Pcds