]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/AutoGen/DataPipe.py
BaseTools: Move gPlatformFinalPcd to Datapipe and optimize size
[mirror_edk2.git] / BaseTools / Source / Python / AutoGen / DataPipe.py
CommitLineData
e8449e1d
FB
1## @file\r
2# Create makefile for MS nmake and GNU make\r
3#\r
4# Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>\r
5# SPDX-License-Identifier: BSD-2-Clause-Patent\r
6#\r
7from __future__ import absolute_import\r
8from Workspace.WorkspaceDatabase import BuildDB\r
9from Workspace.WorkspaceCommon import GetModuleLibInstances\r
10import Common.GlobalData as GlobalData\r
11import os\r
12import pickle\r
13from pickle import HIGHEST_PROTOCOL\r
673d09a2 14from Common import EdkLogger\r
e8449e1d
FB
15\r
16class PCD_DATA():\r
17 def __init__(self,TokenCName,TokenSpaceGuidCName,Type,DatumType,SkuInfoList,DefaultValue,\r
18 MaxDatumSize,UserDefinedDefaultStoresFlag,validateranges,\r
19 validlists,expressions,CustomAttribute,TokenValue):\r
20 self.TokenCName = TokenCName\r
21 self.TokenSpaceGuidCName = TokenSpaceGuidCName\r
22 self.Type = Type\r
23 self.DatumType = DatumType\r
24 self.SkuInfoList = SkuInfoList\r
25 self.DefaultValue = DefaultValue\r
26 self.MaxDatumSize = MaxDatumSize\r
27 self.UserDefinedDefaultStoresFlag = UserDefinedDefaultStoresFlag\r
28 self.validateranges = validateranges\r
29 self.validlists = validlists\r
30 self.expressions = expressions\r
31 self.CustomAttribute = CustomAttribute\r
32 self.TokenValue = TokenValue\r
33\r
34class DataPipe(object):\r
35 def __init__(self, BuildDir=None):\r
36 self.data_container = {}\r
37 self.BuildDir = BuildDir\r
673d09a2 38 self.dump_file = ""\r
e8449e1d
FB
39\r
40class MemoryDataPipe(DataPipe):\r
41\r
42 def Get(self,key):\r
43 return self.data_container.get(key)\r
44\r
45 def dump(self,file_path):\r
673d09a2 46 self.dump_file = file_path\r
e8449e1d
FB
47 with open(file_path,'wb') as fd:\r
48 pickle.dump(self.data_container,fd,pickle.HIGHEST_PROTOCOL)\r
49\r
50 def load(self,file_path):\r
51 with open(file_path,'rb') as fd:\r
52 self.data_container = pickle.load(fd)\r
53\r
54 @property\r
55 def DataContainer(self):\r
56 return self.data_container\r
57 @DataContainer.setter\r
58 def DataContainer(self,data):\r
59 self.data_container.update(data)\r
60\r
61 def FillData(self,PlatformInfo):\r
62 #Platform Pcds\r
63 self.DataContainer = {\r
64 "PLA_PCD" : [PCD_DATA(\r
65 pcd.TokenCName,pcd.TokenSpaceGuidCName,pcd.Type,\r
66 pcd.DatumType,pcd.SkuInfoList,pcd.DefaultValue,\r
67 pcd.MaxDatumSize,pcd.UserDefinedDefaultStoresFlag,pcd.validateranges,\r
68 pcd.validlists,pcd.expressions,pcd.CustomAttribute,pcd.TokenValue)\r
69 for pcd in PlatformInfo.Platform.Pcds.values()]\r
70 }\r
71\r
72 #Platform Module Pcds\r
73 ModulePcds = {}\r
74 for m in PlatformInfo.Platform.Modules:\r
09af9bd9
BF
75 module = PlatformInfo.Platform.Modules[m]\r
76 m_pcds = module.Pcds\r
e8449e1d 77 if m_pcds:\r
09af9bd9 78 ModulePcds[module.Guid] = [PCD_DATA(\r
e8449e1d
FB
79 pcd.TokenCName,pcd.TokenSpaceGuidCName,pcd.Type,\r
80 pcd.DatumType,pcd.SkuInfoList,pcd.DefaultValue,\r
81 pcd.MaxDatumSize,pcd.UserDefinedDefaultStoresFlag,pcd.validateranges,\r
82 pcd.validlists,pcd.expressions,pcd.CustomAttribute,pcd.TokenValue)\r
83 for pcd in PlatformInfo.Platform.Modules[m].Pcds.values()]\r
84\r
85\r
86 self.DataContainer = {"MOL_PCDS":ModulePcds}\r
87\r
88 #Module's Library Instance\r
89 ModuleLibs = {}\r
673d09a2 90 libModules = {}\r
e8449e1d
FB
91 for m in PlatformInfo.Platform.Modules:\r
92 module_obj = BuildDB.BuildObject[m,PlatformInfo.Arch,PlatformInfo.BuildTarget,PlatformInfo.ToolChain]\r
abc0155b 93 Libs = GetModuleLibInstances(module_obj, PlatformInfo.Platform, BuildDB.BuildObject, PlatformInfo.Arch,PlatformInfo.BuildTarget,PlatformInfo.ToolChain,PlatformInfo.MetaFile,EdkLogger)\r
673d09a2
FB
94 for lib in Libs:\r
95 try:\r
96 libModules[(lib.MetaFile.File,lib.MetaFile.Root,lib.Arch,lib.MetaFile.Path)].append((m.File,m.Root,module_obj.Arch,m.Path))\r
97 except:\r
98 libModules[(lib.MetaFile.File,lib.MetaFile.Root,lib.Arch,lib.MetaFile.Path)] = [(m.File,m.Root,module_obj.Arch,m.Path)]\r
99 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]\r
e8449e1d 100 self.DataContainer = {"DEPS":ModuleLibs}\r
673d09a2 101 self.DataContainer = {"REFS":libModules}\r
e8449e1d
FB
102\r
103 #Platform BuildOptions\r
104\r
105 platform_build_opt = PlatformInfo.EdkIIBuildOption\r
106\r
107 ToolDefinition = PlatformInfo.ToolDefinition\r
108 module_build_opt = {}\r
109 for m in PlatformInfo.Platform.Modules:\r
110 ModuleTypeOptions, PlatformModuleOptions = PlatformInfo.GetGlobalBuildOptions(BuildDB.BuildObject[m,PlatformInfo.Arch,PlatformInfo.BuildTarget,PlatformInfo.ToolChain])\r
111 if ModuleTypeOptions or PlatformModuleOptions:\r
112 module_build_opt.update({(m.File,m.Root): {"ModuleTypeOptions":ModuleTypeOptions, "PlatformModuleOptions":PlatformModuleOptions}})\r
113\r
114 self.DataContainer = {"PLA_BO":platform_build_opt,\r
115 "TOOLDEF":ToolDefinition,\r
116 "MOL_BO":module_build_opt\r
117 }\r
118\r
119\r
120\r
121 #Platform Info\r
122 PInfo = {\r
123 "WorkspaceDir":PlatformInfo.Workspace.WorkspaceDir,\r
124 "Target":PlatformInfo.BuildTarget,\r
125 "ToolChain":PlatformInfo.Workspace.ToolChain,\r
126 "BuildRuleFile":PlatformInfo.BuildRule,\r
127 "Arch": PlatformInfo.Arch,\r
128 "ArchList":PlatformInfo.Workspace.ArchList,\r
129 "ActivePlatform":PlatformInfo.MetaFile\r
130 }\r
131 self.DataContainer = {'P_Info':PInfo}\r
132\r
133 self.DataContainer = {'M_Name':PlatformInfo.UniqueBaseName}\r
134\r
135 self.DataContainer = {"ToolChainFamily": PlatformInfo.ToolChainFamily}\r
136\r
137 self.DataContainer = {"BuildRuleFamily": PlatformInfo.BuildRuleFamily}\r
138\r
139 self.DataContainer = {"MixedPcd":GlobalData.MixedPcd}\r
140\r
141 self.DataContainer = {"BuildOptPcd":GlobalData.BuildOptionPcd}\r
142\r
143 self.DataContainer = {"BuildCommand": PlatformInfo.BuildCommand}\r
144\r
145 self.DataContainer = {"AsBuildModuleList": PlatformInfo._AsBuildModuleList}\r
146\r
147 self.DataContainer = {"G_defines": GlobalData.gGlobalDefines}\r
148\r
149 self.DataContainer = {"CL_defines": GlobalData.gCommandLineDefines}\r
150\r
e910f076
BF
151 self.DataContainer = {"gCommandMaxLength": GlobalData.gCommandMaxLength}\r
152\r
e8449e1d
FB
153 self.DataContainer = {"Env_Var": {k:v for k, v in os.environ.items()}}\r
154\r
155 self.DataContainer = {"PackageList": [(dec.MetaFile,dec.Arch) for dec in PlatformInfo.PackageList]}\r
156\r
157 self.DataContainer = {"GuidDict": PlatformInfo.Platform._GuidDict}\r
158\r
673d09a2 159 self.DataContainer = {"DatabasePath":GlobalData.gDatabasePath}\r
636ed13a 160\r
e8449e1d
FB
161 self.DataContainer = {"FdfParser": True if GlobalData.gFdfParser else False}\r
162\r
673d09a2 163 self.DataContainer = {"LogLevel": EdkLogger.GetLevel()}\r
0e7e7a26 164\r
fc8b8dea
SS
165 self.DataContainer = {"UseHashCache":GlobalData.gUseHashCache}\r
166\r
0e7e7a26
SS
167 self.DataContainer = {"BinCacheSource":GlobalData.gBinCacheSource}\r
168\r
169 self.DataContainer = {"BinCacheDest":GlobalData.gBinCacheDest}\r
170\r
c1bcb225 171 self.DataContainer = {"EnableGenfdsMultiThread":GlobalData.gEnableGenfdsMultiThread}\r
f4dfec6c
LY
172\r
173 self.DataContainer = {"gPlatformFinalPcds":GlobalData.gPlatformFinalPcds}\r