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
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
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
33 class DataPipe(object):
34 def __init__(self
, BuildDir
=None):
35 self
.data_container
= {}
36 self
.BuildDir
= BuildDir
38 class MemoryDataPipe(DataPipe
):
41 return self
.data_container
.get(key
)
43 def dump(self
,file_path
):
44 with
open(file_path
,'wb') as fd
:
45 pickle
.dump(self
.data_container
,fd
,pickle
.HIGHEST_PROTOCOL
)
47 def load(self
,file_path
):
48 with
open(file_path
,'rb') as fd
:
49 self
.data_container
= pickle
.load(fd
)
52 def DataContainer(self
):
53 return self
.data_container
55 def DataContainer(self
,data
):
56 self
.data_container
.update(data
)
58 def FillData(self
,PlatformInfo
):
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()]
71 for m
in PlatformInfo
.Platform
.Modules
:
72 m_pcds
= PlatformInfo
.Platform
.Modules
[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()]
82 self
.DataContainer
= {"MOL_PCDS":ModulePcds
}
84 #Module's Library Instance
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
}
92 #Platform BuildOptions
94 platform_build_opt
= PlatformInfo
.EdkIIBuildOption
96 ToolDefinition
= PlatformInfo
.ToolDefinition
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
}})
103 self
.DataContainer
= {"PLA_BO":platform_build_opt
,
104 "TOOLDEF":ToolDefinition
,
105 "MOL_BO":module_build_opt
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
120 self
.DataContainer
= {'P_Info':PInfo
}
122 self
.DataContainer
= {'M_Name':PlatformInfo
.UniqueBaseName
}
124 self
.DataContainer
= {"ToolChainFamily": PlatformInfo
.ToolChainFamily
}
126 self
.DataContainer
= {"BuildRuleFamily": PlatformInfo
.BuildRuleFamily
}
128 self
.DataContainer
= {"MixedPcd":GlobalData
.MixedPcd
}
130 self
.DataContainer
= {"BuildOptPcd":GlobalData
.BuildOptionPcd
}
132 self
.DataContainer
= {"BuildCommand": PlatformInfo
.BuildCommand
}
134 self
.DataContainer
= {"AsBuildModuleList": PlatformInfo
._AsBuildModuleList
}
136 self
.DataContainer
= {"G_defines": GlobalData
.gGlobalDefines
}
138 self
.DataContainer
= {"CL_defines": GlobalData
.gCommandLineDefines
}
140 self
.DataContainer
= {"Env_Var": {k
:v
for k
, v
in os
.environ
.items()}}
142 self
.DataContainer
= {"PackageList": [(dec
.MetaFile
,dec
.Arch
) for dec
in PlatformInfo
.PackageList
]}
144 self
.DataContainer
= {"GuidDict": PlatformInfo
.Platform
._GuidDict
}
146 self
.DataContainer
= {"FdfParser": True if GlobalData
.gFdfParser
else False}