## @file # Create makefile for MS nmake and GNU make # # Copyright (c) 2019, Intel Corporation. All rights reserved.
# SPDX-License-Identifier: BSD-2-Clause-Patent # from __future__ import absolute_import from Workspace.WorkspaceDatabase import BuildDB from Workspace.WorkspaceCommon import GetModuleLibInstances import Common.GlobalData as GlobalData import os import pickle from pickle import HIGHEST_PROTOCOL from Common import EdkLogger class PCD_DATA(): def __init__(self,TokenCName,TokenSpaceGuidCName,Type,DatumType,SkuInfoList,DefaultValue, MaxDatumSize,UserDefinedDefaultStoresFlag,validateranges, validlists,expressions,CustomAttribute,TokenValue): self.TokenCName = TokenCName self.TokenSpaceGuidCName = TokenSpaceGuidCName self.Type = Type self.DatumType = DatumType self.SkuInfoList = SkuInfoList self.DefaultValue = DefaultValue self.MaxDatumSize = MaxDatumSize self.UserDefinedDefaultStoresFlag = UserDefinedDefaultStoresFlag self.validateranges = validateranges self.validlists = validlists self.expressions = expressions self.CustomAttribute = CustomAttribute self.TokenValue = TokenValue class DataPipe(object): def __init__(self, BuildDir=None): self.data_container = {} self.BuildDir = BuildDir self.dump_file = "" class MemoryDataPipe(DataPipe): def Get(self,key): return self.data_container.get(key) def dump(self,file_path): self.dump_file = file_path with open(file_path,'wb') as fd: pickle.dump(self.data_container,fd,pickle.HIGHEST_PROTOCOL) def load(self,file_path): with open(file_path,'rb') as fd: self.data_container = pickle.load(fd) @property def DataContainer(self): return self.data_container @DataContainer.setter def DataContainer(self,data): self.data_container.update(data) def FillData(self,PlatformInfo): #Platform Pcds self.DataContainer = { "PLA_PCD" : [PCD_DATA( pcd.TokenCName,pcd.TokenSpaceGuidCName,pcd.Type, pcd.DatumType,pcd.SkuInfoList,pcd.DefaultValue, pcd.MaxDatumSize,pcd.UserDefinedDefaultStoresFlag,pcd.validateranges, pcd.validlists,pcd.expressions,pcd.CustomAttribute,pcd.TokenValue) for pcd in PlatformInfo.Platform.Pcds.values()] } #Platform Module Pcds ModulePcds = {} for m in PlatformInfo.Platform.Modules: module = PlatformInfo.Platform.Modules[m] m_pcds = module.Pcds if m_pcds: ModulePcds[module.Guid] = [PCD_DATA( pcd.TokenCName,pcd.TokenSpaceGuidCName,pcd.Type, pcd.DatumType,pcd.SkuInfoList,pcd.DefaultValue, pcd.MaxDatumSize,pcd.UserDefinedDefaultStoresFlag,pcd.validateranges, pcd.validlists,pcd.expressions,pcd.CustomAttribute,pcd.TokenValue) for pcd in PlatformInfo.Platform.Modules[m].Pcds.values()] self.DataContainer = {"MOL_PCDS":ModulePcds} #Module's Library Instance ModuleLibs = {} libModules = {} for m in PlatformInfo.Platform.Modules: module_obj = BuildDB.BuildObject[m,PlatformInfo.Arch,PlatformInfo.BuildTarget,PlatformInfo.ToolChain] Libs = GetModuleLibInstances(module_obj, PlatformInfo.Platform, BuildDB.BuildObject, PlatformInfo.Arch,PlatformInfo.BuildTarget,PlatformInfo.ToolChain,PlatformInfo.MetaFile,EdkLogger) for lib in Libs: try: libModules[(lib.MetaFile.File,lib.MetaFile.Root,lib.Arch,lib.MetaFile.Path)].append((m.File,m.Root,module_obj.Arch,m.Path)) except: libModules[(lib.MetaFile.File,lib.MetaFile.Root,lib.Arch,lib.MetaFile.Path)] = [(m.File,m.Root,module_obj.Arch,m.Path)] ModuleLibs[(m.File,m.Root,module_obj.Arch,m.Path)] = [(l.MetaFile.File,l.MetaFile.Root,l.Arch,l.MetaFile.Path) for l in Libs] self.DataContainer = {"DEPS":ModuleLibs} self.DataContainer = {"REFS":libModules} #Platform BuildOptions platform_build_opt = PlatformInfo.EdkIIBuildOption ToolDefinition = PlatformInfo.ToolDefinition module_build_opt = {} for m in PlatformInfo.Platform.Modules: ModuleTypeOptions, PlatformModuleOptions = PlatformInfo.GetGlobalBuildOptions(BuildDB.BuildObject[m,PlatformInfo.Arch,PlatformInfo.BuildTarget,PlatformInfo.ToolChain]) if ModuleTypeOptions or PlatformModuleOptions: module_build_opt.update({(m.File,m.Root): {"ModuleTypeOptions":ModuleTypeOptions, "PlatformModuleOptions":PlatformModuleOptions}}) self.DataContainer = {"PLA_BO":platform_build_opt, "TOOLDEF":ToolDefinition, "MOL_BO":module_build_opt } #Platform Info PInfo = { "WorkspaceDir":PlatformInfo.Workspace.WorkspaceDir, "Target":PlatformInfo.BuildTarget, "ToolChain":PlatformInfo.Workspace.ToolChain, "BuildRuleFile":PlatformInfo.BuildRule, "Arch": PlatformInfo.Arch, "ArchList":PlatformInfo.Workspace.ArchList, "ActivePlatform":PlatformInfo.MetaFile } self.DataContainer = {'P_Info':PInfo} self.DataContainer = {'M_Name':PlatformInfo.UniqueBaseName} self.DataContainer = {"ToolChainFamily": PlatformInfo.ToolChainFamily} self.DataContainer = {"BuildRuleFamily": PlatformInfo.BuildRuleFamily} self.DataContainer = {"MixedPcd":GlobalData.MixedPcd} self.DataContainer = {"BuildOptPcd":GlobalData.BuildOptionPcd} self.DataContainer = {"BuildCommand": PlatformInfo.BuildCommand} self.DataContainer = {"AsBuildModuleList": PlatformInfo._AsBuildModuleList} self.DataContainer = {"G_defines": GlobalData.gGlobalDefines} self.DataContainer = {"CL_defines": GlobalData.gCommandLineDefines} self.DataContainer = {"gCommandMaxLength": GlobalData.gCommandMaxLength} self.DataContainer = {"Env_Var": {k:v for k, v in os.environ.items()}} self.DataContainer = {"PackageList": [(dec.MetaFile,dec.Arch) for dec in PlatformInfo.PackageList]} self.DataContainer = {"GuidDict": PlatformInfo.Platform._GuidDict} self.DataContainer = {"DatabasePath":GlobalData.gDatabasePath} self.DataContainer = {"FdfParser": True if GlobalData.gFdfParser else False} self.DataContainer = {"LogLevel": EdkLogger.GetLevel()} self.DataContainer = {"UseHashCache":GlobalData.gUseHashCache} self.DataContainer = {"BinCacheSource":GlobalData.gBinCacheSource} self.DataContainer = {"BinCacheDest":GlobalData.gBinCacheDest} self.DataContainer = {"EnableGenfdsMultiThread":GlobalData.gEnableGenfdsMultiThread}