]> git.proxmox.com Git - mirror_edk2.git/blob - BaseTools/Source/Python/AutoGen/DataPipe.py
BaseTools: Decouple AutoGen Objects
[mirror_edk2.git] / BaseTools / Source / Python / AutoGen / DataPipe.py
1 ## @file
2 # Create makefile for MS nmake and GNU make
3 #
4 # Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
5 # SPDX-License-Identifier: BSD-2-Clause-Patent
6 #
7 from __future__ import absolute_import
8 from Workspace.WorkspaceDatabase import BuildDB
9 from Workspace.WorkspaceCommon import GetModuleLibInstances
10 import Common.GlobalData as GlobalData
11 import os
12 import pickle
13 from pickle import HIGHEST_PROTOCOL
14
15 class PCD_DATA():
16 def __init__(self,TokenCName,TokenSpaceGuidCName,Type,DatumType,SkuInfoList,DefaultValue,
17 MaxDatumSize,UserDefinedDefaultStoresFlag,validateranges,
18 validlists,expressions,CustomAttribute,TokenValue):
19 self.TokenCName = TokenCName
20 self.TokenSpaceGuidCName = TokenSpaceGuidCName
21 self.Type = Type
22 self.DatumType = DatumType
23 self.SkuInfoList = SkuInfoList
24 self.DefaultValue = DefaultValue
25 self.MaxDatumSize = MaxDatumSize
26 self.UserDefinedDefaultStoresFlag = UserDefinedDefaultStoresFlag
27 self.validateranges = validateranges
28 self.validlists = validlists
29 self.expressions = expressions
30 self.CustomAttribute = CustomAttribute
31 self.TokenValue = TokenValue
32
33 class DataPipe(object):
34 def __init__(self, BuildDir=None):
35 self.data_container = {}
36 self.BuildDir = BuildDir
37
38 class MemoryDataPipe(DataPipe):
39
40 def Get(self,key):
41 return self.data_container.get(key)
42
43 def dump(self,file_path):
44 with open(file_path,'wb') as fd:
45 pickle.dump(self.data_container,fd,pickle.HIGHEST_PROTOCOL)
46
47 def load(self,file_path):
48 with open(file_path,'rb') as fd:
49 self.data_container = pickle.load(fd)
50
51 @property
52 def DataContainer(self):
53 return self.data_container
54 @DataContainer.setter
55 def DataContainer(self,data):
56 self.data_container.update(data)
57
58 def FillData(self,PlatformInfo):
59 #Platform Pcds
60 self.DataContainer = {
61 "PLA_PCD" : [PCD_DATA(
62 pcd.TokenCName,pcd.TokenSpaceGuidCName,pcd.Type,
63 pcd.DatumType,pcd.SkuInfoList,pcd.DefaultValue,
64 pcd.MaxDatumSize,pcd.UserDefinedDefaultStoresFlag,pcd.validateranges,
65 pcd.validlists,pcd.expressions,pcd.CustomAttribute,pcd.TokenValue)
66 for pcd in PlatformInfo.Platform.Pcds.values()]
67 }
68
69 #Platform Module Pcds
70 ModulePcds = {}
71 for m in PlatformInfo.Platform.Modules:
72 m_pcds = PlatformInfo.Platform.Modules[m].Pcds
73 if m_pcds:
74 ModulePcds[(m.File,m.Root)] = [PCD_DATA(
75 pcd.TokenCName,pcd.TokenSpaceGuidCName,pcd.Type,
76 pcd.DatumType,pcd.SkuInfoList,pcd.DefaultValue,
77 pcd.MaxDatumSize,pcd.UserDefinedDefaultStoresFlag,pcd.validateranges,
78 pcd.validlists,pcd.expressions,pcd.CustomAttribute,pcd.TokenValue)
79 for pcd in PlatformInfo.Platform.Modules[m].Pcds.values()]
80
81
82 self.DataContainer = {"MOL_PCDS":ModulePcds}
83
84 #Module's Library Instance
85 ModuleLibs = {}
86 for m in PlatformInfo.Platform.Modules:
87 module_obj = BuildDB.BuildObject[m,PlatformInfo.Arch,PlatformInfo.BuildTarget,PlatformInfo.ToolChain]
88 Libs = GetModuleLibInstances(module_obj, PlatformInfo.Platform, BuildDB.BuildObject, PlatformInfo.Arch,PlatformInfo.BuildTarget,PlatformInfo.ToolChain)
89 ModuleLibs[(m.File,m.Root,module_obj.Arch)] = [(l.MetaFile.File,l.MetaFile.Root,l.Arch) for l in Libs]
90 self.DataContainer = {"DEPS":ModuleLibs}
91
92 #Platform BuildOptions
93
94 platform_build_opt = PlatformInfo.EdkIIBuildOption
95
96 ToolDefinition = PlatformInfo.ToolDefinition
97 module_build_opt = {}
98 for m in PlatformInfo.Platform.Modules:
99 ModuleTypeOptions, PlatformModuleOptions = PlatformInfo.GetGlobalBuildOptions(BuildDB.BuildObject[m,PlatformInfo.Arch,PlatformInfo.BuildTarget,PlatformInfo.ToolChain])
100 if ModuleTypeOptions or PlatformModuleOptions:
101 module_build_opt.update({(m.File,m.Root): {"ModuleTypeOptions":ModuleTypeOptions, "PlatformModuleOptions":PlatformModuleOptions}})
102
103 self.DataContainer = {"PLA_BO":platform_build_opt,
104 "TOOLDEF":ToolDefinition,
105 "MOL_BO":module_build_opt
106 }
107
108
109
110 #Platform Info
111 PInfo = {
112 "WorkspaceDir":PlatformInfo.Workspace.WorkspaceDir,
113 "Target":PlatformInfo.BuildTarget,
114 "ToolChain":PlatformInfo.Workspace.ToolChain,
115 "BuildRuleFile":PlatformInfo.BuildRule,
116 "Arch": PlatformInfo.Arch,
117 "ArchList":PlatformInfo.Workspace.ArchList,
118 "ActivePlatform":PlatformInfo.MetaFile
119 }
120 self.DataContainer = {'P_Info':PInfo}
121
122 self.DataContainer = {'M_Name':PlatformInfo.UniqueBaseName}
123
124 self.DataContainer = {"ToolChainFamily": PlatformInfo.ToolChainFamily}
125
126 self.DataContainer = {"BuildRuleFamily": PlatformInfo.BuildRuleFamily}
127
128 self.DataContainer = {"MixedPcd":GlobalData.MixedPcd}
129
130 self.DataContainer = {"BuildOptPcd":GlobalData.BuildOptionPcd}
131
132 self.DataContainer = {"BuildCommand": PlatformInfo.BuildCommand}
133
134 self.DataContainer = {"AsBuildModuleList": PlatformInfo._AsBuildModuleList}
135
136 self.DataContainer = {"G_defines": GlobalData.gGlobalDefines}
137
138 self.DataContainer = {"CL_defines": GlobalData.gCommandLineDefines}
139
140 self.DataContainer = {"Env_Var": {k:v for k, v in os.environ.items()}}
141
142 self.DataContainer = {"PackageList": [(dec.MetaFile,dec.Arch) for dec in PlatformInfo.PackageList]}
143
144 self.DataContainer = {"GuidDict": PlatformInfo.Platform._GuidDict}
145
146 self.DataContainer = {"FdfParser": True if GlobalData.gFdfParser else False}
147