]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/Workspace/DecBuildData.py
BaseTools: remove unused setter functions
[mirror_edk2.git] / BaseTools / Source / Python / Workspace / DecBuildData.py
CommitLineData
ae7b6df8
LG
1## @file\r
2# This file is used to create a database used by build tool\r
3#\r
e0db09cd 4# Copyright (c) 2008 - 2018, Intel Corporation. All rights reserved.<BR>\r
ae7b6df8
LG
5# (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>\r
6# This program and the accompanying materials\r
7# are licensed and made available under the terms and conditions of the BSD License\r
8# which accompanies this distribution. The full text of the license may be found at\r
9# http://opensource.org/licenses/bsd-license.php\r
10#\r
11# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13#\r
5a57246e 14from Common.StringUtils import *\r
ae7b6df8
LG
15from Common.DataType import *\r
16from Common.Misc import *\r
17from types import *\r
79820e32 18from collections import OrderedDict\r
ae7b6df8
LG
19\r
20from Workspace.BuildClassObject import PackageBuildClassObject, StructurePcd, PcdClassObject\r
21\r
22## Platform build information from DEC file\r
23#\r
24# This class is used to retrieve information stored in database and convert them\r
25# into PackageBuildClassObject form for easier use for AutoGen.\r
26#\r
27class DecBuildData(PackageBuildClassObject):\r
28 # dict used to convert PCD type in database to string used by build tool\r
29 _PCD_TYPE_STRING_ = {\r
be409b67
CJ
30 MODEL_PCD_FIXED_AT_BUILD : TAB_PCDS_FIXED_AT_BUILD,\r
31 MODEL_PCD_PATCHABLE_IN_MODULE : TAB_PCDS_PATCHABLE_IN_MODULE,\r
32 MODEL_PCD_FEATURE_FLAG : TAB_PCDS_FEATURE_FLAG,\r
33 MODEL_PCD_DYNAMIC : TAB_PCDS_DYNAMIC,\r
34 MODEL_PCD_DYNAMIC_DEFAULT : TAB_PCDS_DYNAMIC,\r
35 MODEL_PCD_DYNAMIC_HII : TAB_PCDS_DYNAMIC_HII,\r
36 MODEL_PCD_DYNAMIC_VPD : TAB_PCDS_DYNAMIC_VPD,\r
37 MODEL_PCD_DYNAMIC_EX : TAB_PCDS_DYNAMIC_EX,\r
38 MODEL_PCD_DYNAMIC_EX_DEFAULT : TAB_PCDS_DYNAMIC_EX,\r
39 MODEL_PCD_DYNAMIC_EX_HII : TAB_PCDS_DYNAMIC_EX_HII,\r
40 MODEL_PCD_DYNAMIC_EX_VPD : TAB_PCDS_DYNAMIC_EX_VPD,\r
ae7b6df8
LG
41 }\r
42\r
43 # dict used to convert part of [Defines] to members of DecBuildData directly\r
44 _PROPERTY_ = {\r
45 #\r
46 # Required Fields\r
47 #\r
48 TAB_DEC_DEFINES_PACKAGE_NAME : "_PackageName",\r
49 TAB_DEC_DEFINES_PACKAGE_GUID : "_Guid",\r
50 TAB_DEC_DEFINES_PACKAGE_VERSION : "_Version",\r
51 TAB_DEC_DEFINES_PKG_UNI_FILE : "_PkgUniFile",\r
52 }\r
53\r
54\r
55 ## Constructor of DecBuildData\r
56 #\r
57 # Initialize object of DecBuildData\r
58 #\r
59 # @param FilePath The path of package description file\r
60 # @param RawData The raw data of DEC file\r
61 # @param BuildDataBase Database used to retrieve module information\r
62 # @param Arch The target architecture\r
63 # @param Platform (not used for DecBuildData)\r
64 # @param Macros Macros used for replacement in DSC file\r
65 #\r
55c84777 66 def __init__(self, File, RawData, BuildDataBase, Arch=TAB_ARCH_COMMON, Target=None, Toolchain=None):\r
ae7b6df8
LG
67 self.MetaFile = File\r
68 self._PackageDir = File.Dir\r
69 self._RawData = RawData\r
70 self._Bdb = BuildDataBase\r
71 self._Arch = Arch\r
72 self._Target = Target\r
73 self._Toolchain = Toolchain\r
74 self._Clear()\r
75\r
76 ## XXX[key] = value\r
77 def __setitem__(self, key, value):\r
78 self.__dict__[self._PROPERTY_[key]] = value\r
79\r
80 ## value = XXX[key]\r
81 def __getitem__(self, key):\r
82 return self.__dict__[self._PROPERTY_[key]]\r
83\r
84 ## "in" test support\r
85 def __contains__(self, key):\r
86 return key in self._PROPERTY_\r
87\r
88 ## Set all internal used members of DecBuildData to None\r
89 def _Clear(self):\r
90 self._Header = None\r
91 self._PackageName = None\r
92 self._Guid = None\r
93 self._Version = None\r
94 self._PkgUniFile = None\r
95 self._Protocols = None\r
96 self._Ppis = None\r
97 self._Guids = None\r
98 self._Includes = None\r
0a57a978 99 self._CommonIncludes = None\r
ae7b6df8
LG
100 self._LibraryClasses = None\r
101 self._Pcds = None\r
102 self.__Macros = None\r
103 self._PrivateProtocols = None\r
104 self._PrivatePpis = None\r
105 self._PrivateGuids = None\r
106 self._PrivateIncludes = None\r
107\r
108 ## Get current effective macros\r
109 def _GetMacros(self):\r
4231a819 110 if self.__Macros is None:\r
ae7b6df8
LG
111 self.__Macros = {}\r
112 self.__Macros.update(GlobalData.gGlobalDefines)\r
113 return self.__Macros\r
114\r
115 ## Get architecture\r
116 def _GetArch(self):\r
117 return self._Arch\r
118\r
ae7b6df8
LG
119 ## Retrieve all information in [Defines] section\r
120 #\r
121 # (Retriving all [Defines] information in one-shot is just to save time.)\r
122 #\r
123 def _GetHeaderInfo(self):\r
124 RecordList = self._RawData[MODEL_META_DATA_HEADER, self._Arch]\r
125 for Record in RecordList:\r
126 Name = Record[1]\r
127 if Name in self:\r
128 self[Name] = Record[2]\r
129 self._Header = 'DUMMY'\r
130\r
131 ## Retrieve package name\r
132 def _GetPackageName(self):\r
4231a819
CJ
133 if self._PackageName is None:\r
134 if self._Header is None:\r
ae7b6df8 135 self._GetHeaderInfo()\r
4231a819 136 if self._PackageName is None:\r
ae7b6df8
LG
137 EdkLogger.error("build", ATTRIBUTE_NOT_AVAILABLE, "No PACKAGE_NAME", File=self.MetaFile)\r
138 return self._PackageName\r
139\r
140 ## Retrieve file guid\r
141 def _GetFileGuid(self):\r
4231a819
CJ
142 if self._Guid is None:\r
143 if self._Header is None:\r
ae7b6df8 144 self._GetHeaderInfo()\r
4231a819 145 if self._Guid is None:\r
ae7b6df8
LG
146 EdkLogger.error("build", ATTRIBUTE_NOT_AVAILABLE, "No PACKAGE_GUID", File=self.MetaFile)\r
147 return self._Guid\r
148\r
149 ## Retrieve package version\r
150 def _GetVersion(self):\r
4231a819
CJ
151 if self._Version is None:\r
152 if self._Header is None:\r
ae7b6df8 153 self._GetHeaderInfo()\r
4231a819 154 if self._Version is None:\r
ae7b6df8
LG
155 self._Version = ''\r
156 return self._Version\r
157\r
158 ## Retrieve protocol definitions (name/value pairs)\r
159 def _GetProtocol(self):\r
4231a819 160 if self._Protocols is None:\r
ae7b6df8
LG
161 #\r
162 # tdict is a special kind of dict, used for selecting correct\r
163 # protocol defition for given ARCH\r
164 #\r
165 ProtocolDict = tdict(True)\r
166 PrivateProtocolDict = tdict(True)\r
167 NameList = []\r
168 PrivateNameList = []\r
169 PublicNameList = []\r
170 # find out all protocol definitions for specific and 'common' arch\r
171 RecordList = self._RawData[MODEL_EFI_PROTOCOL, self._Arch]\r
172 for Name, Guid, Dummy, Arch, PrivateFlag, ID, LineNo in RecordList:\r
173 if PrivateFlag == 'PRIVATE':\r
174 if Name not in PrivateNameList:\r
175 PrivateNameList.append(Name)\r
176 PrivateProtocolDict[Arch, Name] = Guid\r
177 if Name in PublicNameList:\r
178 EdkLogger.error('build', OPTION_CONFLICT, "Can't determine %s's attribute, it is both defined as Private and non-Private attribute in DEC file." % Name, File=self.MetaFile, Line=LineNo)\r
179 else:\r
180 if Name not in PublicNameList:\r
181 PublicNameList.append(Name)\r
182 if Name in PrivateNameList:\r
183 EdkLogger.error('build', OPTION_CONFLICT, "Can't determine %s's attribute, it is both defined as Private and non-Private attribute in DEC file." % Name, File=self.MetaFile, Line=LineNo)\r
184 if Name not in NameList:\r
185 NameList.append(Name)\r
186 ProtocolDict[Arch, Name] = Guid\r
6e6d767e
CJ
187 # use OrderedDict to keep the order\r
188 self._Protocols = OrderedDict()\r
189 self._PrivateProtocols = OrderedDict()\r
ae7b6df8
LG
190 for Name in NameList:\r
191 #\r
192 # limit the ARCH to self._Arch, if no self._Arch found, tdict\r
193 # will automatically turn to 'common' ARCH for trying\r
194 #\r
195 self._Protocols[Name] = ProtocolDict[self._Arch, Name]\r
196 for Name in PrivateNameList:\r
197 self._PrivateProtocols[Name] = PrivateProtocolDict[self._Arch, Name]\r
198 return self._Protocols\r
199\r
200 ## Retrieve PPI definitions (name/value pairs)\r
201 def _GetPpi(self):\r
4231a819 202 if self._Ppis is None:\r
ae7b6df8
LG
203 #\r
204 # tdict is a special kind of dict, used for selecting correct\r
205 # PPI defition for given ARCH\r
206 #\r
207 PpiDict = tdict(True)\r
208 PrivatePpiDict = tdict(True)\r
209 NameList = []\r
210 PrivateNameList = []\r
211 PublicNameList = []\r
212 # find out all PPI definitions for specific arch and 'common' arch\r
213 RecordList = self._RawData[MODEL_EFI_PPI, self._Arch]\r
214 for Name, Guid, Dummy, Arch, PrivateFlag, ID, LineNo in RecordList:\r
215 if PrivateFlag == 'PRIVATE':\r
216 if Name not in PrivateNameList:\r
217 PrivateNameList.append(Name)\r
218 PrivatePpiDict[Arch, Name] = Guid\r
219 if Name in PublicNameList:\r
220 EdkLogger.error('build', OPTION_CONFLICT, "Can't determine %s's attribute, it is both defined as Private and non-Private attribute in DEC file." % Name, File=self.MetaFile, Line=LineNo)\r
221 else:\r
222 if Name not in PublicNameList:\r
223 PublicNameList.append(Name)\r
224 if Name in PrivateNameList:\r
225 EdkLogger.error('build', OPTION_CONFLICT, "Can't determine %s's attribute, it is both defined as Private and non-Private attribute in DEC file." % Name, File=self.MetaFile, Line=LineNo)\r
226 if Name not in NameList:\r
227 NameList.append(Name)\r
228 PpiDict[Arch, Name] = Guid\r
6e6d767e
CJ
229 # use OrderedDict to keep the order\r
230 self._Ppis = OrderedDict()\r
231 self._PrivatePpis = OrderedDict()\r
ae7b6df8
LG
232 for Name in NameList:\r
233 #\r
234 # limit the ARCH to self._Arch, if no self._Arch found, tdict\r
235 # will automatically turn to 'common' ARCH for trying\r
236 #\r
237 self._Ppis[Name] = PpiDict[self._Arch, Name]\r
238 for Name in PrivateNameList:\r
239 self._PrivatePpis[Name] = PrivatePpiDict[self._Arch, Name]\r
240 return self._Ppis\r
241\r
242 ## Retrieve GUID definitions (name/value pairs)\r
243 def _GetGuid(self):\r
4231a819 244 if self._Guids is None:\r
ae7b6df8
LG
245 #\r
246 # tdict is a special kind of dict, used for selecting correct\r
247 # GUID defition for given ARCH\r
248 #\r
249 GuidDict = tdict(True)\r
250 PrivateGuidDict = tdict(True)\r
251 NameList = []\r
252 PrivateNameList = []\r
253 PublicNameList = []\r
254 # find out all protocol definitions for specific and 'common' arch\r
255 RecordList = self._RawData[MODEL_EFI_GUID, self._Arch]\r
256 for Name, Guid, Dummy, Arch, PrivateFlag, ID, LineNo in RecordList:\r
257 if PrivateFlag == 'PRIVATE':\r
258 if Name not in PrivateNameList:\r
259 PrivateNameList.append(Name)\r
260 PrivateGuidDict[Arch, Name] = Guid\r
261 if Name in PublicNameList:\r
262 EdkLogger.error('build', OPTION_CONFLICT, "Can't determine %s's attribute, it is both defined as Private and non-Private attribute in DEC file." % Name, File=self.MetaFile, Line=LineNo)\r
263 else:\r
264 if Name not in PublicNameList:\r
265 PublicNameList.append(Name)\r
266 if Name in PrivateNameList:\r
267 EdkLogger.error('build', OPTION_CONFLICT, "Can't determine %s's attribute, it is both defined as Private and non-Private attribute in DEC file." % Name, File=self.MetaFile, Line=LineNo)\r
268 if Name not in NameList:\r
269 NameList.append(Name)\r
270 GuidDict[Arch, Name] = Guid\r
6e6d767e
CJ
271 # use OrderedDict to keep the order\r
272 self._Guids = OrderedDict()\r
273 self._PrivateGuids = OrderedDict()\r
ae7b6df8
LG
274 for Name in NameList:\r
275 #\r
276 # limit the ARCH to self._Arch, if no self._Arch found, tdict\r
277 # will automatically turn to 'common' ARCH for trying\r
278 #\r
279 self._Guids[Name] = GuidDict[self._Arch, Name]\r
280 for Name in PrivateNameList:\r
281 self._PrivateGuids[Name] = PrivateGuidDict[self._Arch, Name]\r
282 return self._Guids\r
283\r
284 ## Retrieve public include paths declared in this package\r
285 def _GetInclude(self):\r
4231a819 286 if self._Includes is None or self._CommonIncludes is None:\r
0a57a978 287 self._CommonIncludes = []\r
ae7b6df8
LG
288 self._Includes = []\r
289 self._PrivateIncludes = []\r
290 PublicInclues = []\r
291 RecordList = self._RawData[MODEL_EFI_INCLUDE, self._Arch]\r
292 Macros = self._Macros\r
293 Macros["EDK_SOURCE"] = GlobalData.gEcpSource\r
294 for Record in RecordList:\r
295 File = PathClass(NormPath(Record[0], Macros), self._PackageDir, Arch=self._Arch)\r
296 LineNo = Record[-1]\r
297 # validate the path\r
298 ErrorCode, ErrorInfo = File.Validate()\r
299 if ErrorCode != 0:\r
300 EdkLogger.error('build', ErrorCode, ExtraData=ErrorInfo, File=self.MetaFile, Line=LineNo)\r
301\r
302 # avoid duplicate include path\r
303 if File not in self._Includes:\r
304 self._Includes.append(File)\r
305 if Record[4] == 'PRIVATE':\r
306 if File not in self._PrivateIncludes:\r
307 self._PrivateIncludes.append(File)\r
308 if File in PublicInclues:\r
309 EdkLogger.error('build', OPTION_CONFLICT, "Can't determine %s's attribute, it is both defined as Private and non-Private attribute in DEC file." % File, File=self.MetaFile, Line=LineNo)\r
310 else:\r
311 if File not in PublicInclues:\r
312 PublicInclues.append(File)\r
313 if File in self._PrivateIncludes:\r
314 EdkLogger.error('build', OPTION_CONFLICT, "Can't determine %s's attribute, it is both defined as Private and non-Private attribute in DEC file." % File, File=self.MetaFile, Line=LineNo)\r
55c84777 315 if Record[3] == TAB_COMMON:\r
0a57a978 316 self._CommonIncludes.append(File)\r
ae7b6df8
LG
317 return self._Includes\r
318\r
319 ## Retrieve library class declarations (not used in build at present)\r
320 def _GetLibraryClass(self):\r
4231a819 321 if self._LibraryClasses is None:\r
ae7b6df8
LG
322 #\r
323 # tdict is a special kind of dict, used for selecting correct\r
324 # library class declaration for given ARCH\r
325 #\r
326 LibraryClassDict = tdict(True)\r
327 LibraryClassSet = set()\r
328 RecordList = self._RawData[MODEL_EFI_LIBRARY_CLASS, self._Arch]\r
329 Macros = self._Macros\r
330 for LibraryClass, File, Dummy, Arch, PrivateFlag, ID, LineNo in RecordList:\r
331 File = PathClass(NormPath(File, Macros), self._PackageDir, Arch=self._Arch)\r
332 # check the file validation\r
333 ErrorCode, ErrorInfo = File.Validate()\r
334 if ErrorCode != 0:\r
335 EdkLogger.error('build', ErrorCode, ExtraData=ErrorInfo, File=self.MetaFile, Line=LineNo)\r
336 LibraryClassSet.add(LibraryClass)\r
337 LibraryClassDict[Arch, LibraryClass] = File\r
6e6d767e 338 self._LibraryClasses = OrderedDict()\r
ae7b6df8
LG
339 for LibraryClass in LibraryClassSet:\r
340 self._LibraryClasses[LibraryClass] = LibraryClassDict[self._Arch, LibraryClass]\r
341 return self._LibraryClasses\r
342\r
343 ## Retrieve PCD declarations\r
344 def _GetPcds(self):\r
4231a819 345 if self._Pcds is None:\r
6e6d767e 346 self._Pcds = OrderedDict()\r
ae7b6df8
LG
347 self._Pcds.update(self._GetPcd(MODEL_PCD_FIXED_AT_BUILD))\r
348 self._Pcds.update(self._GetPcd(MODEL_PCD_PATCHABLE_IN_MODULE))\r
349 self._Pcds.update(self._GetPcd(MODEL_PCD_FEATURE_FLAG))\r
350 self._Pcds.update(self._GetPcd(MODEL_PCD_DYNAMIC))\r
351 self._Pcds.update(self._GetPcd(MODEL_PCD_DYNAMIC_EX))\r
352 return self._Pcds\r
353\r
354\r
355 def ProcessStructurePcd(self, StructurePcdRawDataSet):\r
79820e32 356 s_pcd_set = OrderedDict()\r
ccaa7754 357 for s_pcd, LineNo in StructurePcdRawDataSet:\r
ae7b6df8
LG
358 if s_pcd.TokenSpaceGuidCName not in s_pcd_set:\r
359 s_pcd_set[s_pcd.TokenSpaceGuidCName] = []\r
ccaa7754 360 s_pcd_set[s_pcd.TokenSpaceGuidCName].append((s_pcd, LineNo))\r
ae7b6df8
LG
361\r
362 str_pcd_set = []\r
363 for pcdname in s_pcd_set:\r
364 dep_pkgs = []\r
365 struct_pcd = StructurePcd()\r
ccaa7754 366 for item, LineNo in s_pcd_set[pcdname]:\r
ae7b6df8 367 if "<HeaderFiles>" in item.TokenCName:\r
81add864 368 struct_pcd.StructuredPcdIncludeFile.append(item.DefaultValue)\r
ae7b6df8
LG
369 elif "<Packages>" in item.TokenCName:\r
370 dep_pkgs.append(item.DefaultValue)\r
371 elif item.DatumType == item.TokenCName:\r
372 struct_pcd.copy(item)\r
373 struct_pcd.TokenValue = struct_pcd.TokenValue.strip("{").strip()\r
374 struct_pcd.TokenSpaceGuidCName, struct_pcd.TokenCName = pcdname.split(".")\r
6a103440
FB
375 struct_pcd.PcdDefineLineNo = LineNo\r
376 struct_pcd.PkgPath = self.MetaFile.File\r
06140766 377 struct_pcd.SetDecDefaultValue(item.DefaultValue)\r
ae7b6df8 378 else:\r
ccaa7754 379 struct_pcd.AddDefaultValue(item.TokenCName, item.DefaultValue, self.MetaFile.File, LineNo)\r
ae7b6df8
LG
380\r
381 struct_pcd.PackageDecs = dep_pkgs\r
ae7b6df8 382 str_pcd_set.append(struct_pcd)\r
ae7b6df8
LG
383 return str_pcd_set\r
384\r
385 ## Retrieve PCD declarations for given type\r
386 def _GetPcd(self, Type):\r
6e6d767e 387 Pcds = OrderedDict()\r
ae7b6df8
LG
388 #\r
389 # tdict is a special kind of dict, used for selecting correct\r
390 # PCD declaration for given ARCH\r
391 #\r
392 PcdDict = tdict(True, 3)\r
393 # for summarizing PCD\r
e651d06c 394 PcdSet = []\r
ae7b6df8
LG
395 # find out all PCDs of the 'type'\r
396\r
397 StrPcdSet = []\r
398 RecordList = self._RawData[Type, self._Arch]\r
399 for TokenSpaceGuid, PcdCName, Setting, Arch, PrivateFlag, Dummy1, Dummy2 in RecordList:\r
ccaa7754 400 PcdDict[Arch, PcdCName, TokenSpaceGuid] = (Setting, Dummy2)\r
e651d06c
LG
401 if not (PcdCName, TokenSpaceGuid) in PcdSet:\r
402 PcdSet.append((PcdCName, TokenSpaceGuid))\r
ae7b6df8
LG
403\r
404 for PcdCName, TokenSpaceGuid in PcdSet:\r
405 #\r
406 # limit the ARCH to self._Arch, if no self._Arch found, tdict\r
407 # will automatically turn to 'common' ARCH and try again\r
408 #\r
ccaa7754 409 Setting, LineNo = PcdDict[self._Arch, PcdCName, TokenSpaceGuid]\r
4231a819 410 if Setting is None:\r
ae7b6df8
LG
411 continue\r
412\r
413 DefaultValue, DatumType, TokenNumber = AnalyzePcdData(Setting)\r
414 validateranges, validlists, expressions = self._RawData.GetValidExpression(TokenSpaceGuid, PcdCName)\r
415 PcdObj = PcdClassObject(\r
416 PcdCName,\r
417 TokenSpaceGuid,\r
418 self._PCD_TYPE_STRING_[Type],\r
419 DatumType,\r
420 DefaultValue,\r
421 TokenNumber,\r
422 '',\r
423 {},\r
424 False,\r
425 None,\r
426 list(validateranges),\r
427 list(validlists),\r
428 list(expressions)\r
429 )\r
ccaa7754 430 PcdObj.DefinitionPosition = (self.MetaFile.File, LineNo)\r
ae7b6df8 431 if "." in TokenSpaceGuid:\r
ccaa7754 432 StrPcdSet.append((PcdObj, LineNo))\r
ae7b6df8
LG
433 else:\r
434 Pcds[PcdCName, TokenSpaceGuid, self._PCD_TYPE_STRING_[Type]] = PcdObj\r
435\r
436 StructurePcds = self.ProcessStructurePcd(StrPcdSet)\r
437 for pcd in StructurePcds:\r
438 Pcds[pcd.TokenCName, pcd.TokenSpaceGuidCName, self._PCD_TYPE_STRING_[Type]] = pcd\r
065a7d40
FB
439 StructPattern = re.compile(r'[_a-zA-Z][0-9A-Za-z_]*$')\r
440 for pcd in Pcds.values():\r
441 if pcd.DatumType not in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64, TAB_VOID, "BOOLEAN"]:\r
4231a819 442 if StructPattern.match(pcd.DatumType) is None:\r
ccaa7754 443 EdkLogger.error('build', FORMAT_INVALID, "DatumType only support BOOLEAN, UINT8, UINT16, UINT32, UINT64, VOID* or a valid struct name.", pcd.DefinitionPosition[0], pcd.DefinitionPosition[1])\r
065a7d40 444 for struct_pcd in Pcds.values():\r
ccaa7754
GL
445 if isinstance(struct_pcd, StructurePcd) and not struct_pcd.StructuredPcdIncludeFile:\r
446 EdkLogger.error("build", PCD_STRUCTURE_PCD_ERROR, "The structure Pcd %s.%s header file is not found in %s line %s \n" % (struct_pcd.TokenSpaceGuidCName, struct_pcd.TokenCName, struct_pcd.DefinitionPosition[0], struct_pcd.DefinitionPosition[1] ))\r
ae7b6df8
LG
447\r
448 return Pcds\r
0a57a978
FB
449 @property\r
450 def CommonIncludes(self):\r
451 if self._CommonIncludes is None:\r
452 self.Includes\r
453 return self._CommonIncludes\r
ae7b6df8
LG
454\r
455\r
456 _Macros = property(_GetMacros)\r
43fe4c40 457 Arch = property(_GetArch)\r
ae7b6df8
LG
458 PackageName = property(_GetPackageName)\r
459 Guid = property(_GetFileGuid)\r
460 Version = property(_GetVersion)\r
461\r
462 Protocols = property(_GetProtocol)\r
463 Ppis = property(_GetPpi)\r
464 Guids = property(_GetGuid)\r
465 Includes = property(_GetInclude)\r
466 LibraryClasses = property(_GetLibraryClass)\r
467 Pcds = property(_GetPcds)\r