]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/AutoGen/DataPipe.py
BaseTools: Leverage compiler output to optimize binary cache
[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
75 m_pcds = PlatformInfo.Platform.Modules[m].Pcds\r
76 if m_pcds:\r
673d09a2 77 ModulePcds[(m.File,m.Root,m.Arch)] = [PCD_DATA(\r
e8449e1d
FB
78 pcd.TokenCName,pcd.TokenSpaceGuidCName,pcd.Type,\r
79 pcd.DatumType,pcd.SkuInfoList,pcd.DefaultValue,\r
80 pcd.MaxDatumSize,pcd.UserDefinedDefaultStoresFlag,pcd.validateranges,\r
81 pcd.validlists,pcd.expressions,pcd.CustomAttribute,pcd.TokenValue)\r
82 for pcd in PlatformInfo.Platform.Modules[m].Pcds.values()]\r
83\r
84\r
85 self.DataContainer = {"MOL_PCDS":ModulePcds}\r
86\r
87 #Module's Library Instance\r
88 ModuleLibs = {}\r
673d09a2 89 libModules = {}\r
e8449e1d
FB
90 for m in PlatformInfo.Platform.Modules:\r
91 module_obj = BuildDB.BuildObject[m,PlatformInfo.Arch,PlatformInfo.BuildTarget,PlatformInfo.ToolChain]\r
abc0155b 92 Libs = GetModuleLibInstances(module_obj, PlatformInfo.Platform, BuildDB.BuildObject, PlatformInfo.Arch,PlatformInfo.BuildTarget,PlatformInfo.ToolChain,PlatformInfo.MetaFile,EdkLogger)\r
673d09a2
FB
93 for lib in Libs:\r
94 try:\r
95 libModules[(lib.MetaFile.File,lib.MetaFile.Root,lib.Arch,lib.MetaFile.Path)].append((m.File,m.Root,module_obj.Arch,m.Path))\r
96 except:\r
97 libModules[(lib.MetaFile.File,lib.MetaFile.Root,lib.Arch,lib.MetaFile.Path)] = [(m.File,m.Root,module_obj.Arch,m.Path)]\r
98 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 99 self.DataContainer = {"DEPS":ModuleLibs}\r
673d09a2 100 self.DataContainer = {"REFS":libModules}\r
e8449e1d
FB
101\r
102 #Platform BuildOptions\r
103\r
104 platform_build_opt = PlatformInfo.EdkIIBuildOption\r
105\r
106 ToolDefinition = PlatformInfo.ToolDefinition\r
107 module_build_opt = {}\r
108 for m in PlatformInfo.Platform.Modules:\r
109 ModuleTypeOptions, PlatformModuleOptions = PlatformInfo.GetGlobalBuildOptions(BuildDB.BuildObject[m,PlatformInfo.Arch,PlatformInfo.BuildTarget,PlatformInfo.ToolChain])\r
110 if ModuleTypeOptions or PlatformModuleOptions:\r
111 module_build_opt.update({(m.File,m.Root): {"ModuleTypeOptions":ModuleTypeOptions, "PlatformModuleOptions":PlatformModuleOptions}})\r
112\r
113 self.DataContainer = {"PLA_BO":platform_build_opt,\r
114 "TOOLDEF":ToolDefinition,\r
115 "MOL_BO":module_build_opt\r
116 }\r
117\r
118\r
119\r
120 #Platform Info\r
121 PInfo = {\r
122 "WorkspaceDir":PlatformInfo.Workspace.WorkspaceDir,\r
123 "Target":PlatformInfo.BuildTarget,\r
124 "ToolChain":PlatformInfo.Workspace.ToolChain,\r
125 "BuildRuleFile":PlatformInfo.BuildRule,\r
126 "Arch": PlatformInfo.Arch,\r
127 "ArchList":PlatformInfo.Workspace.ArchList,\r
128 "ActivePlatform":PlatformInfo.MetaFile\r
129 }\r
130 self.DataContainer = {'P_Info':PInfo}\r
131\r
132 self.DataContainer = {'M_Name':PlatformInfo.UniqueBaseName}\r
133\r
134 self.DataContainer = {"ToolChainFamily": PlatformInfo.ToolChainFamily}\r
135\r
136 self.DataContainer = {"BuildRuleFamily": PlatformInfo.BuildRuleFamily}\r
137\r
138 self.DataContainer = {"MixedPcd":GlobalData.MixedPcd}\r
139\r
140 self.DataContainer = {"BuildOptPcd":GlobalData.BuildOptionPcd}\r
141\r
142 self.DataContainer = {"BuildCommand": PlatformInfo.BuildCommand}\r
143\r
144 self.DataContainer = {"AsBuildModuleList": PlatformInfo._AsBuildModuleList}\r
145\r
146 self.DataContainer = {"G_defines": GlobalData.gGlobalDefines}\r
147\r
148 self.DataContainer = {"CL_defines": GlobalData.gCommandLineDefines}\r
149\r
150 self.DataContainer = {"Env_Var": {k:v for k, v in os.environ.items()}}\r
151\r
152 self.DataContainer = {"PackageList": [(dec.MetaFile,dec.Arch) for dec in PlatformInfo.PackageList]}\r
153\r
154 self.DataContainer = {"GuidDict": PlatformInfo.Platform._GuidDict}\r
155\r
673d09a2 156 self.DataContainer = {"DatabasePath":GlobalData.gDatabasePath}\r
636ed13a 157\r
e8449e1d
FB
158 self.DataContainer = {"FdfParser": True if GlobalData.gFdfParser else False}\r
159\r
673d09a2 160 self.DataContainer = {"LogLevel": EdkLogger.GetLevel()}\r
0e7e7a26 161\r
fc8b8dea
SS
162 self.DataContainer = {"UseHashCache":GlobalData.gUseHashCache}\r
163\r
0e7e7a26
SS
164 self.DataContainer = {"BinCacheSource":GlobalData.gBinCacheSource}\r
165\r
166 self.DataContainer = {"BinCacheDest":GlobalData.gBinCacheDest}\r
167\r
c1bcb225 168 self.DataContainer = {"EnableGenfdsMultiThread":GlobalData.gEnableGenfdsMultiThread}\r