2 # Create makefile for MS nmake and GNU make
4 # Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
5 # SPDX-License-Identifier: BSD-2-Clause-Patent
7 from __future__
import absolute_import
8 from Workspace
.WorkspaceDatabase
import BuildDB
9 from Workspace
.WorkspaceCommon
import GetModuleLibInstances
10 import Common
.GlobalData
as GlobalData
13 from pickle
import HIGHEST_PROTOCOL
14 from Common
import EdkLogger
17 def __init__(self
,TokenCName
,TokenSpaceGuidCName
,Type
,DatumType
,SkuInfoList
,DefaultValue
,
18 MaxDatumSize
,UserDefinedDefaultStoresFlag
,validateranges
,
19 validlists
,expressions
,CustomAttribute
,TokenValue
):
20 self
.TokenCName
= TokenCName
21 self
.TokenSpaceGuidCName
= TokenSpaceGuidCName
23 self
.DatumType
= DatumType
24 self
.SkuInfoList
= SkuInfoList
25 self
.DefaultValue
= DefaultValue
26 self
.MaxDatumSize
= MaxDatumSize
27 self
.UserDefinedDefaultStoresFlag
= UserDefinedDefaultStoresFlag
28 self
.validateranges
= validateranges
29 self
.validlists
= validlists
30 self
.expressions
= expressions
31 self
.CustomAttribute
= CustomAttribute
32 self
.TokenValue
= TokenValue
34 class DataPipe(object):
35 def __init__(self
, BuildDir
=None):
36 self
.data_container
= {}
37 self
.BuildDir
= BuildDir
40 class MemoryDataPipe(DataPipe
):
43 return self
.data_container
.get(key
)
45 def dump(self
,file_path
):
46 self
.dump_file
= file_path
47 with
open(file_path
,'wb') as fd
:
48 pickle
.dump(self
.data_container
,fd
,pickle
.HIGHEST_PROTOCOL
)
50 def load(self
,file_path
):
51 with
open(file_path
,'rb') as fd
:
52 self
.data_container
= pickle
.load(fd
)
55 def DataContainer(self
):
56 return self
.data_container
58 def DataContainer(self
,data
):
59 self
.data_container
.update(data
)
61 def FillData(self
,PlatformInfo
):
63 self
.DataContainer
= {
64 "PLA_PCD" : [PCD_DATA(
65 pcd
.TokenCName
,pcd
.TokenSpaceGuidCName
,pcd
.Type
,
66 pcd
.DatumType
,pcd
.SkuInfoList
,pcd
.DefaultValue
,
67 pcd
.MaxDatumSize
,pcd
.UserDefinedDefaultStoresFlag
,pcd
.validateranges
,
68 pcd
.validlists
,pcd
.expressions
,pcd
.CustomAttribute
,pcd
.TokenValue
)
69 for pcd
in PlatformInfo
.Platform
.Pcds
.values()]
74 for m
in PlatformInfo
.Platform
.Modules
:
75 module
= PlatformInfo
.Platform
.Modules
[m
]
78 ModulePcds
[module
.Guid
] = [PCD_DATA(
79 pcd
.TokenCName
,pcd
.TokenSpaceGuidCName
,pcd
.Type
,
80 pcd
.DatumType
,pcd
.SkuInfoList
,pcd
.DefaultValue
,
81 pcd
.MaxDatumSize
,pcd
.UserDefinedDefaultStoresFlag
,pcd
.validateranges
,
82 pcd
.validlists
,pcd
.expressions
,pcd
.CustomAttribute
,pcd
.TokenValue
)
83 for pcd
in PlatformInfo
.Platform
.Modules
[m
].Pcds
.values()]
86 self
.DataContainer
= {"MOL_PCDS":ModulePcds
}
88 #Module's Library Instance
91 for m
in PlatformInfo
.Platform
.Modules
:
92 module_obj
= BuildDB
.BuildObject
[m
,PlatformInfo
.Arch
,PlatformInfo
.BuildTarget
,PlatformInfo
.ToolChain
]
93 Libs
= GetModuleLibInstances(module_obj
, PlatformInfo
.Platform
, BuildDB
.BuildObject
, PlatformInfo
.Arch
,PlatformInfo
.BuildTarget
,PlatformInfo
.ToolChain
,PlatformInfo
.MetaFile
,EdkLogger
)
96 libModules
[(lib
.MetaFile
.File
,lib
.MetaFile
.Root
,lib
.Arch
,lib
.MetaFile
.Path
)].append((m
.File
,m
.Root
,module_obj
.Arch
,m
.Path
))
98 libModules
[(lib
.MetaFile
.File
,lib
.MetaFile
.Root
,lib
.Arch
,lib
.MetaFile
.Path
)] = [(m
.File
,m
.Root
,module_obj
.Arch
,m
.Path
)]
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
]
100 self
.DataContainer
= {"DEPS":ModuleLibs
}
101 self
.DataContainer
= {"REFS":libModules
}
103 #Platform BuildOptions
105 platform_build_opt
= PlatformInfo
.EdkIIBuildOption
107 ToolDefinition
= PlatformInfo
.ToolDefinition
108 module_build_opt
= {}
109 for m
in PlatformInfo
.Platform
.Modules
:
110 ModuleTypeOptions
, PlatformModuleOptions
= PlatformInfo
.GetGlobalBuildOptions(BuildDB
.BuildObject
[m
,PlatformInfo
.Arch
,PlatformInfo
.BuildTarget
,PlatformInfo
.ToolChain
])
111 if ModuleTypeOptions
or PlatformModuleOptions
:
112 module_build_opt
.update({(m
.File
,m
.Root
): {"ModuleTypeOptions":ModuleTypeOptions
, "PlatformModuleOptions":PlatformModuleOptions
}})
114 self
.DataContainer
= {"PLA_BO":platform_build_opt
,
115 "TOOLDEF":ToolDefinition
,
116 "MOL_BO":module_build_opt
123 "WorkspaceDir":PlatformInfo
.Workspace
.WorkspaceDir
,
124 "Target":PlatformInfo
.BuildTarget
,
125 "ToolChain":PlatformInfo
.Workspace
.ToolChain
,
126 "BuildRuleFile":PlatformInfo
.BuildRule
,
127 "Arch": PlatformInfo
.Arch
,
128 "ArchList":PlatformInfo
.Workspace
.ArchList
,
129 "ActivePlatform":PlatformInfo
.MetaFile
131 self
.DataContainer
= {'P_Info':PInfo
}
133 self
.DataContainer
= {'M_Name':PlatformInfo
.UniqueBaseName
}
135 self
.DataContainer
= {"ToolChainFamily": PlatformInfo
.ToolChainFamily
}
137 self
.DataContainer
= {"BuildRuleFamily": PlatformInfo
.BuildRuleFamily
}
139 self
.DataContainer
= {"MixedPcd":GlobalData
.MixedPcd
}
141 self
.DataContainer
= {"BuildOptPcd":GlobalData
.BuildOptionPcd
}
143 self
.DataContainer
= {"BuildCommand": PlatformInfo
.BuildCommand
}
145 self
.DataContainer
= {"AsBuildModuleList": PlatformInfo
._AsBuildModuleList
}
147 self
.DataContainer
= {"G_defines": GlobalData
.gGlobalDefines
}
149 self
.DataContainer
= {"CL_defines": GlobalData
.gCommandLineDefines
}
151 self
.DataContainer
= {"gCommandMaxLength": GlobalData
.gCommandMaxLength
}
153 self
.DataContainer
= {"Env_Var": {k
:v
for k
, v
in os
.environ
.items()}}
155 self
.DataContainer
= {"PackageList": [(dec
.MetaFile
,dec
.Arch
) for dec
in PlatformInfo
.PackageList
]}
157 self
.DataContainer
= {"GuidDict": PlatformInfo
.Platform
._GuidDict
}
159 self
.DataContainer
= {"DatabasePath":GlobalData
.gDatabasePath
}
161 self
.DataContainer
= {"FdfParser": True if GlobalData
.gFdfParser
else False}
163 self
.DataContainer
= {"LogLevel": EdkLogger
.GetLevel()}
165 self
.DataContainer
= {"UseHashCache":GlobalData
.gUseHashCache
}
167 self
.DataContainer
= {"BinCacheSource":GlobalData
.gBinCacheSource
}
169 self
.DataContainer
= {"BinCacheDest":GlobalData
.gBinCacheDest
}
171 self
.DataContainer
= {"EnableGenfdsMultiThread":GlobalData
.gEnableGenfdsMultiThread
}
173 self
.DataContainer
= {"gPlatformFinalPcds":GlobalData
.gPlatformFinalPcds
}