]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - BaseTools/Source/Python/Workspace/DscBuildData.py
BaseTools: remove unused setter functions
[mirror_edk2.git] / BaseTools / Source / Python / Workspace / DscBuildData.py
... / ...
CommitLineData
1## @file\r
2# This file is used to create a database used by build tool\r
3#\r
4# Copyright (c) 2008 - 2018, Intel Corporation. All rights reserved.<BR>\r
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
14\r
15## Platform build information from DSC file\r
16#\r
17# This class is used to retrieve information stored in database and convert them\r
18# into PlatformBuildClassObject form for easier use for AutoGen.\r
19#\r
20from __future__ import print_function\r
21from __future__ import absolute_import\r
22from Common.StringUtils import *\r
23from Common.DataType import *\r
24from Common.Misc import *\r
25from types import *\r
26from Common.Expression import *\r
27from CommonDataClass.CommonClass import SkuInfoClass\r
28from Common.TargetTxtClassObject import *\r
29from Common.ToolDefClassObject import *\r
30from .MetaDataTable import *\r
31from .MetaFileTable import *\r
32from .MetaFileParser import *\r
33\r
34from .WorkspaceCommon import GetDeclaredPcd\r
35from Common.Misc import AnalyzeDscPcd\r
36from Common.Misc import ProcessDuplicatedInf\r
37import re\r
38from Common.Parsing import IsValidWord\r
39from Common.VariableAttributes import VariableAttributes\r
40import Common.GlobalData as GlobalData\r
41import subprocess\r
42from Common.Misc import SaveFileOnChange\r
43from Workspace.BuildClassObject import PlatformBuildClassObject, StructurePcd, PcdClassObject, ModuleBuildClassObject\r
44from collections import OrderedDict, defaultdict\r
45\r
46PcdValueInitName = 'PcdValueInit'\r
47\r
48PcdMainCHeader = '''\r
49/**\r
50 DO NOT EDIT\r
51 FILE auto-generated\r
52**/\r
53\r
54#include <stdio.h>\r
55#include <stdlib.h>\r
56#include <string.h>\r
57#include <PcdValueCommon.h>\r
58'''\r
59\r
60PcdMainCEntry = '''\r
61int\r
62main (\r
63 int argc,\r
64 char *argv[]\r
65 )\r
66{\r
67 return PcdValueMain (argc, argv);\r
68}\r
69'''\r
70\r
71PcdMakefileHeader = '''\r
72#\r
73# DO NOT EDIT\r
74# This file is auto-generated by build utility\r
75#\r
76\r
77'''\r
78\r
79WindowsCFLAGS = 'CFLAGS = $(CFLAGS) /wd4200 /wd4034 /wd4101 '\r
80LinuxCFLAGS = 'BUILD_CFLAGS += -Wno-pointer-to-int-cast -Wno-unused-variable '\r
81PcdMakefileEnd = '''\r
82!INCLUDE $(BASE_TOOLS_PATH)\Source\C\Makefiles\ms.common\r
83\r
84LIBS = $(LIB_PATH)\Common.lib\r
85\r
86!INCLUDE $(BASE_TOOLS_PATH)\Source\C\Makefiles\ms.app\r
87'''\r
88\r
89PcdGccMakefile = '''\r
90MAKEROOT ?= $(EDK_TOOLS_PATH)/Source/C\r
91LIBS = -lCommon\r
92'''\r
93\r
94variablePattern = re.compile(r'[\t\s]*0[xX][a-fA-F0-9]+$')\r
95\r
96## regular expressions for finding decimal and hex numbers\r
97Pattern = re.compile('^[1-9]\d*|0$')\r
98HexPattern = re.compile(r'0[xX][0-9a-fA-F]+$')\r
99## Regular expression for finding header file inclusions\r
100from AutoGen.GenMake import gIncludePattern\r
101\r
102## Find dependencies for one source file\r
103#\r
104# By searching recursively "#include" directive in file, find out all the\r
105# files needed by given source file. The dependecies will be only searched\r
106# in given search path list.\r
107#\r
108# @param SearchPathList The list of search path\r
109#\r
110# @retval list The list of files the given source file depends on\r
111#\r
112def GetDependencyList(FileStack, SearchPathList):\r
113 DepDb = dict()\r
114 DependencySet = set(FileStack)\r
115 while len(FileStack) > 0:\r
116 F = FileStack.pop()\r
117 FullPathDependList = []\r
118 CurrentFileDependencyList = []\r
119 if F in DepDb:\r
120 CurrentFileDependencyList = DepDb[F]\r
121 else:\r
122 try:\r
123 Fd = open(F, 'r')\r
124 FileContent = Fd.read()\r
125 except BaseException as X:\r
126 EdkLogger.error("build", FILE_OPEN_FAILURE, ExtraData=F + "\n\t" + str(X))\r
127 finally:\r
128 if "Fd" in dir(locals()):\r
129 Fd.close()\r
130\r
131 if len(FileContent) == 0:\r
132 continue\r
133\r
134 if FileContent[0] == 0xff or FileContent[0] == 0xfe:\r
135 FileContent = unicode(FileContent, "utf-16")\r
136 IncludedFileList = gIncludePattern.findall(FileContent)\r
137\r
138 for Inc in IncludedFileList:\r
139 Inc = Inc.strip()\r
140 Inc = os.path.normpath(Inc)\r
141 CurrentFileDependencyList.append(Inc)\r
142 DepDb[F] = CurrentFileDependencyList\r
143\r
144 CurrentFilePath = os.path.dirname(F)\r
145 PathList = [CurrentFilePath] + SearchPathList\r
146 for Inc in CurrentFileDependencyList:\r
147 for SearchPath in PathList:\r
148 FilePath = os.path.join(SearchPath, Inc)\r
149 if not os.path.exists(FilePath):\r
150 continue\r
151 if FilePath not in DependencySet:\r
152 FileStack.append(FilePath)\r
153 FullPathDependList.append(FilePath)\r
154 break\r
155 DependencySet.update(FullPathDependList)\r
156 DependencyList = list(DependencySet) # remove duplicate ones\r
157\r
158 return DependencyList\r
159\r
160class DscBuildData(PlatformBuildClassObject):\r
161 # dict used to convert PCD type in database to string used by build tool\r
162 _PCD_TYPE_STRING_ = {\r
163 MODEL_PCD_FIXED_AT_BUILD : TAB_PCDS_FIXED_AT_BUILD,\r
164 MODEL_PCD_PATCHABLE_IN_MODULE : TAB_PCDS_PATCHABLE_IN_MODULE,\r
165 MODEL_PCD_FEATURE_FLAG : TAB_PCDS_FEATURE_FLAG,\r
166 MODEL_PCD_DYNAMIC : TAB_PCDS_DYNAMIC,\r
167 MODEL_PCD_DYNAMIC_DEFAULT : TAB_PCDS_DYNAMIC,\r
168 MODEL_PCD_DYNAMIC_HII : TAB_PCDS_DYNAMIC_HII,\r
169 MODEL_PCD_DYNAMIC_VPD : TAB_PCDS_DYNAMIC_VPD,\r
170 MODEL_PCD_DYNAMIC_EX : TAB_PCDS_DYNAMIC_EX,\r
171 MODEL_PCD_DYNAMIC_EX_DEFAULT : TAB_PCDS_DYNAMIC_EX,\r
172 MODEL_PCD_DYNAMIC_EX_HII : TAB_PCDS_DYNAMIC_EX_HII,\r
173 MODEL_PCD_DYNAMIC_EX_VPD : TAB_PCDS_DYNAMIC_EX_VPD,\r
174 }\r
175\r
176 # dict used to convert part of [Defines] to members of DscBuildData directly\r
177 _PROPERTY_ = {\r
178 #\r
179 # Required Fields\r
180 #\r
181 TAB_DSC_DEFINES_PLATFORM_NAME : "_PlatformName",\r
182 TAB_DSC_DEFINES_PLATFORM_GUID : "_Guid",\r
183 TAB_DSC_DEFINES_PLATFORM_VERSION : "_Version",\r
184 TAB_DSC_DEFINES_DSC_SPECIFICATION : "_DscSpecification",\r
185 # TAB_DSC_DEFINES_OUTPUT_DIRECTORY : "_OutputDirectory",\r
186 # TAB_DSC_DEFINES_SUPPORTED_ARCHITECTURES : "_SupArchList",\r
187 # TAB_DSC_DEFINES_BUILD_TARGETS : "_BuildTargets",\r
188 TAB_DSC_DEFINES_SKUID_IDENTIFIER : "_SkuName",\r
189 # TAB_DSC_DEFINES_FLASH_DEFINITION : "_FlashDefinition",\r
190 TAB_DSC_DEFINES_BUILD_NUMBER : "_BuildNumber",\r
191 TAB_DSC_DEFINES_MAKEFILE_NAME : "_MakefileName",\r
192 TAB_DSC_DEFINES_BS_BASE_ADDRESS : "_BsBaseAddress",\r
193 TAB_DSC_DEFINES_RT_BASE_ADDRESS : "_RtBaseAddress",\r
194 # TAB_DSC_DEFINES_RFC_LANGUAGES : "_RFCLanguages",\r
195 # TAB_DSC_DEFINES_ISO_LANGUAGES : "_ISOLanguages",\r
196 }\r
197\r
198 # used to compose dummy library class name for those forced library instances\r
199 _NullLibraryNumber = 0\r
200\r
201 ## Constructor of DscBuildData\r
202 #\r
203 # Initialize object of DscBuildData\r
204 #\r
205 # @param FilePath The path of platform description file\r
206 # @param RawData The raw data of DSC file\r
207 # @param BuildDataBase Database used to retrieve module/package information\r
208 # @param Arch The target architecture\r
209 # @param Platform (not used for DscBuildData)\r
210 # @param Macros Macros used for replacement in DSC file\r
211 #\r
212 def __init__(self, FilePath, RawData, BuildDataBase, Arch=TAB_ARCH_COMMON, Target=None, Toolchain=None):\r
213 self.MetaFile = FilePath\r
214 self._RawData = RawData\r
215 self._Bdb = BuildDataBase\r
216 self._Arch = Arch\r
217 self._Target = Target\r
218 self._Toolchain = Toolchain\r
219 self._ToolChainFamily = None\r
220 self._Clear()\r
221 self._HandleOverridePath()\r
222 self.WorkspaceDir = os.getenv("WORKSPACE") if os.getenv("WORKSPACE") else ""\r
223 self.DefaultStores = None\r
224 self.SkuIdMgr = SkuClass(self.SkuName, self.SkuIds)\r
225 @property\r
226 def OutputPath(self):\r
227 if os.getenv("WORKSPACE"):\r
228 return os.path.join(os.getenv("WORKSPACE"), self.OutputDirectory, self._Target + "_" + self._Toolchain, PcdValueInitName)\r
229 else:\r
230 return os.path.dirname(self.DscFile)\r
231\r
232 ## XXX[key] = value\r
233 def __setitem__(self, key, value):\r
234 self.__dict__[self._PROPERTY_[key]] = value\r
235\r
236 ## value = XXX[key]\r
237 def __getitem__(self, key):\r
238 return self.__dict__[self._PROPERTY_[key]]\r
239\r
240 ## "in" test support\r
241 def __contains__(self, key):\r
242 return key in self._PROPERTY_\r
243\r
244 ## Set all internal used members of DscBuildData to None\r
245 def _Clear(self):\r
246 self._Header = None\r
247 self._PlatformName = None\r
248 self._Guid = None\r
249 self._Version = None\r
250 self._DscSpecification = None\r
251 self._OutputDirectory = None\r
252 self._SupArchList = None\r
253 self._BuildTargets = None\r
254 self._SkuName = None\r
255 self._PcdInfoFlag = None\r
256 self._VarCheckFlag = None\r
257 self._FlashDefinition = None\r
258 self._Prebuild = None\r
259 self._Postbuild = None\r
260 self._BuildNumber = None\r
261 self._MakefileName = None\r
262 self._BsBaseAddress = None\r
263 self._RtBaseAddress = None\r
264 self._SkuIds = None\r
265 self._Modules = None\r
266 self._LibraryInstances = None\r
267 self._LibraryClasses = None\r
268 self._Pcds = None\r
269 self._DecPcds = None\r
270 self._BuildOptions = None\r
271 self._ModuleTypeOptions = None\r
272 self._LoadFixAddress = None\r
273 self._RFCLanguages = None\r
274 self._ISOLanguages = None\r
275 self._VpdToolGuid = None\r
276 self.__Macros = None\r
277 self.DefaultStores = None\r
278\r
279\r
280 ## handle Override Path of Module\r
281 def _HandleOverridePath(self):\r
282 RecordList = self._RawData[MODEL_META_DATA_COMPONENT, self._Arch]\r
283 for Record in RecordList:\r
284 ModuleId = Record[6]\r
285 LineNo = Record[7]\r
286 ModuleFile = PathClass(NormPath(Record[0]), GlobalData.gWorkspace, Arch=self._Arch)\r
287 RecordList = self._RawData[MODEL_META_DATA_COMPONENT_SOURCE_OVERRIDE_PATH, self._Arch, None, ModuleId]\r
288 if RecordList != []:\r
289 SourceOverridePath = mws.join(GlobalData.gWorkspace, NormPath(RecordList[0][0]))\r
290\r
291 # Check if the source override path exists\r
292 if not os.path.isdir(SourceOverridePath):\r
293 EdkLogger.error('build', FILE_NOT_FOUND, Message='Source override path does not exist:', File=self.MetaFile, ExtraData=SourceOverridePath, Line=LineNo)\r
294\r
295 # Add to GlobalData Variables\r
296 GlobalData.gOverrideDir[ModuleFile.Key] = SourceOverridePath\r
297\r
298 ## Get current effective macros\r
299 def _GetMacros(self):\r
300 if self.__Macros is None:\r
301 self.__Macros = {}\r
302 self.__Macros.update(GlobalData.gPlatformDefines)\r
303 self.__Macros.update(GlobalData.gGlobalDefines)\r
304 self.__Macros.update(GlobalData.gCommandLineDefines)\r
305 return self.__Macros\r
306\r
307 ## Get architecture\r
308 def _GetArch(self):\r
309 return self._Arch\r
310\r
311 ## Retrieve all information in [Defines] section\r
312 #\r
313 # (Retriving all [Defines] information in one-shot is just to save time.)\r
314 #\r
315 def _GetHeaderInfo(self):\r
316 RecordList = self._RawData[MODEL_META_DATA_HEADER, self._Arch]\r
317 for Record in RecordList:\r
318 Name = Record[1]\r
319 # items defined _PROPERTY_ don't need additional processing\r
320\r
321 # some special items in [Defines] section need special treatment\r
322 if Name == TAB_DSC_DEFINES_OUTPUT_DIRECTORY:\r
323 self._OutputDirectory = NormPath(Record[2], self._Macros)\r
324 if ' ' in self._OutputDirectory:\r
325 EdkLogger.error("build", FORMAT_NOT_SUPPORTED, "No space is allowed in OUTPUT_DIRECTORY",\r
326 File=self.MetaFile, Line=Record[-1],\r
327 ExtraData=self._OutputDirectory)\r
328 elif Name == TAB_DSC_DEFINES_FLASH_DEFINITION:\r
329 self._FlashDefinition = PathClass(NormPath(Record[2], self._Macros), GlobalData.gWorkspace)\r
330 ErrorCode, ErrorInfo = self._FlashDefinition.Validate('.fdf')\r
331 if ErrorCode != 0:\r
332 EdkLogger.error('build', ErrorCode, File=self.MetaFile, Line=Record[-1],\r
333 ExtraData=ErrorInfo)\r
334 elif Name == TAB_DSC_PREBUILD:\r
335 PrebuildValue = Record[2]\r
336 if Record[2][0] == '"':\r
337 if Record[2][-1] != '"':\r
338 EdkLogger.error('build', FORMAT_INVALID, 'Missing double quotes in the end of %s statement.' % TAB_DSC_PREBUILD,\r
339 File=self.MetaFile, Line=Record[-1])\r
340 PrebuildValue = Record[2][1:-1]\r
341 self._Prebuild = PrebuildValue\r
342 elif Name == TAB_DSC_POSTBUILD:\r
343 PostbuildValue = Record[2]\r
344 if Record[2][0] == '"':\r
345 if Record[2][-1] != '"':\r
346 EdkLogger.error('build', FORMAT_INVALID, 'Missing double quotes in the end of %s statement.' % TAB_DSC_POSTBUILD,\r
347 File=self.MetaFile, Line=Record[-1])\r
348 PostbuildValue = Record[2][1:-1]\r
349 self._Postbuild = PostbuildValue\r
350 elif Name == TAB_DSC_DEFINES_SUPPORTED_ARCHITECTURES:\r
351 self._SupArchList = GetSplitValueList(Record[2], TAB_VALUE_SPLIT)\r
352 elif Name == TAB_DSC_DEFINES_BUILD_TARGETS:\r
353 self._BuildTargets = GetSplitValueList(Record[2])\r
354 elif Name == TAB_DSC_DEFINES_SKUID_IDENTIFIER:\r
355 if self._SkuName is None:\r
356 self._SkuName = Record[2]\r
357 if GlobalData.gSKUID_CMD:\r
358 self._SkuName = GlobalData.gSKUID_CMD\r
359 elif Name == TAB_DSC_DEFINES_PCD_INFO_GENERATION:\r
360 self._PcdInfoFlag = Record[2]\r
361 elif Name == TAB_DSC_DEFINES_PCD_VAR_CHECK_GENERATION:\r
362 self._VarCheckFlag = Record[2]\r
363 elif Name == TAB_FIX_LOAD_TOP_MEMORY_ADDRESS:\r
364 try:\r
365 self._LoadFixAddress = int (Record[2], 0)\r
366 except:\r
367 EdkLogger.error("build", PARAMETER_INVALID, "FIX_LOAD_TOP_MEMORY_ADDRESS %s is not valid dec or hex string" % (Record[2]))\r
368 elif Name == TAB_DSC_DEFINES_RFC_LANGUAGES:\r
369 if not Record[2] or Record[2][0] != '"' or Record[2][-1] != '"' or len(Record[2]) == 1:\r
370 EdkLogger.error('build', FORMAT_NOT_SUPPORTED, 'language code for RFC_LANGUAGES must have double quotes around it, for example: RFC_LANGUAGES = "en-us;zh-hans"',\r
371 File=self.MetaFile, Line=Record[-1])\r
372 LanguageCodes = Record[2][1:-1]\r
373 if not LanguageCodes:\r
374 EdkLogger.error('build', FORMAT_NOT_SUPPORTED, 'one or more RFC4646 format language code must be provided for RFC_LANGUAGES statement',\r
375 File=self.MetaFile, Line=Record[-1])\r
376 LanguageList = GetSplitValueList(LanguageCodes, TAB_SEMI_COLON_SPLIT)\r
377 # check whether there is empty entries in the list\r
378 if None in LanguageList:\r
379 EdkLogger.error('build', FORMAT_NOT_SUPPORTED, 'one or more empty language code is in RFC_LANGUAGES statement',\r
380 File=self.MetaFile, Line=Record[-1])\r
381 self._RFCLanguages = LanguageList\r
382 elif Name == TAB_DSC_DEFINES_ISO_LANGUAGES:\r
383 if not Record[2] or Record[2][0] != '"' or Record[2][-1] != '"' or len(Record[2]) == 1:\r
384 EdkLogger.error('build', FORMAT_NOT_SUPPORTED, 'language code for ISO_LANGUAGES must have double quotes around it, for example: ISO_LANGUAGES = "engchn"',\r
385 File=self.MetaFile, Line=Record[-1])\r
386 LanguageCodes = Record[2][1:-1]\r
387 if not LanguageCodes:\r
388 EdkLogger.error('build', FORMAT_NOT_SUPPORTED, 'one or more ISO639-2 format language code must be provided for ISO_LANGUAGES statement',\r
389 File=self.MetaFile, Line=Record[-1])\r
390 if len(LanguageCodes) % 3:\r
391 EdkLogger.error('build', FORMAT_NOT_SUPPORTED, 'bad ISO639-2 format for ISO_LANGUAGES',\r
392 File=self.MetaFile, Line=Record[-1])\r
393 LanguageList = []\r
394 for i in range(0, len(LanguageCodes), 3):\r
395 LanguageList.append(LanguageCodes[i:i + 3])\r
396 self._ISOLanguages = LanguageList\r
397 elif Name == TAB_DSC_DEFINES_VPD_TOOL_GUID:\r
398 #\r
399 # try to convert GUID to a real UUID value to see whether the GUID is format\r
400 # for VPD_TOOL_GUID is correct.\r
401 #\r
402 try:\r
403 uuid.UUID(Record[2])\r
404 except:\r
405 EdkLogger.error("build", FORMAT_INVALID, "Invalid GUID format for VPD_TOOL_GUID", File=self.MetaFile)\r
406 self._VpdToolGuid = Record[2]\r
407 elif Name in self:\r
408 self[Name] = Record[2]\r
409 # set _Header to non-None in order to avoid database re-querying\r
410 self._Header = 'DUMMY'\r
411\r
412 ## Retrieve platform name\r
413 def _GetPlatformName(self):\r
414 if self._PlatformName is None:\r
415 if self._Header is None:\r
416 self._GetHeaderInfo()\r
417 if self._PlatformName is None:\r
418 EdkLogger.error('build', ATTRIBUTE_NOT_AVAILABLE, "No PLATFORM_NAME", File=self.MetaFile)\r
419 return self._PlatformName\r
420\r
421 ## Retrieve file guid\r
422 def _GetFileGuid(self):\r
423 if self._Guid is None:\r
424 if self._Header is None:\r
425 self._GetHeaderInfo()\r
426 if self._Guid is None:\r
427 EdkLogger.error('build', ATTRIBUTE_NOT_AVAILABLE, "No PLATFORM_GUID", File=self.MetaFile)\r
428 return self._Guid\r
429\r
430 ## Retrieve platform version\r
431 def _GetVersion(self):\r
432 if self._Version is None:\r
433 if self._Header is None:\r
434 self._GetHeaderInfo()\r
435 if self._Version is None:\r
436 EdkLogger.error('build', ATTRIBUTE_NOT_AVAILABLE, "No PLATFORM_VERSION", File=self.MetaFile)\r
437 return self._Version\r
438\r
439 ## Retrieve platform description file version\r
440 def _GetDscSpec(self):\r
441 if self._DscSpecification is None:\r
442 if self._Header is None:\r
443 self._GetHeaderInfo()\r
444 if self._DscSpecification is None:\r
445 EdkLogger.error('build', ATTRIBUTE_NOT_AVAILABLE, "No DSC_SPECIFICATION", File=self.MetaFile)\r
446 return self._DscSpecification\r
447\r
448 ## Retrieve OUTPUT_DIRECTORY\r
449 def _GetOutpuDir(self):\r
450 if self._OutputDirectory is None:\r
451 if self._Header is None:\r
452 self._GetHeaderInfo()\r
453 if self._OutputDirectory is None:\r
454 self._OutputDirectory = os.path.join("Build", self._PlatformName)\r
455 return self._OutputDirectory\r
456\r
457 ## Retrieve SUPPORTED_ARCHITECTURES\r
458 def _GetSupArch(self):\r
459 if self._SupArchList is None:\r
460 if self._Header is None:\r
461 self._GetHeaderInfo()\r
462 if self._SupArchList is None:\r
463 EdkLogger.error('build', ATTRIBUTE_NOT_AVAILABLE, "No SUPPORTED_ARCHITECTURES", File=self.MetaFile)\r
464 return self._SupArchList\r
465\r
466 ## Retrieve BUILD_TARGETS\r
467 def _GetBuildTarget(self):\r
468 if self._BuildTargets is None:\r
469 if self._Header is None:\r
470 self._GetHeaderInfo()\r
471 if self._BuildTargets is None:\r
472 EdkLogger.error('build', ATTRIBUTE_NOT_AVAILABLE, "No BUILD_TARGETS", File=self.MetaFile)\r
473 return self._BuildTargets\r
474\r
475 def _GetPcdInfoFlag(self):\r
476 if self._PcdInfoFlag is None or self._PcdInfoFlag.upper() == 'FALSE':\r
477 return False\r
478 elif self._PcdInfoFlag.upper() == 'TRUE':\r
479 return True\r
480 else:\r
481 return False\r
482 def _GetVarCheckFlag(self):\r
483 if self._VarCheckFlag is None or self._VarCheckFlag.upper() == 'FALSE':\r
484 return False\r
485 elif self._VarCheckFlag.upper() == 'TRUE':\r
486 return True\r
487 else:\r
488 return False\r
489\r
490 # # Retrieve SKUID_IDENTIFIER\r
491 def _GetSkuName(self):\r
492 if self._SkuName is None:\r
493 if self._Header is None:\r
494 self._GetHeaderInfo()\r
495 if self._SkuName is None:\r
496 self._SkuName = TAB_DEFAULT\r
497 return self._SkuName\r
498\r
499 ## Override SKUID_IDENTIFIER\r
500 def _SetSkuName(self, Value):\r
501 self._SkuName = Value\r
502\r
503 def _GetFdfFile(self):\r
504 if self._FlashDefinition is None:\r
505 if self._Header is None:\r
506 self._GetHeaderInfo()\r
507 if self._FlashDefinition is None:\r
508 self._FlashDefinition = ''\r
509 return self._FlashDefinition\r
510\r
511 def _GetPrebuild(self):\r
512 if self._Prebuild is None:\r
513 if self._Header is None:\r
514 self._GetHeaderInfo()\r
515 if self._Prebuild is None:\r
516 self._Prebuild = ''\r
517 return self._Prebuild\r
518\r
519 def _GetPostbuild(self):\r
520 if self._Postbuild is None:\r
521 if self._Header is None:\r
522 self._GetHeaderInfo()\r
523 if self._Postbuild is None:\r
524 self._Postbuild = ''\r
525 return self._Postbuild\r
526\r
527 ## Retrieve FLASH_DEFINITION\r
528 def _GetBuildNumber(self):\r
529 if self._BuildNumber is None:\r
530 if self._Header is None:\r
531 self._GetHeaderInfo()\r
532 if self._BuildNumber is None:\r
533 self._BuildNumber = ''\r
534 return self._BuildNumber\r
535\r
536 ## Retrieve MAKEFILE_NAME\r
537 def _GetMakefileName(self):\r
538 if self._MakefileName is None:\r
539 if self._Header is None:\r
540 self._GetHeaderInfo()\r
541 if self._MakefileName is None:\r
542 self._MakefileName = ''\r
543 return self._MakefileName\r
544\r
545 ## Retrieve BsBaseAddress\r
546 def _GetBsBaseAddress(self):\r
547 if self._BsBaseAddress is None:\r
548 if self._Header is None:\r
549 self._GetHeaderInfo()\r
550 if self._BsBaseAddress is None:\r
551 self._BsBaseAddress = ''\r
552 return self._BsBaseAddress\r
553\r
554 ## Retrieve RtBaseAddress\r
555 def _GetRtBaseAddress(self):\r
556 if self._RtBaseAddress is None:\r
557 if self._Header is None:\r
558 self._GetHeaderInfo()\r
559 if self._RtBaseAddress is None:\r
560 self._RtBaseAddress = ''\r
561 return self._RtBaseAddress\r
562\r
563 ## Retrieve the top address for the load fix address\r
564 def _GetLoadFixAddress(self):\r
565 if self._LoadFixAddress is None:\r
566 if self._Header is None:\r
567 self._GetHeaderInfo()\r
568\r
569 if self._LoadFixAddress is None:\r
570 self._LoadFixAddress = self._Macros.get(TAB_FIX_LOAD_TOP_MEMORY_ADDRESS, '0')\r
571\r
572 try:\r
573 self._LoadFixAddress = int (self._LoadFixAddress, 0)\r
574 except:\r
575 EdkLogger.error("build", PARAMETER_INVALID, "FIX_LOAD_TOP_MEMORY_ADDRESS %s is not valid dec or hex string" % (self._LoadFixAddress))\r
576\r
577 #\r
578 # If command line defined, should override the value in DSC file.\r
579 #\r
580 if 'FIX_LOAD_TOP_MEMORY_ADDRESS' in GlobalData.gCommandLineDefines:\r
581 try:\r
582 self._LoadFixAddress = int(GlobalData.gCommandLineDefines['FIX_LOAD_TOP_MEMORY_ADDRESS'], 0)\r
583 except:\r
584 EdkLogger.error("build", PARAMETER_INVALID, "FIX_LOAD_TOP_MEMORY_ADDRESS %s is not valid dec or hex string" % (GlobalData.gCommandLineDefines['FIX_LOAD_TOP_MEMORY_ADDRESS']))\r
585\r
586 if self._LoadFixAddress < 0:\r
587 EdkLogger.error("build", PARAMETER_INVALID, "FIX_LOAD_TOP_MEMORY_ADDRESS is set to the invalid negative value 0x%x" % (self._LoadFixAddress))\r
588 if self._LoadFixAddress != 0xFFFFFFFFFFFFFFFF and self._LoadFixAddress % 0x1000 != 0:\r
589 EdkLogger.error("build", PARAMETER_INVALID, "FIX_LOAD_TOP_MEMORY_ADDRESS is set to the invalid unaligned 4K value 0x%x" % (self._LoadFixAddress))\r
590\r
591 return self._LoadFixAddress\r
592\r
593 ## Retrieve RFCLanguage filter\r
594 def _GetRFCLanguages(self):\r
595 if self._RFCLanguages is None:\r
596 if self._Header is None:\r
597 self._GetHeaderInfo()\r
598 if self._RFCLanguages is None:\r
599 self._RFCLanguages = []\r
600 return self._RFCLanguages\r
601\r
602 ## Retrieve ISOLanguage filter\r
603 def _GetISOLanguages(self):\r
604 if self._ISOLanguages is None:\r
605 if self._Header is None:\r
606 self._GetHeaderInfo()\r
607 if self._ISOLanguages is None:\r
608 self._ISOLanguages = []\r
609 return self._ISOLanguages\r
610 ## Retrieve the GUID string for VPD tool\r
611 def _GetVpdToolGuid(self):\r
612 if self._VpdToolGuid is None:\r
613 if self._Header is None:\r
614 self._GetHeaderInfo()\r
615 if self._VpdToolGuid is None:\r
616 self._VpdToolGuid = ''\r
617 return self._VpdToolGuid\r
618\r
619 ## Retrieve [SkuIds] section information\r
620 def _GetSkuIds(self):\r
621 if self._SkuIds is None:\r
622 self._SkuIds = OrderedDict()\r
623 RecordList = self._RawData[MODEL_EFI_SKU_ID, self._Arch]\r
624 for Record in RecordList:\r
625 if not Record[0]:\r
626 EdkLogger.error('build', FORMAT_INVALID, 'No Sku ID number',\r
627 File=self.MetaFile, Line=Record[-1])\r
628 if not Record[1]:\r
629 EdkLogger.error('build', FORMAT_INVALID, 'No Sku ID name',\r
630 File=self.MetaFile, Line=Record[-1])\r
631 if not Pattern.match(Record[0]) and not HexPattern.match(Record[0]):\r
632 EdkLogger.error('build', FORMAT_INVALID, "The format of the Sku ID number is invalid. It only support Integer and HexNumber",\r
633 File=self.MetaFile, Line=Record[-1])\r
634 if not IsValidWord(Record[1]):\r
635 EdkLogger.error('build', FORMAT_INVALID, "The format of the Sku ID name is invalid. The correct format is '(a-zA-Z0-9_)(a-zA-Z0-9_-.)*'",\r
636 File=self.MetaFile, Line=Record[-1])\r
637 self._SkuIds[Record[1].upper()] = (str(DscBuildData.ToInt(Record[0])), Record[1].upper(), Record[2].upper())\r
638 if TAB_DEFAULT not in self._SkuIds:\r
639 self._SkuIds[TAB_DEFAULT] = ("0", TAB_DEFAULT, TAB_DEFAULT)\r
640 if TAB_COMMON not in self._SkuIds:\r
641 self._SkuIds[TAB_COMMON] = ("0", TAB_DEFAULT, TAB_DEFAULT)\r
642 return self._SkuIds\r
643\r
644 @staticmethod\r
645 def ToInt(intstr):\r
646 return int(intstr, 16) if intstr.upper().startswith("0X") else int(intstr)\r
647\r
648 def _GetDefaultStores(self):\r
649 if self.DefaultStores is None:\r
650 self.DefaultStores = OrderedDict()\r
651 RecordList = self._RawData[MODEL_EFI_DEFAULT_STORES, self._Arch]\r
652 for Record in RecordList:\r
653 if not Record[0]:\r
654 EdkLogger.error('build', FORMAT_INVALID, 'No DefaultStores ID number',\r
655 File=self.MetaFile, Line=Record[-1])\r
656 if not Record[1]:\r
657 EdkLogger.error('build', FORMAT_INVALID, 'No DefaultStores ID name',\r
658 File=self.MetaFile, Line=Record[-1])\r
659 if not Pattern.match(Record[0]) and not HexPattern.match(Record[0]):\r
660 EdkLogger.error('build', FORMAT_INVALID, "The format of the DefaultStores ID number is invalid. It only support Integer and HexNumber",\r
661 File=self.MetaFile, Line=Record[-1])\r
662 if not IsValidWord(Record[1]):\r
663 EdkLogger.error('build', FORMAT_INVALID, "The format of the DefaultStores ID name is invalid. The correct format is '(a-zA-Z0-9_)(a-zA-Z0-9_-.)*'",\r
664 File=self.MetaFile, Line=Record[-1])\r
665 self.DefaultStores[Record[1].upper()] = (DscBuildData.ToInt(Record[0]), Record[1].upper())\r
666 if TAB_DEFAULT_STORES_DEFAULT not in self.DefaultStores:\r
667 self.DefaultStores[TAB_DEFAULT_STORES_DEFAULT] = (0, TAB_DEFAULT_STORES_DEFAULT)\r
668 GlobalData.gDefaultStores = sorted(self.DefaultStores.keys())\r
669 return self.DefaultStores\r
670\r
671 ## Retrieve [Components] section information\r
672 def _GetModules(self):\r
673 if self._Modules is not None:\r
674 return self._Modules\r
675\r
676 self._Modules = OrderedDict()\r
677 RecordList = self._RawData[MODEL_META_DATA_COMPONENT, self._Arch]\r
678 Macros = self._Macros\r
679 Macros["EDK_SOURCE"] = GlobalData.gEcpSource\r
680 for Record in RecordList:\r
681 DuplicatedFile = False\r
682\r
683 ModuleFile = PathClass(NormPath(Record[0], Macros), GlobalData.gWorkspace, Arch=self._Arch)\r
684 ModuleId = Record[6]\r
685 LineNo = Record[7]\r
686\r
687 # check the file validation\r
688 ErrorCode, ErrorInfo = ModuleFile.Validate('.inf')\r
689 if ErrorCode != 0:\r
690 EdkLogger.error('build', ErrorCode, File=self.MetaFile, Line=LineNo,\r
691 ExtraData=ErrorInfo)\r
692 # Check duplication\r
693 # If arch is COMMON, no duplicate module is checked since all modules in all component sections are selected\r
694 if self._Arch != TAB_ARCH_COMMON and ModuleFile in self._Modules:\r
695 DuplicatedFile = True\r
696\r
697 Module = ModuleBuildClassObject()\r
698 Module.MetaFile = ModuleFile\r
699\r
700 # get module private library instance\r
701 RecordList = self._RawData[MODEL_EFI_LIBRARY_CLASS, self._Arch, None, ModuleId]\r
702 for Record in RecordList:\r
703 LibraryClass = Record[0]\r
704 LibraryPath = PathClass(NormPath(Record[1], Macros), GlobalData.gWorkspace, Arch=self._Arch)\r
705 LineNo = Record[-1]\r
706\r
707 # check the file validation\r
708 ErrorCode, ErrorInfo = LibraryPath.Validate('.inf')\r
709 if ErrorCode != 0:\r
710 EdkLogger.error('build', ErrorCode, File=self.MetaFile, Line=LineNo,\r
711 ExtraData=ErrorInfo)\r
712\r
713 if LibraryClass == '' or LibraryClass == 'NULL':\r
714 self._NullLibraryNumber += 1\r
715 LibraryClass = 'NULL%d' % self._NullLibraryNumber\r
716 EdkLogger.verbose("Found forced library for %s\n\t%s [%s]" % (ModuleFile, LibraryPath, LibraryClass))\r
717 Module.LibraryClasses[LibraryClass] = LibraryPath\r
718 if LibraryPath not in self.LibraryInstances:\r
719 self.LibraryInstances.append(LibraryPath)\r
720\r
721 # get module private PCD setting\r
722 for Type in [MODEL_PCD_FIXED_AT_BUILD, MODEL_PCD_PATCHABLE_IN_MODULE, \\r
723 MODEL_PCD_FEATURE_FLAG, MODEL_PCD_DYNAMIC, MODEL_PCD_DYNAMIC_EX]:\r
724 RecordList = self._RawData[Type, self._Arch, None, ModuleId]\r
725 for TokenSpaceGuid, PcdCName, Setting, Dummy1, Dummy2, Dummy3, Dummy4, Dummy5 in RecordList:\r
726 TokenList = GetSplitValueList(Setting)\r
727 DefaultValue = TokenList[0]\r
728 # the format is PcdName| Value | VOID* | MaxDatumSize\r
729 if len(TokenList) > 2:\r
730 MaxDatumSize = TokenList[2]\r
731 else:\r
732 MaxDatumSize = ''\r
733 TypeString = self._PCD_TYPE_STRING_[Type]\r
734 Pcd = PcdClassObject(\r
735 PcdCName,\r
736 TokenSpaceGuid,\r
737 TypeString,\r
738 '',\r
739 DefaultValue,\r
740 '',\r
741 MaxDatumSize,\r
742 {},\r
743 False,\r
744 None\r
745 )\r
746 Module.Pcds[PcdCName, TokenSpaceGuid] = Pcd\r
747\r
748 # get module private build options\r
749 RecordList = self._RawData[MODEL_META_DATA_BUILD_OPTION, self._Arch, None, ModuleId]\r
750 for ToolChainFamily, ToolChain, Option, Dummy1, Dummy2, Dummy3, Dummy4, Dummy5 in RecordList:\r
751 if (ToolChainFamily, ToolChain) not in Module.BuildOptions:\r
752 Module.BuildOptions[ToolChainFamily, ToolChain] = Option\r
753 else:\r
754 OptionString = Module.BuildOptions[ToolChainFamily, ToolChain]\r
755 Module.BuildOptions[ToolChainFamily, ToolChain] = OptionString + " " + Option\r
756\r
757 RecordList = self._RawData[MODEL_META_DATA_HEADER, self._Arch, None, ModuleId]\r
758 if DuplicatedFile and not RecordList:\r
759 EdkLogger.error('build', FILE_DUPLICATED, File=self.MetaFile, ExtraData=str(ModuleFile), Line=LineNo)\r
760 if RecordList:\r
761 if len(RecordList) != 1:\r
762 EdkLogger.error('build', OPTION_UNKNOWN, 'Only FILE_GUID can be listed in <Defines> section.',\r
763 File=self.MetaFile, ExtraData=str(ModuleFile), Line=LineNo)\r
764 ModuleFile = ProcessDuplicatedInf(ModuleFile, RecordList[0][2], GlobalData.gWorkspace)\r
765 ModuleFile.Arch = self._Arch\r
766\r
767 self._Modules[ModuleFile] = Module\r
768 return self._Modules\r
769\r
770 ## Retrieve all possible library instances used in this platform\r
771 def _GetLibraryInstances(self):\r
772 if self._LibraryInstances is None:\r
773 self._GetLibraryClasses()\r
774 return self._LibraryInstances\r
775\r
776 ## Retrieve [LibraryClasses] information\r
777 def _GetLibraryClasses(self):\r
778 if self._LibraryClasses is None:\r
779 self._LibraryInstances = []\r
780 #\r
781 # tdict is a special dict kind of type, used for selecting correct\r
782 # library instance for given library class and module type\r
783 #\r
784 LibraryClassDict = tdict(True, 3)\r
785 # track all library class names\r
786 LibraryClassSet = set()\r
787 RecordList = self._RawData[MODEL_EFI_LIBRARY_CLASS, self._Arch, None, -1]\r
788 Macros = self._Macros\r
789 for Record in RecordList:\r
790 LibraryClass, LibraryInstance, Dummy, Arch, ModuleType, Dummy, Dummy, LineNo = Record\r
791 if LibraryClass == '' or LibraryClass == 'NULL':\r
792 self._NullLibraryNumber += 1\r
793 LibraryClass = 'NULL%d' % self._NullLibraryNumber\r
794 EdkLogger.verbose("Found forced library for arch=%s\n\t%s [%s]" % (Arch, LibraryInstance, LibraryClass))\r
795 LibraryClassSet.add(LibraryClass)\r
796 LibraryInstance = PathClass(NormPath(LibraryInstance, Macros), GlobalData.gWorkspace, Arch=self._Arch)\r
797 # check the file validation\r
798 ErrorCode, ErrorInfo = LibraryInstance.Validate('.inf')\r
799 if ErrorCode != 0:\r
800 EdkLogger.error('build', ErrorCode, File=self.MetaFile, Line=LineNo,\r
801 ExtraData=ErrorInfo)\r
802\r
803 if ModuleType != TAB_COMMON and ModuleType not in SUP_MODULE_LIST:\r
804 EdkLogger.error('build', OPTION_UNKNOWN, "Unknown module type [%s]" % ModuleType,\r
805 File=self.MetaFile, ExtraData=LibraryInstance, Line=LineNo)\r
806 LibraryClassDict[Arch, ModuleType, LibraryClass] = LibraryInstance\r
807 if LibraryInstance not in self._LibraryInstances:\r
808 self._LibraryInstances.append(LibraryInstance)\r
809\r
810 # resolve the specific library instance for each class and each module type\r
811 self._LibraryClasses = tdict(True)\r
812 for LibraryClass in LibraryClassSet:\r
813 # try all possible module types\r
814 for ModuleType in SUP_MODULE_LIST:\r
815 LibraryInstance = LibraryClassDict[self._Arch, ModuleType, LibraryClass]\r
816 if LibraryInstance is None:\r
817 continue\r
818 self._LibraryClasses[LibraryClass, ModuleType] = LibraryInstance\r
819\r
820 # for Edk style library instances, which are listed in different section\r
821 Macros["EDK_SOURCE"] = GlobalData.gEcpSource\r
822 RecordList = self._RawData[MODEL_EFI_LIBRARY_INSTANCE, self._Arch]\r
823 for Record in RecordList:\r
824 File = PathClass(NormPath(Record[0], Macros), GlobalData.gWorkspace, Arch=self._Arch)\r
825 LineNo = Record[-1]\r
826 # check the file validation\r
827 ErrorCode, ErrorInfo = File.Validate('.inf')\r
828 if ErrorCode != 0:\r
829 EdkLogger.error('build', ErrorCode, File=self.MetaFile, Line=LineNo,\r
830 ExtraData=ErrorInfo)\r
831 if File not in self._LibraryInstances:\r
832 self._LibraryInstances.append(File)\r
833 #\r
834 # we need the module name as the library class name, so we have\r
835 # to parse it here. (self._Bdb[] will trigger a file parse if it\r
836 # hasn't been parsed)\r
837 #\r
838 Library = self._Bdb[File, self._Arch, self._Target, self._Toolchain]\r
839 self._LibraryClasses[Library.BaseName, ':dummy:'] = Library\r
840 return self._LibraryClasses\r
841\r
842 def _ValidatePcd(self, PcdCName, TokenSpaceGuid, Setting, PcdType, LineNo):\r
843 if self._DecPcds is None:\r
844\r
845 FdfInfList = []\r
846 if GlobalData.gFdfParser:\r
847 FdfInfList = GlobalData.gFdfParser.Profile.InfList\r
848\r
849 PkgSet = set()\r
850 for Inf in FdfInfList:\r
851 ModuleFile = PathClass(NormPath(Inf), GlobalData.gWorkspace, Arch=self._Arch)\r
852 if ModuleFile in self._Modules:\r
853 continue\r
854 ModuleData = self._Bdb[ModuleFile, self._Arch, self._Target, self._Toolchain]\r
855 PkgSet.update(ModuleData.Packages)\r
856\r
857 self._DecPcds, self._GuidDict = GetDeclaredPcd(self, self._Bdb, self._Arch, self._Target, self._Toolchain, PkgSet)\r
858 self._GuidDict.update(GlobalData.gPlatformPcds)\r
859\r
860 if (PcdCName, TokenSpaceGuid) not in self._DecPcds:\r
861 EdkLogger.error('build', PARSER_ERROR,\r
862 "Pcd (%s.%s) defined in DSC is not declared in DEC files. Arch: ['%s']" % (TokenSpaceGuid, PcdCName, self._Arch),\r
863 File=self.MetaFile, Line=LineNo)\r
864 ValueList, IsValid, Index = AnalyzeDscPcd(Setting, PcdType, self._DecPcds[PcdCName, TokenSpaceGuid].DatumType)\r
865 if not IsValid:\r
866 if PcdType not in [MODEL_PCD_FEATURE_FLAG, MODEL_PCD_FIXED_AT_BUILD]:\r
867 EdkLogger.error('build', FORMAT_INVALID, "Pcd format incorrect.", File=self.MetaFile, Line=LineNo,\r
868 ExtraData="%s.%s|%s" % (TokenSpaceGuid, PcdCName, Setting))\r
869 else:\r
870 if ValueList[2] == '-1':\r
871 EdkLogger.error('build', FORMAT_INVALID, "Pcd format incorrect.", File=self.MetaFile, Line=LineNo,\r
872 ExtraData="%s.%s|%s" % (TokenSpaceGuid, PcdCName, Setting))\r
873 if ValueList[Index]:\r
874 DatumType = self._DecPcds[PcdCName, TokenSpaceGuid].DatumType\r
875 try:\r
876 ValueList[Index] = ValueExpressionEx(ValueList[Index], DatumType, self._GuidDict)(True)\r
877 except BadExpression as Value:\r
878 EdkLogger.error('Parser', FORMAT_INVALID, Value, File=self.MetaFile, Line=LineNo,\r
879 ExtraData="PCD [%s.%s] Value \"%s\" " % (\r
880 TokenSpaceGuid, PcdCName, ValueList[Index]))\r
881 except EvaluationException as Excpt:\r
882 if hasattr(Excpt, 'Pcd'):\r
883 if Excpt.Pcd in GlobalData.gPlatformOtherPcds:\r
884 EdkLogger.error('Parser', FORMAT_INVALID, "Cannot use this PCD (%s) in an expression as"\r
885 " it must be defined in a [PcdsFixedAtBuild] or [PcdsFeatureFlag] section"\r
886 " of the DSC file" % Excpt.Pcd,\r
887 File=self.MetaFile, Line=LineNo)\r
888 else:\r
889 EdkLogger.error('Parser', FORMAT_INVALID, "PCD (%s) is not defined in DSC file" % Excpt.Pcd,\r
890 File=self.MetaFile, Line=LineNo)\r
891 else:\r
892 EdkLogger.error('Parser', FORMAT_INVALID, "Invalid expression: %s" % str(Excpt),\r
893 File=self.MetaFile, Line=LineNo)\r
894\r
895 if ValueList[Index]:\r
896 Valid, ErrStr = CheckPcdDatum(self._DecPcds[PcdCName, TokenSpaceGuid].DatumType, ValueList[Index])\r
897 if not Valid:\r
898 EdkLogger.error('build', FORMAT_INVALID, ErrStr, File=self.MetaFile, Line=LineNo,\r
899 ExtraData="%s.%s" % (TokenSpaceGuid, PcdCName))\r
900 if PcdType in (MODEL_PCD_DYNAMIC_DEFAULT, MODEL_PCD_DYNAMIC_EX_DEFAULT):\r
901 if self._DecPcds[PcdCName, TokenSpaceGuid].DatumType.strip() != ValueList[1].strip():\r
902 EdkLogger.error('build', FORMAT_INVALID, "Pcd datumtype used in DSC file is not the same as its declaration in DEC file.", File=self.MetaFile, Line=LineNo,\r
903 ExtraData="%s.%s|%s" % (TokenSpaceGuid, PcdCName, Setting))\r
904 if (TokenSpaceGuid + '.' + PcdCName) in GlobalData.gPlatformPcds:\r
905 if GlobalData.gPlatformPcds[TokenSpaceGuid + '.' + PcdCName] != ValueList[Index]:\r
906 GlobalData.gPlatformPcds[TokenSpaceGuid + '.' + PcdCName] = ValueList[Index]\r
907 return ValueList\r
908\r
909 def _FilterPcdBySkuUsage(self, Pcds):\r
910 available_sku = self.SkuIdMgr.AvailableSkuIdSet\r
911 sku_usage = self.SkuIdMgr.SkuUsageType\r
912 if sku_usage == SkuClass.SINGLE:\r
913 for pcdname in Pcds:\r
914 pcd = Pcds[pcdname]\r
915 Pcds[pcdname].SkuInfoList = {TAB_DEFAULT:pcd.SkuInfoList[skuid] for skuid in pcd.SkuInfoList if skuid in available_sku}\r
916 if isinstance(pcd, StructurePcd) and pcd.SkuOverrideValues:\r
917 Pcds[pcdname].SkuOverrideValues = {TAB_DEFAULT:pcd.SkuOverrideValues[skuid] for skuid in pcd.SkuOverrideValues if skuid in available_sku}\r
918 else:\r
919 for pcdname in Pcds:\r
920 pcd = Pcds[pcdname]\r
921 Pcds[pcdname].SkuInfoList = {skuid:pcd.SkuInfoList[skuid] for skuid in pcd.SkuInfoList if skuid in available_sku}\r
922 if isinstance(pcd, StructurePcd) and pcd.SkuOverrideValues:\r
923 Pcds[pcdname].SkuOverrideValues = {skuid:pcd.SkuOverrideValues[skuid] for skuid in pcd.SkuOverrideValues if skuid in available_sku}\r
924 return Pcds\r
925 def CompleteHiiPcdsDefaultStores(self, Pcds):\r
926 HiiPcd = [Pcds[pcd] for pcd in Pcds if Pcds[pcd].Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]]\r
927 DefaultStoreMgr = DefaultStore(self.DefaultStores)\r
928 for pcd in HiiPcd:\r
929 for skuid in pcd.SkuInfoList:\r
930 skuobj = pcd.SkuInfoList.get(skuid)\r
931 if TAB_DEFAULT_STORES_DEFAULT not in skuobj.DefaultStoreDict:\r
932 PcdDefaultStoreSet = set(defaultstorename for defaultstorename in skuobj.DefaultStoreDict)\r
933 mindefaultstorename = DefaultStoreMgr.GetMin(PcdDefaultStoreSet)\r
934 skuobj.DefaultStoreDict[TAB_DEFAULT_STORES_DEFAULT] = copy.deepcopy(skuobj.DefaultStoreDict[mindefaultstorename])\r
935 return Pcds\r
936\r
937 def RecoverCommandLinePcd(self):\r
938 def UpdateCommandLineValue(pcd):\r
939 if pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD],\r
940 self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:\r
941 pcd.PcdValueFromComm = pcd.DefaultValue\r
942 elif pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
943 pcd.PcdValueFromComm = pcd.SkuInfoList.get(TAB_DEFAULT).HiiDefaultValue\r
944 else:\r
945 pcd.PcdValueFromComm = pcd.SkuInfoList.get(TAB_DEFAULT).DefaultValue\r
946 for pcd in self._Pcds:\r
947 if isinstance(self._Pcds[pcd], StructurePcd) and (self._Pcds[pcd].PcdValueFromComm or self._Pcds[pcd].PcdFieldValueFromComm):\r
948 UpdateCommandLineValue(self._Pcds[pcd])\r
949\r
950 def __ParsePcdFromCommandLine(self):\r
951 if GlobalData.BuildOptionPcd:\r
952 for i, pcd in enumerate(GlobalData.BuildOptionPcd):\r
953 if isinstance(pcd, tuple):\r
954 continue\r
955 (pcdname, pcdvalue) = pcd.split('=')\r
956 if not pcdvalue:\r
957 EdkLogger.error('build', AUTOGEN_ERROR, "No Value specified for the PCD %s." % (pcdname))\r
958 if '.' in pcdname:\r
959 (Name1, Name2) = pcdname.split('.', 1)\r
960 if "." in Name2:\r
961 (Name3, FieldName) = Name2.split(".", 1)\r
962 if ((Name3, Name1)) in self.DecPcds:\r
963 HasTokenSpace = True\r
964 TokenCName = Name3\r
965 TokenSpaceGuidCName = Name1\r
966 else:\r
967 FieldName = Name2\r
968 TokenCName = Name1\r
969 TokenSpaceGuidCName = ''\r
970 HasTokenSpace = False\r
971 else:\r
972 if ((Name2, Name1)) in self.DecPcds:\r
973 HasTokenSpace = True\r
974 TokenCName = Name2\r
975 TokenSpaceGuidCName = Name1\r
976 FieldName =""\r
977 else:\r
978 FieldName = Name2\r
979 TokenCName = Name1\r
980 TokenSpaceGuidCName = ''\r
981 HasTokenSpace = False\r
982 else:\r
983 FieldName = ""\r
984 TokenCName = pcdname\r
985 TokenSpaceGuidCName = ''\r
986 HasTokenSpace = False\r
987 TokenSpaceGuidCNameList = []\r
988 FoundFlag = False\r
989 PcdDatumType = ''\r
990 DisplayName = TokenCName\r
991 if FieldName:\r
992 DisplayName = TokenCName + '.' + FieldName\r
993 if not HasTokenSpace:\r
994 for key in self.DecPcds:\r
995 PcdItem = self.DecPcds[key]\r
996 if TokenCName == PcdItem.TokenCName:\r
997 if not PcdItem.TokenSpaceGuidCName in TokenSpaceGuidCNameList:\r
998 if len (TokenSpaceGuidCNameList) < 1:\r
999 TokenSpaceGuidCNameList.append(PcdItem.TokenSpaceGuidCName)\r
1000 TokenSpaceGuidCName = PcdItem.TokenSpaceGuidCName\r
1001 PcdDatumType = PcdItem.DatumType\r
1002 FoundFlag = True\r
1003 else:\r
1004 EdkLogger.error(\r
1005 'build',\r
1006 AUTOGEN_ERROR,\r
1007 "The Pcd %s is found under multiple different TokenSpaceGuid: %s and %s." % (DisplayName, PcdItem.TokenSpaceGuidCName, TokenSpaceGuidCNameList[0])\r
1008 )\r
1009 else:\r
1010 if (TokenCName, TokenSpaceGuidCName) in self.DecPcds:\r
1011 PcdDatumType = self.DecPcds[(TokenCName, TokenSpaceGuidCName)].DatumType\r
1012 FoundFlag = True\r
1013 if not FoundFlag:\r
1014 if HasTokenSpace:\r
1015 EdkLogger.error('build', AUTOGEN_ERROR, "The Pcd %s.%s is not found in the DEC file." % (TokenSpaceGuidCName, DisplayName))\r
1016 else:\r
1017 EdkLogger.error('build', AUTOGEN_ERROR, "The Pcd %s is not found in the DEC file." % (DisplayName))\r
1018 pcdvalue = pcdvalue.replace("\\\\\\'", '\\\\\\"').replace('\\\'', '\'').replace('\\\\\\"', "\\'")\r
1019 if FieldName:\r
1020 pcdvalue = DscBuildData.HandleFlexiblePcd(TokenSpaceGuidCName, TokenCName, pcdvalue, PcdDatumType, self._GuidDict, FieldName)\r
1021 else:\r
1022 pcdvalue = DscBuildData.HandleFlexiblePcd(TokenSpaceGuidCName, TokenCName, pcdvalue, PcdDatumType, self._GuidDict)\r
1023 IsValid, Cause = CheckPcdDatum(PcdDatumType, pcdvalue)\r
1024 if not IsValid:\r
1025 EdkLogger.error("build", FORMAT_INVALID, Cause, ExtraData="%s.%s" % (TokenSpaceGuidCName, TokenCName))\r
1026 GlobalData.BuildOptionPcd[i] = (TokenSpaceGuidCName, TokenCName, FieldName, pcdvalue, ("build command options", 1))\r
1027\r
1028 for BuildData in self._Bdb._CACHE_.values():\r
1029 if BuildData.MetaFile.Ext == '.dec' or BuildData.MetaFile.Ext == '.dsc':\r
1030 continue\r
1031 for key in BuildData.Pcds:\r
1032 PcdItem = BuildData.Pcds[key]\r
1033 if (TokenSpaceGuidCName, TokenCName) == (PcdItem.TokenSpaceGuidCName, PcdItem.TokenCName) and FieldName =="":\r
1034 PcdItem.DefaultValue = pcdvalue\r
1035\r
1036 @staticmethod\r
1037 def HandleFlexiblePcd(TokenSpaceGuidCName, TokenCName, PcdValue, PcdDatumType, GuidDict, FieldName=''):\r
1038 if FieldName:\r
1039 IsArray = False\r
1040 TokenCName += '.' + FieldName\r
1041 if PcdValue.startswith('H'):\r
1042 if FieldName and IsFieldValueAnArray(PcdValue[1:]):\r
1043 PcdDatumType = TAB_VOID\r
1044 IsArray = True\r
1045 if FieldName and not IsArray:\r
1046 return PcdValue\r
1047 try:\r
1048 PcdValue = ValueExpressionEx(PcdValue[1:], PcdDatumType, GuidDict)(True)\r
1049 except BadExpression as Value:\r
1050 EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s", %s' %\r
1051 (TokenSpaceGuidCName, TokenCName, PcdValue, Value))\r
1052 elif PcdValue.startswith("L'") or PcdValue.startswith("'"):\r
1053 if FieldName and IsFieldValueAnArray(PcdValue):\r
1054 PcdDatumType = TAB_VOID\r
1055 IsArray = True\r
1056 if FieldName and not IsArray:\r
1057 return PcdValue\r
1058 try:\r
1059 PcdValue = ValueExpressionEx(PcdValue, PcdDatumType, GuidDict)(True)\r
1060 except BadExpression as Value:\r
1061 EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s", %s' %\r
1062 (TokenSpaceGuidCName, TokenCName, PcdValue, Value))\r
1063 elif PcdValue.startswith('L'):\r
1064 PcdValue = 'L"' + PcdValue[1:] + '"'\r
1065 if FieldName and IsFieldValueAnArray(PcdValue):\r
1066 PcdDatumType = TAB_VOID\r
1067 IsArray = True\r
1068 if FieldName and not IsArray:\r
1069 return PcdValue\r
1070 try:\r
1071 PcdValue = ValueExpressionEx(PcdValue, PcdDatumType, GuidDict)(True)\r
1072 except BadExpression as Value:\r
1073 EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s", %s' %\r
1074 (TokenSpaceGuidCName, TokenCName, PcdValue, Value))\r
1075 else:\r
1076 if PcdValue.upper() == 'FALSE':\r
1077 PcdValue = str(0)\r
1078 if PcdValue.upper() == 'TRUE':\r
1079 PcdValue = str(1)\r
1080 if not FieldName:\r
1081 if PcdDatumType not in TAB_PCD_NUMERIC_TYPES:\r
1082 PcdValue = '"' + PcdValue + '"'\r
1083 else:\r
1084 IsArray = False\r
1085 Base = 10\r
1086 if PcdValue.upper().startswith('0X'):\r
1087 Base = 16\r
1088 try:\r
1089 Num = int(PcdValue, Base)\r
1090 except:\r
1091 PcdValue = '"' + PcdValue + '"'\r
1092 if IsFieldValueAnArray(PcdValue):\r
1093 PcdDatumType = TAB_VOID\r
1094 IsArray = True\r
1095 if not IsArray:\r
1096 return PcdValue\r
1097 try:\r
1098 PcdValue = ValueExpressionEx(PcdValue, PcdDatumType, GuidDict)(True)\r
1099 except BadExpression as Value:\r
1100 EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s", %s' %\r
1101 (TokenSpaceGuidCName, TokenCName, PcdValue, Value))\r
1102 return PcdValue\r
1103\r
1104 ## Retrieve all PCD settings in platform\r
1105 def _GetPcds(self):\r
1106 if self._Pcds is None:\r
1107 self._Pcds = OrderedDict()\r
1108 self.__ParsePcdFromCommandLine()\r
1109 self._Pcds.update(self._GetPcd(MODEL_PCD_FIXED_AT_BUILD))\r
1110 self._Pcds.update(self._GetPcd(MODEL_PCD_PATCHABLE_IN_MODULE))\r
1111 self._Pcds.update(self._GetPcd(MODEL_PCD_FEATURE_FLAG))\r
1112 self._Pcds.update(self._GetDynamicPcd(MODEL_PCD_DYNAMIC_DEFAULT))\r
1113 self._Pcds.update(self._GetDynamicHiiPcd(MODEL_PCD_DYNAMIC_HII))\r
1114 self._Pcds.update(self._GetDynamicVpdPcd(MODEL_PCD_DYNAMIC_VPD))\r
1115 self._Pcds.update(self._GetDynamicPcd(MODEL_PCD_DYNAMIC_EX_DEFAULT))\r
1116 self._Pcds.update(self._GetDynamicHiiPcd(MODEL_PCD_DYNAMIC_EX_HII))\r
1117 self._Pcds.update(self._GetDynamicVpdPcd(MODEL_PCD_DYNAMIC_EX_VPD))\r
1118\r
1119 self._Pcds = self.CompletePcdValues(self._Pcds)\r
1120 self._Pcds = self.OverrideByFdfOverAll(self._Pcds)\r
1121 self._Pcds = self.OverrideByCommOverAll(self._Pcds)\r
1122 self._Pcds = self.UpdateStructuredPcds(MODEL_PCD_TYPE_LIST, self._Pcds)\r
1123 self._Pcds = self.CompleteHiiPcdsDefaultStores(self._Pcds)\r
1124 self._Pcds = self._FilterPcdBySkuUsage(self._Pcds)\r
1125\r
1126 self.RecoverCommandLinePcd()\r
1127 return self._Pcds\r
1128\r
1129 ## Retrieve [BuildOptions]\r
1130 def _GetBuildOptions(self):\r
1131 if self._BuildOptions is None:\r
1132 self._BuildOptions = OrderedDict()\r
1133 #\r
1134 # Retrieve build option for EDKII and EDK style module\r
1135 #\r
1136 for CodeBase in (EDKII_NAME, EDK_NAME):\r
1137 RecordList = self._RawData[MODEL_META_DATA_BUILD_OPTION, self._Arch, CodeBase]\r
1138 for ToolChainFamily, ToolChain, Option, Dummy1, Dummy2, Dummy3, Dummy4, Dummy5 in RecordList:\r
1139 if Dummy3.upper() != TAB_COMMON:\r
1140 continue\r
1141 CurKey = (ToolChainFamily, ToolChain, CodeBase)\r
1142 #\r
1143 # Only flags can be appended\r
1144 #\r
1145 if CurKey not in self._BuildOptions or not ToolChain.endswith('_FLAGS') or Option.startswith('='):\r
1146 self._BuildOptions[CurKey] = Option\r
1147 else:\r
1148 if ' ' + Option not in self._BuildOptions[CurKey]:\r
1149 self._BuildOptions[CurKey] += ' ' + Option\r
1150 return self._BuildOptions\r
1151\r
1152 def GetBuildOptionsByModuleType(self, Edk, ModuleType):\r
1153 if self._ModuleTypeOptions is None:\r
1154 self._ModuleTypeOptions = OrderedDict()\r
1155 if (Edk, ModuleType) not in self._ModuleTypeOptions:\r
1156 options = OrderedDict()\r
1157 self._ModuleTypeOptions[Edk, ModuleType] = options\r
1158 DriverType = '%s.%s' % (Edk, ModuleType)\r
1159 CommonDriverType = '%s.%s' % (TAB_COMMON, ModuleType)\r
1160 RecordList = self._RawData[MODEL_META_DATA_BUILD_OPTION, self._Arch]\r
1161 for ToolChainFamily, ToolChain, Option, Dummy1, Dummy2, Dummy3, Dummy4, Dummy5 in RecordList:\r
1162 Type = Dummy2 + '.' + Dummy3\r
1163 if Type.upper() == DriverType.upper() or Type.upper() == CommonDriverType.upper():\r
1164 Key = (ToolChainFamily, ToolChain, Edk)\r
1165 if Key not in options or not ToolChain.endswith('_FLAGS') or Option.startswith('='):\r
1166 options[Key] = Option\r
1167 else:\r
1168 if ' ' + Option not in options[Key]:\r
1169 options[Key] += ' ' + Option\r
1170 return self._ModuleTypeOptions[Edk, ModuleType]\r
1171\r
1172 @staticmethod\r
1173 def GetStructurePcdInfo(PcdSet):\r
1174 structure_pcd_data = defaultdict(list)\r
1175 for item in PcdSet:\r
1176 structure_pcd_data[(item[0], item[1])].append(item)\r
1177\r
1178 return structure_pcd_data\r
1179\r
1180 @staticmethod\r
1181 def OverrideByFdf(StruPcds,workspace):\r
1182 if GlobalData.gFdfParser is None:\r
1183 return StruPcds\r
1184 StructurePcdInFdf = OrderedDict()\r
1185 fdfpcd = GlobalData.gFdfParser.Profile.PcdDict\r
1186 fdfpcdlocation = GlobalData.gFdfParser.Profile.PcdLocalDict\r
1187 for item in fdfpcd :\r
1188 if len(item[2]) and (item[0],item[1]) in StruPcds:\r
1189 StructurePcdInFdf[(item[1],item[0],item[2] )] = fdfpcd[item]\r
1190 GlobalPcds = {(item[0],item[1]) for item in StructurePcdInFdf}\r
1191 for Pcd in StruPcds.values():\r
1192 if (Pcd.TokenSpaceGuidCName,Pcd.TokenCName) not in GlobalPcds:\r
1193 continue\r
1194 FieldValues = OrderedDict()\r
1195 for item in StructurePcdInFdf:\r
1196 if (Pcd.TokenSpaceGuidCName,Pcd.TokenCName) == (item[0],item[1]) and item[2]:\r
1197 FieldValues[item[2]] = StructurePcdInFdf[item]\r
1198 for field in FieldValues:\r
1199 if field not in Pcd.PcdFieldValueFromFdf:\r
1200 Pcd.PcdFieldValueFromFdf[field] = ["","",""]\r
1201 Pcd.PcdFieldValueFromFdf[field][0] = FieldValues[field]\r
1202 Pcd.PcdFieldValueFromFdf[field][1] = os.path.relpath(fdfpcdlocation[(Pcd.TokenCName,Pcd.TokenSpaceGuidCName,field)][0],workspace)\r
1203 Pcd.PcdFieldValueFromFdf[field][2] = fdfpcdlocation[(Pcd.TokenCName,Pcd.TokenSpaceGuidCName,field)][1]\r
1204\r
1205 return StruPcds\r
1206\r
1207 @staticmethod\r
1208 def OverrideByComm(StruPcds):\r
1209 StructurePcdInCom = OrderedDict()\r
1210 for item in GlobalData.BuildOptionPcd:\r
1211 if len(item) == 5 and (item[1], item[0]) in StruPcds:\r
1212 StructurePcdInCom[(item[0], item[1], item[2] )] = (item[3], item[4])\r
1213 GlobalPcds = {(item[0], item[1]) for item in StructurePcdInCom}\r
1214 for Pcd in StruPcds.values():\r
1215 if (Pcd.TokenSpaceGuidCName, Pcd.TokenCName) not in GlobalPcds:\r
1216 continue\r
1217 FieldValues = OrderedDict()\r
1218 for item in StructurePcdInCom:\r
1219 if (Pcd.TokenSpaceGuidCName, Pcd.TokenCName) == (item[0], item[1]) and item[2]:\r
1220 FieldValues[item[2]] = StructurePcdInCom[item]\r
1221 for field in FieldValues:\r
1222 if field not in Pcd.PcdFieldValueFromComm:\r
1223 Pcd.PcdFieldValueFromComm[field] = ["", "", ""]\r
1224 Pcd.PcdFieldValueFromComm[field][0] = FieldValues[field][0]\r
1225 Pcd.PcdFieldValueFromComm[field][1] = FieldValues[field][1][0]\r
1226 Pcd.PcdFieldValueFromComm[field][2] = FieldValues[field][1][1]\r
1227 return StruPcds\r
1228\r
1229\r
1230 def OverrideByCommOverAll(self,AllPcds):\r
1231 def CheckStructureInComm(commpcds):\r
1232 if not commpcds:\r
1233 return False\r
1234 if len(commpcds[0]) == 5:\r
1235 return True\r
1236 return False\r
1237\r
1238 if CheckStructureInComm(GlobalData.BuildOptionPcd):\r
1239 StructurePcdInCom = {(item[0], item[1], item[2] ):(item[3], item[4]) for item in GlobalData.BuildOptionPcd } if GlobalData.BuildOptionPcd else {}\r
1240 NoFiledValues = {(item[0], item[1]):StructurePcdInCom[item] for item in StructurePcdInCom if not item[2]}\r
1241 else:\r
1242 NoFiledValues = {(item[0], item[1]):[item[2]] for item in GlobalData.BuildOptionPcd}\r
1243 for Guid, Name in NoFiledValues:\r
1244 if (Name, Guid) in AllPcds:\r
1245 Pcd = AllPcds.get((Name, Guid))\r
1246 if isinstance(self._DecPcds.get((Pcd.TokenCName, Pcd.TokenSpaceGuidCName), None), StructurePcd):\r
1247 self._DecPcds.get((Pcd.TokenCName, Pcd.TokenSpaceGuidCName)).PcdValueFromComm = NoFiledValues[(Pcd.TokenSpaceGuidCName, Pcd.TokenCName)][0]\r
1248 else:\r
1249 Pcd.PcdValueFromComm = NoFiledValues[(Pcd.TokenSpaceGuidCName, Pcd.TokenCName)][0]\r
1250 Pcd.DefaultValue = NoFiledValues[(Pcd.TokenSpaceGuidCName, Pcd.TokenCName)][0]\r
1251 for sku in Pcd.SkuInfoList:\r
1252 SkuInfo = Pcd.SkuInfoList[sku]\r
1253 if SkuInfo.DefaultValue:\r
1254 SkuInfo.DefaultValue = NoFiledValues[(Pcd.TokenSpaceGuidCName, Pcd.TokenCName)][0]\r
1255 else:\r
1256 SkuInfo.HiiDefaultValue = NoFiledValues[(Pcd.TokenSpaceGuidCName, Pcd.TokenCName)][0]\r
1257 for defaultstore in SkuInfo.DefaultStoreDict:\r
1258 SkuInfo.DefaultStoreDict[defaultstore] = NoFiledValues[(Pcd.TokenSpaceGuidCName, Pcd.TokenCName)][0]\r
1259 if Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII]]:\r
1260 if Pcd.DatumType == TAB_VOID:\r
1261 if not Pcd.MaxDatumSize:\r
1262 Pcd.MaxDatumSize = '0'\r
1263 CurrentSize = int(Pcd.MaxDatumSize, 16) if Pcd.MaxDatumSize.upper().startswith("0X") else int(Pcd.MaxDatumSize)\r
1264 OptionSize = len((StringToArray(Pcd.PcdValueFromComm)).split(","))\r
1265 MaxSize = max(CurrentSize, OptionSize)\r
1266 Pcd.MaxDatumSize = str(MaxSize)\r
1267 else:\r
1268 PcdInDec = self.DecPcds.get((Name, Guid))\r
1269 if PcdInDec:\r
1270 PcdInDec.PcdValueFromComm = NoFiledValues[(Guid, Name)][0]\r
1271 if PcdInDec.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD],\r
1272 self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE],\r
1273 self._PCD_TYPE_STRING_[MODEL_PCD_FEATURE_FLAG]]:\r
1274 self.Pcds[Name, Guid] = copy.deepcopy(PcdInDec)\r
1275 self.Pcds[Name, Guid].DefaultValue = NoFiledValues[( Guid, Name)][0]\r
1276 return AllPcds\r
1277\r
1278 def OverrideByFdfOverAll(self,AllPcds):\r
1279\r
1280 if GlobalData.gFdfParser is None:\r
1281 return AllPcds\r
1282 NoFiledValues = GlobalData.gFdfParser.Profile.PcdDict\r
1283 for Name,Guid,Field in NoFiledValues:\r
1284 if len(Field):\r
1285 continue\r
1286 Value = NoFiledValues[(Name,Guid,Field)]\r
1287 if (Name,Guid) in AllPcds:\r
1288 Pcd = AllPcds.get((Name,Guid))\r
1289 if isinstance(self._DecPcds.get((Pcd.TokenCName,Pcd.TokenSpaceGuidCName), None),StructurePcd):\r
1290 self._DecPcds.get((Pcd.TokenCName,Pcd.TokenSpaceGuidCName)).PcdValueFromComm = Value\r
1291 else:\r
1292 Pcd.PcdValueFromComm = Value\r
1293 Pcd.DefaultValue = Value\r
1294 for sku in Pcd.SkuInfoList:\r
1295 SkuInfo = Pcd.SkuInfoList[sku]\r
1296 if SkuInfo.DefaultValue:\r
1297 SkuInfo.DefaultValue = Value\r
1298 else:\r
1299 SkuInfo.HiiDefaultValue = Value\r
1300 for defaultstore in SkuInfo.DefaultStoreDict:\r
1301 SkuInfo.DefaultStoreDict[defaultstore] = Value\r
1302 if Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII]]:\r
1303 if Pcd.DatumType == TAB_VOID:\r
1304 if not Pcd.MaxDatumSize:\r
1305 Pcd.MaxDatumSize = '0'\r
1306 CurrentSize = int(Pcd.MaxDatumSize,16) if Pcd.MaxDatumSize.upper().startswith("0X") else int(Pcd.MaxDatumSize)\r
1307 OptionSize = len((StringToArray(Pcd.PcdValueFromComm)).split(","))\r
1308 MaxSize = max(CurrentSize, OptionSize)\r
1309 Pcd.MaxDatumSize = str(MaxSize)\r
1310 else:\r
1311 PcdInDec = self.DecPcds.get((Name,Guid))\r
1312 if PcdInDec:\r
1313 PcdInDec.PcdValueFromFdf = Value\r
1314 if PcdInDec.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD],\r
1315 self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE],\r
1316 self._PCD_TYPE_STRING_[MODEL_PCD_FEATURE_FLAG]]:\r
1317 self.Pcds[Name, Guid] = copy.deepcopy(PcdInDec)\r
1318 self.Pcds[Name, Guid].DefaultValue = Value\r
1319 return AllPcds\r
1320\r
1321 def UpdateStructuredPcds(self, TypeList, AllPcds):\r
1322\r
1323 DynamicPcdType = [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_DEFAULT],\r
1324 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII],\r
1325 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_VPD],\r
1326 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_DEFAULT],\r
1327 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII],\r
1328 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_VPD]]\r
1329\r
1330 Pcds = AllPcds\r
1331 DefaultStoreMgr = DefaultStore(self.DefaultStores)\r
1332 SkuIds = self.SkuIdMgr.AvailableSkuIdSet\r
1333 SkuIds.update({TAB_DEFAULT:0})\r
1334 DefaultStores = {storename for pcdobj in AllPcds.values() for skuobj in pcdobj.SkuInfoList.values() for storename in skuobj.DefaultStoreDict}\r
1335\r
1336 S_PcdSet = []\r
1337 # Find out all possible PCD candidates for self._Arch\r
1338 RecordList = []\r
1339\r
1340 for Type in TypeList:\r
1341 RecordList.extend(self._RawData[Type, self._Arch])\r
1342\r
1343 for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, default_store, Dummy4, Dummy5 in RecordList:\r
1344 SkuName = SkuName.upper()\r
1345 default_store = default_store.upper()\r
1346 SkuName = TAB_DEFAULT if SkuName == TAB_COMMON else SkuName\r
1347 if SkuName not in SkuIds:\r
1348 continue\r
1349\r
1350 if SkuName in SkuIds and "." in TokenSpaceGuid:\r
1351 S_PcdSet.append([ TokenSpaceGuid.split(".")[0], TokenSpaceGuid.split(".")[1], PcdCName, SkuName, default_store, Dummy5, AnalyzePcdExpression(Setting)[0]])\r
1352\r
1353 # handle pcd value override\r
1354 StrPcdSet = DscBuildData.GetStructurePcdInfo(S_PcdSet)\r
1355 S_pcd_set = OrderedDict()\r
1356 for str_pcd in StrPcdSet:\r
1357 str_pcd_obj = Pcds.get((str_pcd[1], str_pcd[0]), None)\r
1358 str_pcd_dec = self._DecPcds.get((str_pcd[1], str_pcd[0]), None)\r
1359 if not isinstance (str_pcd_dec, StructurePcd):\r
1360 EdkLogger.error('build', PARSER_ERROR,\r
1361 "Pcd (%s.%s) is not declared as Structure PCD in DEC files. Arch: ['%s']" % (str_pcd[0], str_pcd[1], self._Arch),\r
1362 File=self.MetaFile, Line = StrPcdSet[str_pcd][0][5])\r
1363 if str_pcd_dec:\r
1364 str_pcd_obj_str = StructurePcd()\r
1365 str_pcd_obj_str.copy(str_pcd_dec)\r
1366 if str_pcd_obj:\r
1367 str_pcd_obj_str.copy(str_pcd_obj)\r
1368 if str_pcd_obj.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
1369 str_pcd_obj_str.DefaultFromDSC = {skuname:{defaultstore: str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.get(defaultstore, str_pcd_obj.SkuInfoList[skuname].HiiDefaultValue) for defaultstore in DefaultStores} for skuname in str_pcd_obj.SkuInfoList}\r
1370 else:\r
1371 str_pcd_obj_str.DefaultFromDSC = {skuname:{defaultstore: str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.get(defaultstore, str_pcd_obj.SkuInfoList[skuname].DefaultValue) for defaultstore in DefaultStores} for skuname in str_pcd_obj.SkuInfoList}\r
1372 for str_pcd_data in StrPcdSet[str_pcd]:\r
1373 if str_pcd_data[3] in SkuIds:\r
1374 str_pcd_obj_str.AddOverrideValue(str_pcd_data[2], str(str_pcd_data[6]), TAB_DEFAULT if str_pcd_data[3] == TAB_COMMON else str_pcd_data[3], TAB_DEFAULT_STORES_DEFAULT if str_pcd_data[4] == TAB_COMMON else str_pcd_data[4], self.MetaFile.File if self.WorkspaceDir not in self.MetaFile.File else self.MetaFile.File[len(self.WorkspaceDir) if self.WorkspaceDir.endswith(os.path.sep) else len(self.WorkspaceDir)+1:], LineNo=str_pcd_data[5])\r
1375 S_pcd_set[str_pcd[1], str_pcd[0]] = str_pcd_obj_str\r
1376 else:\r
1377 EdkLogger.error('build', PARSER_ERROR,\r
1378 "Pcd (%s.%s) defined in DSC is not declared in DEC files. Arch: ['%s']" % (str_pcd[0], str_pcd[1], self._Arch),\r
1379 File=self.MetaFile, Line = StrPcdSet[str_pcd][0][5])\r
1380 # Add the Structure PCD that only defined in DEC, don't have override in DSC file\r
1381 for Pcd in self.DecPcds:\r
1382 if isinstance(self._DecPcds[Pcd], StructurePcd):\r
1383 if Pcd not in S_pcd_set:\r
1384 str_pcd_obj_str = StructurePcd()\r
1385 str_pcd_obj_str.copy(self._DecPcds[Pcd])\r
1386 str_pcd_obj = Pcds.get(Pcd, None)\r
1387 if str_pcd_obj:\r
1388 str_pcd_obj_str.copy(str_pcd_obj)\r
1389 if str_pcd_obj.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
1390 str_pcd_obj_str.DefaultFromDSC = {skuname:{defaultstore: str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.get(defaultstore, str_pcd_obj.SkuInfoList[skuname].HiiDefaultValue) for defaultstore in DefaultStores} for skuname in str_pcd_obj.SkuInfoList}\r
1391 else:\r
1392 str_pcd_obj_str.DefaultFromDSC = {skuname:{defaultstore: str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.get(defaultstore, str_pcd_obj.SkuInfoList[skuname].DefaultValue) for defaultstore in DefaultStores} for skuname in str_pcd_obj.SkuInfoList}\r
1393 S_pcd_set[Pcd] = str_pcd_obj_str\r
1394 if S_pcd_set:\r
1395 GlobalData.gStructurePcd[self.Arch] = S_pcd_set\r
1396 for stru_pcd in S_pcd_set.values():\r
1397 for skuid in SkuIds:\r
1398 if skuid in stru_pcd.SkuOverrideValues:\r
1399 continue\r
1400 nextskuid = self.SkuIdMgr.GetNextSkuId(skuid)\r
1401 NoDefault = False\r
1402 if skuid not in stru_pcd.SkuOverrideValues:\r
1403 while nextskuid not in stru_pcd.SkuOverrideValues:\r
1404 if nextskuid == TAB_DEFAULT:\r
1405 NoDefault = True\r
1406 break\r
1407 nextskuid = self.SkuIdMgr.GetNextSkuId(nextskuid)\r
1408 stru_pcd.SkuOverrideValues[skuid] = copy.deepcopy(stru_pcd.SkuOverrideValues[nextskuid]) if not NoDefault else copy.deepcopy({defaultstorename: stru_pcd.DefaultValues for defaultstorename in DefaultStores} if DefaultStores else {TAB_DEFAULT_STORES_DEFAULT:stru_pcd.DefaultValues})\r
1409 if not NoDefault:\r
1410 stru_pcd.ValueChain.add((skuid, ''))\r
1411 if stru_pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
1412 for skuid in SkuIds:\r
1413 nextskuid = skuid\r
1414 NoDefault = False\r
1415 if skuid not in stru_pcd.SkuOverrideValues:\r
1416 while nextskuid not in stru_pcd.SkuOverrideValues:\r
1417 if nextskuid == TAB_DEFAULT:\r
1418 NoDefault = True\r
1419 break\r
1420 nextskuid = self.SkuIdMgr.GetNextSkuId(nextskuid)\r
1421 if NoDefault:\r
1422 continue\r
1423 PcdDefaultStoreSet = set(defaultstorename for defaultstorename in stru_pcd.SkuOverrideValues[nextskuid])\r
1424 mindefaultstorename = DefaultStoreMgr.GetMin(PcdDefaultStoreSet)\r
1425\r
1426 for defaultstoreid in DefaultStores:\r
1427 if defaultstoreid not in stru_pcd.SkuOverrideValues[skuid]:\r
1428 stru_pcd.SkuOverrideValues[skuid][defaultstoreid] = copy.deepcopy(stru_pcd.SkuOverrideValues[nextskuid][mindefaultstorename])\r
1429 stru_pcd.ValueChain.add((skuid, defaultstoreid))\r
1430 S_pcd_set = DscBuildData.OverrideByFdf(S_pcd_set,self.WorkspaceDir)\r
1431 S_pcd_set = DscBuildData.OverrideByComm(S_pcd_set)\r
1432 Str_Pcd_Values = self.GenerateByteArrayValue(S_pcd_set)\r
1433 if Str_Pcd_Values:\r
1434 for (skuname, StoreName, PcdGuid, PcdName, PcdValue) in Str_Pcd_Values:\r
1435 str_pcd_obj = S_pcd_set.get((PcdName, PcdGuid))\r
1436 if str_pcd_obj is None:\r
1437 print(PcdName, PcdGuid)\r
1438 raise\r
1439 if str_pcd_obj.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII],\r
1440 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
1441 if skuname not in str_pcd_obj.SkuInfoList:\r
1442 str_pcd_obj.SkuInfoList[skuname] = SkuInfoClass(SkuIdName=skuname, SkuId=self.SkuIds[skuname][0], HiiDefaultValue=PcdValue, DefaultStore = {StoreName:PcdValue})\r
1443 else:\r
1444 str_pcd_obj.SkuInfoList[skuname].HiiDefaultValue = PcdValue\r
1445 str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.update({StoreName:PcdValue})\r
1446 elif str_pcd_obj.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD],\r
1447 self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:\r
1448 if skuname in (self.SkuIdMgr.SystemSkuId, TAB_DEFAULT, TAB_COMMON):\r
1449 str_pcd_obj.DefaultValue = PcdValue\r
1450 else:\r
1451 if skuname not in str_pcd_obj.SkuInfoList:\r
1452 nextskuid = self.SkuIdMgr.GetNextSkuId(skuname)\r
1453 NoDefault = False\r
1454 while nextskuid not in str_pcd_obj.SkuInfoList:\r
1455 if nextskuid == TAB_DEFAULT:\r
1456 NoDefault = True\r
1457 break\r
1458 nextskuid = self.SkuIdMgr.GetNextSkuId(nextskuid)\r
1459 str_pcd_obj.SkuInfoList[skuname] = copy.deepcopy(str_pcd_obj.SkuInfoList[nextskuid]) if not NoDefault else SkuInfoClass(SkuIdName=skuname, SkuId=self.SkuIds[skuname][0], DefaultValue=PcdValue)\r
1460 str_pcd_obj.SkuInfoList[skuname].SkuId = self.SkuIds[skuname][0]\r
1461 str_pcd_obj.SkuInfoList[skuname].SkuIdName = skuname\r
1462 else:\r
1463 str_pcd_obj.SkuInfoList[skuname].DefaultValue = PcdValue\r
1464 for str_pcd_obj in S_pcd_set.values():\r
1465 if str_pcd_obj.Type not in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII],\r
1466 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
1467 continue\r
1468 PcdDefaultStoreSet = set(defaultstorename for skuobj in str_pcd_obj.SkuInfoList.values() for defaultstorename in skuobj.DefaultStoreDict)\r
1469 DefaultStoreObj = DefaultStore(self._GetDefaultStores())\r
1470 mindefaultstorename = DefaultStoreObj.GetMin(PcdDefaultStoreSet)\r
1471 str_pcd_obj.SkuInfoList[self.SkuIdMgr.SystemSkuId].HiiDefaultValue = str_pcd_obj.SkuInfoList[self.SkuIdMgr.SystemSkuId].DefaultStoreDict[mindefaultstorename]\r
1472\r
1473 for str_pcd_obj in S_pcd_set.values():\r
1474\r
1475 str_pcd_obj.MaxDatumSize = self.GetStructurePcdMaxSize(str_pcd_obj)\r
1476 Pcds[str_pcd_obj.TokenCName, str_pcd_obj.TokenSpaceGuidCName] = str_pcd_obj\r
1477\r
1478 for pcdkey in Pcds:\r
1479 pcd = Pcds[pcdkey]\r
1480 if TAB_DEFAULT not in pcd.SkuInfoList and TAB_COMMON in pcd.SkuInfoList:\r
1481 pcd.SkuInfoList[TAB_DEFAULT] = pcd.SkuInfoList[TAB_COMMON]\r
1482 del pcd.SkuInfoList[TAB_COMMON]\r
1483 elif TAB_DEFAULT in pcd.SkuInfoList and TAB_COMMON in pcd.SkuInfoList:\r
1484 del pcd.SkuInfoList[TAB_COMMON]\r
1485\r
1486 map(self.FilterSkuSettings, [Pcds[pcdkey] for pcdkey in Pcds if Pcds[pcdkey].Type in DynamicPcdType])\r
1487 return Pcds\r
1488\r
1489 ## Retrieve non-dynamic PCD settings\r
1490 #\r
1491 # @param Type PCD type\r
1492 #\r
1493 # @retval a dict object contains settings of given PCD type\r
1494 #\r
1495 def _GetPcd(self, Type):\r
1496 Pcds = OrderedDict()\r
1497 #\r
1498 # tdict is a special dict kind of type, used for selecting correct\r
1499 # PCD settings for certain ARCH\r
1500 #\r
1501 AvailableSkuIdSet = copy.copy(self.SkuIds)\r
1502\r
1503 PcdDict = tdict(True, 3)\r
1504 PcdSet = set()\r
1505 # Find out all possible PCD candidates for self._Arch\r
1506 RecordList = self._RawData[Type, self._Arch]\r
1507 PcdValueDict = OrderedDict()\r
1508 for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, Dummy3, Dummy4, Dummy5 in RecordList:\r
1509 SkuName = SkuName.upper()\r
1510 SkuName = TAB_DEFAULT if SkuName == TAB_COMMON else SkuName\r
1511 if SkuName not in AvailableSkuIdSet:\r
1512 EdkLogger.error('build ', PARAMETER_INVALID, 'Sku %s is not defined in [SkuIds] section' % SkuName,\r
1513 File=self.MetaFile, Line=Dummy5)\r
1514 if SkuName in (self.SkuIdMgr.SystemSkuId, TAB_DEFAULT, TAB_COMMON):\r
1515 if "." not in TokenSpaceGuid:\r
1516 PcdSet.add((PcdCName, TokenSpaceGuid, SkuName, Dummy5))\r
1517 PcdDict[Arch, PcdCName, TokenSpaceGuid, SkuName] = Setting\r
1518\r
1519 for PcdCName, TokenSpaceGuid, SkuName, Dummy4 in PcdSet:\r
1520 Setting = PcdDict[self._Arch, PcdCName, TokenSpaceGuid, SkuName]\r
1521 if Setting is None:\r
1522 continue\r
1523 PcdValue, DatumType, MaxDatumSize = self._ValidatePcd(PcdCName, TokenSpaceGuid, Setting, Type, Dummy4)\r
1524 if MaxDatumSize:\r
1525 if int(MaxDatumSize, 0) > 0xFFFF:\r
1526 EdkLogger.error('build', FORMAT_INVALID, "The size value must not exceed the maximum value of 0xFFFF (UINT16) for %s." % ".".join((TokenSpaceGuid, PcdCName)),\r
1527 File=self.MetaFile, Line=Dummy4)\r
1528 if int(MaxDatumSize, 0) < 0:\r
1529 EdkLogger.error('build', FORMAT_INVALID, "The size value can't be set to negative value for %s." % ".".join((TokenSpaceGuid, PcdCName)),\r
1530 File=self.MetaFile, Line=Dummy4)\r
1531 if (PcdCName, TokenSpaceGuid) in PcdValueDict:\r
1532 PcdValueDict[PcdCName, TokenSpaceGuid][SkuName] = (PcdValue, DatumType, MaxDatumSize)\r
1533 else:\r
1534 PcdValueDict[PcdCName, TokenSpaceGuid] = {SkuName:(PcdValue, DatumType, MaxDatumSize)}\r
1535\r
1536 for ((PcdCName, TokenSpaceGuid), PcdSetting) in PcdValueDict.iteritems():\r
1537 PcdValue = None\r
1538 DatumType = None\r
1539 MaxDatumSize = None\r
1540 if TAB_COMMON in PcdSetting:\r
1541 PcdValue, DatumType, MaxDatumSize = PcdSetting[TAB_COMMON]\r
1542 if TAB_DEFAULT in PcdSetting:\r
1543 PcdValue, DatumType, MaxDatumSize = PcdSetting[TAB_DEFAULT]\r
1544 if self.SkuIdMgr.SystemSkuId in PcdSetting:\r
1545 PcdValue, DatumType, MaxDatumSize = PcdSetting[self.SkuIdMgr.SystemSkuId]\r
1546\r
1547 Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject(\r
1548 PcdCName,\r
1549 TokenSpaceGuid,\r
1550 self._PCD_TYPE_STRING_[Type],\r
1551 DatumType,\r
1552 PcdValue,\r
1553 '',\r
1554 MaxDatumSize,\r
1555 {},\r
1556 False,\r
1557 None,\r
1558 IsDsc=True)\r
1559\r
1560\r
1561 return Pcds\r
1562\r
1563 def GetStructurePcdMaxSize(self, str_pcd):\r
1564 pcd_default_value = str_pcd.DefaultValue\r
1565 sku_values = [skuobj.HiiDefaultValue if str_pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]] else skuobj.DefaultValue for skuobj in str_pcd.SkuInfoList.values()]\r
1566 sku_values.append(pcd_default_value)\r
1567\r
1568 def get_length(value):\r
1569 Value = value.strip()\r
1570 if len(value) > 1:\r
1571 if Value.startswith(TAB_GUID) and Value.endswith(')'):\r
1572 return 16\r
1573 if Value.startswith('L"') and Value.endswith('"'):\r
1574 return len(Value[2:-1])\r
1575 if Value[0] == '"' and Value[-1] == '"':\r
1576 return len(Value) - 2\r
1577 if Value[0] == '{' and Value[-1] == '}':\r
1578 return len(Value.split(","))\r
1579 if Value.startswith("L'") and Value.endswith("'") and len(list(Value[2:-1])) > 1:\r
1580 return len(list(Value[2:-1]))\r
1581 if Value[0] == "'" and Value[-1] == "'" and len(list(Value[1:-1])) > 1:\r
1582 return len(Value) - 2\r
1583 return len(Value)\r
1584\r
1585 return str(max(get_length(item) for item in sku_values))\r
1586\r
1587 @staticmethod\r
1588 def ExecuteCommand (Command):\r
1589 try:\r
1590 Process = subprocess.Popen(Command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)\r
1591 except:\r
1592 EdkLogger.error('Build', COMMAND_FAILURE, 'Can not execute command: %s' % Command)\r
1593 Result = Process.communicate()\r
1594 return Process.returncode, Result[0], Result[1]\r
1595\r
1596 @staticmethod\r
1597 def IntToCString(Value, ValueSize):\r
1598 Result = '"'\r
1599 if not isinstance (Value, str):\r
1600 for Index in range(0, ValueSize):\r
1601 Result = Result + '\\x%02x' % (Value & 0xff)\r
1602 Value = Value >> 8\r
1603 Result = Result + '"'\r
1604 return Result\r
1605\r
1606 def GenerateSizeFunction(self, Pcd):\r
1607 CApp = "// Default Value in Dec \n"\r
1608 CApp = CApp + "void Cal_%s_%s_Size(UINT32 *Size){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
1609 for FieldList in [Pcd.DefaultValues]:\r
1610 if not FieldList:\r
1611 continue\r
1612 for FieldName in FieldList:\r
1613 FieldName = "." + FieldName\r
1614 IsArray = IsFieldValueAnArray(FieldList[FieldName.strip(".")][0])\r
1615 if IsArray and not (FieldList[FieldName.strip(".")][0].startswith('{GUID') and FieldList[FieldName.strip(".")][0].endswith('}')):\r
1616 try:\r
1617 Value = ValueExpressionEx(FieldList[FieldName.strip(".")][0], TAB_VOID, self._GuidDict)(True)\r
1618 except BadExpression:\r
1619 EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
1620 (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName.strip('.'))), FieldList[FieldName.strip(".")][1], FieldList[FieldName.strip(".")][2]))\r
1621 Value, ValueSize = ParseFieldValue(Value)\r
1622 CApp = CApp + ' __FLEXIBLE_SIZE(*Size, %s, %s, %d / __ARRAY_ELEMENT_SIZE(%s, %s) + ((%d %% __ARRAY_ELEMENT_SIZE(%s, %s)) ? 1 : 0)); // From %s Line %d Value %s \n' % (Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), FieldList[FieldName.strip(".")][1], FieldList[FieldName.strip(".")][2], FieldList[FieldName.strip(".")][0]);\r
1623 else:\r
1624 NewFieldName = ''\r
1625 FieldName_ori = FieldName.strip('.')\r
1626 while '[' in FieldName:\r
1627 NewFieldName = NewFieldName + FieldName.split('[', 1)[0] + '[0]'\r
1628 ArrayIndex = int(FieldName.split('[', 1)[1].split(']', 1)[0])\r
1629 FieldName = FieldName.split(']', 1)[1]\r
1630 FieldName = NewFieldName + FieldName\r
1631 while '[' in FieldName:\r
1632 FieldName = FieldName.rsplit('[', 1)[0]\r
1633 CApp = CApp + ' __FLEXIBLE_SIZE(*Size, %s, %s, %d); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName.strip("."), ArrayIndex + 1, FieldList[FieldName_ori][1], FieldList[FieldName_ori][2], FieldList[FieldName_ori][0])\r
1634 for skuname in Pcd.SkuOverrideValues:\r
1635 if skuname == TAB_COMMON:\r
1636 continue\r
1637 for defaultstorenameitem in Pcd.SkuOverrideValues[skuname]:\r
1638 CApp = CApp + "// SkuName: %s, DefaultStoreName: %s \n" % (skuname, defaultstorenameitem)\r
1639 for FieldList in [Pcd.SkuOverrideValues[skuname].get(defaultstorenameitem)]:\r
1640 if not FieldList:\r
1641 continue\r
1642 for FieldName in FieldList:\r
1643 FieldName = "." + FieldName\r
1644 IsArray = IsFieldValueAnArray(FieldList[FieldName.strip(".")][0])\r
1645 if IsArray and not (FieldList[FieldName.strip(".")][0].startswith('{GUID') and FieldList[FieldName.strip(".")][0].endswith('}')):\r
1646 try:\r
1647 Value = ValueExpressionEx(FieldList[FieldName.strip(".")][0], TAB_VOID, self._GuidDict)(True)\r
1648 except BadExpression:\r
1649 EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
1650 (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName.strip('.'))), FieldList[FieldName.strip(".")][1], FieldList[FieldName.strip(".")][2]))\r
1651 Value, ValueSize = ParseFieldValue(Value)\r
1652 CApp = CApp + ' __FLEXIBLE_SIZE(*Size, %s, %s, %d / __ARRAY_ELEMENT_SIZE(%s, %s) + ((%d %% __ARRAY_ELEMENT_SIZE(%s, %s)) ? 1 : 0)); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), FieldList[FieldName.strip(".")][1], FieldList[FieldName.strip(".")][2], FieldList[FieldName.strip(".")][0]);\r
1653 else:\r
1654 NewFieldName = ''\r
1655 FieldName_ori = FieldName.strip('.')\r
1656 while '[' in FieldName:\r
1657 NewFieldName = NewFieldName + FieldName.split('[', 1)[0] + '[0]'\r
1658 ArrayIndex = int(FieldName.split('[', 1)[1].split(']', 1)[0])\r
1659 FieldName = FieldName.split(']', 1)[1]\r
1660 FieldName = NewFieldName + FieldName\r
1661 while '[' in FieldName:\r
1662 FieldName = FieldName.rsplit('[', 1)[0]\r
1663 CApp = CApp + ' __FLEXIBLE_SIZE(*Size, %s, %s, %d); // From %s Line %d Value %s \n' % (Pcd.DatumType, FieldName.strip("."), ArrayIndex + 1, FieldList[FieldName_ori][1], FieldList[FieldName_ori][2], FieldList[FieldName_ori][0])\r
1664 if Pcd.PcdFieldValueFromFdf:\r
1665 CApp = CApp + "// From fdf \n"\r
1666 for FieldName in Pcd.PcdFieldValueFromFdf:\r
1667 FieldName = "." + FieldName\r
1668 IsArray = IsFieldValueAnArray(Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][0])\r
1669 if IsArray and not (Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][0].startswith('{GUID') and Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][0].endswith('}')):\r
1670 try:\r
1671 Value = ValueExpressionEx(Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][0], TAB_VOID, self._GuidDict)(True)\r
1672 except BadExpression:\r
1673 EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
1674 (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName.strip('.'))), Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][1], Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][2]))\r
1675 Value, ValueSize = ParseFieldValue(Value)\r
1676 CApp = CApp + ' __FLEXIBLE_SIZE(*Size, %s, %s, %d / __ARRAY_ELEMENT_SIZE(%s, %s) + ((%d %% __ARRAY_ELEMENT_SIZE(%s, %s)) ? 1 : 0)); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][1], Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][2], Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][0]);\r
1677 else:\r
1678 NewFieldName = ''\r
1679 FieldName_ori = FieldName.strip('.')\r
1680 while '[' in FieldName:\r
1681 NewFieldName = NewFieldName + FieldName.split('[', 1)[0] + '[0]'\r
1682 ArrayIndex = int(FieldName.split('[', 1)[1].split(']', 1)[0])\r
1683 FieldName = FieldName.split(']', 1)[1]\r
1684 FieldName = NewFieldName + FieldName\r
1685 while '[' in FieldName:\r
1686 FieldName = FieldName.rsplit('[', 1)[0]\r
1687 CApp = CApp + ' __FLEXIBLE_SIZE(*Size, %s, %s, %d); // From %s Line %s Value %s \n' % (Pcd.DatumType, FieldName.strip("."), ArrayIndex + 1, Pcd.PcdFieldValueFromFdf[FieldName_ori][1], Pcd.PcdFieldValueFromFdf[FieldName_ori][2], Pcd.PcdFieldValueFromFdf[FieldName_ori][0])\r
1688 if Pcd.PcdFieldValueFromComm:\r
1689 CApp = CApp + "// From Command Line \n"\r
1690 for FieldName in Pcd.PcdFieldValueFromComm:\r
1691 FieldName = "." + FieldName\r
1692 IsArray = IsFieldValueAnArray(Pcd.PcdFieldValueFromComm[FieldName.strip(".")][0])\r
1693 if IsArray and not (Pcd.PcdFieldValueFromComm[FieldName.strip(".")][0].startswith('{GUID') and Pcd.PcdFieldValueFromComm[FieldName.strip(".")][0].endswith('}')):\r
1694 try:\r
1695 Value = ValueExpressionEx(Pcd.PcdFieldValueFromComm[FieldName.strip(".")][0], TAB_VOID, self._GuidDict)(True)\r
1696 except BadExpression:\r
1697 EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
1698 (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName.strip('.'))), Pcd.PcdFieldValueFromComm[FieldName.strip(".")][1], Pcd.PcdFieldValueFromComm[FieldName.strip(".")][2]))\r
1699 Value, ValueSize = ParseFieldValue(Value)\r
1700 CApp = CApp + ' __FLEXIBLE_SIZE(*Size, %s, %s, %d / __ARRAY_ELEMENT_SIZE(%s, %s) + ((%d %% __ARRAY_ELEMENT_SIZE(%s, %s)) ? 1 : 0)); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), Pcd.PcdFieldValueFromComm[FieldName.strip(".")][1], Pcd.PcdFieldValueFromComm[FieldName.strip(".")][2], Pcd.PcdFieldValueFromComm[FieldName.strip(".")][0]);\r
1701 else:\r
1702 NewFieldName = ''\r
1703 FieldName_ori = FieldName.strip('.')\r
1704 while '[' in FieldName:\r
1705 NewFieldName = NewFieldName + FieldName.split('[', 1)[0] + '[0]'\r
1706 ArrayIndex = int(FieldName.split('[', 1)[1].split(']', 1)[0])\r
1707 FieldName = FieldName.split(']', 1)[1]\r
1708 FieldName = NewFieldName + FieldName\r
1709 while '[' in FieldName:\r
1710 FieldName = FieldName.rsplit('[', 1)[0]\r
1711 CApp = CApp + ' __FLEXIBLE_SIZE(*Size, %s, %s, %d); // From %s Line %d Value %s \n' % (Pcd.DatumType, FieldName.strip("."), ArrayIndex + 1, Pcd.PcdFieldValueFromComm[FieldName_ori][1], Pcd.PcdFieldValueFromComm[FieldName_ori][2], Pcd.PcdFieldValueFromComm[FieldName_ori][0])\r
1712 CApp = CApp + " *Size = (%d > *Size ? %d : *Size); // The Pcd maxsize is %d \n" % (Pcd.GetPcdMaxSize(), Pcd.GetPcdMaxSize(), Pcd.GetPcdMaxSize())\r
1713 CApp = CApp + "}\n"\r
1714 return CApp\r
1715\r
1716 @staticmethod\r
1717 def GenerateSizeStatments(Pcd):\r
1718 CApp = ' Size = sizeof(%s);\n' % (Pcd.DatumType)\r
1719 CApp = CApp + ' Cal_%s_%s_Size(&Size);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
1720 return CApp\r
1721\r
1722 def GenerateDefaultValueAssignFunction(self, Pcd):\r
1723 CApp = "// Default value in Dec \n"\r
1724 CApp = CApp + "void Assign_%s_%s_Default_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.DatumType)\r
1725 CApp = CApp + ' UINT32 FieldSize;\n'\r
1726 CApp = CApp + ' CHAR8 *Value;\n'\r
1727 DefaultValueFromDec = Pcd.DefaultValueFromDec\r
1728 IsArray = IsFieldValueAnArray(Pcd.DefaultValueFromDec)\r
1729 if IsArray:\r
1730 try:\r
1731 DefaultValueFromDec = ValueExpressionEx(Pcd.DefaultValueFromDec, TAB_VOID)(True)\r
1732 except BadExpression:\r
1733 EdkLogger.error("Build", FORMAT_INVALID, "Invalid value format for %s.%s, from DEC: %s" %\r
1734 (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, DefaultValueFromDec))\r
1735 DefaultValueFromDec = StringToArray(DefaultValueFromDec)\r
1736 Value, ValueSize = ParseFieldValue (DefaultValueFromDec)\r
1737 if isinstance(Value, str):\r
1738 CApp = CApp + ' Pcd = %s; // From DEC Default Value %s\n' % (Value, Pcd.DefaultValueFromDec)\r
1739 elif IsArray:\r
1740 #\r
1741 # Use memcpy() to copy value into field\r
1742 #\r
1743 CApp = CApp + ' Value = %s; // From DEC Default Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), Pcd.DefaultValueFromDec)\r
1744 CApp = CApp + ' memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
1745 for FieldList in [Pcd.DefaultValues]:\r
1746 if not FieldList:\r
1747 continue\r
1748 for FieldName in FieldList:\r
1749 IsArray = IsFieldValueAnArray(FieldList[FieldName][0])\r
1750 if IsArray:\r
1751 try:\r
1752 FieldList[FieldName][0] = ValueExpressionEx(FieldList[FieldName][0], TAB_VOID, self._GuidDict)(True)\r
1753 except BadExpression:\r
1754 EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
1755 (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName)), FieldList[FieldName][1], FieldList[FieldName][2]))\r
1756\r
1757 try:\r
1758 Value, ValueSize = ParseFieldValue (FieldList[FieldName][0])\r
1759 except Exception:\r
1760 EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " % (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName)), FieldList[FieldName][1], FieldList[FieldName][2]))\r
1761 if isinstance(Value, str):\r
1762 CApp = CApp + ' Pcd->%s = %s; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
1763 elif IsArray:\r
1764 #\r
1765 # Use memcpy() to copy value into field\r
1766 #\r
1767 CApp = CApp + ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.DatumType, FieldName)\r
1768 CApp = CApp + ' Value = %s; // From %s Line %d Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
1769 CApp = CApp + ' memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize)\r
1770 else:\r
1771 if ValueSize > 4:\r
1772 CApp = CApp + ' Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
1773 else:\r
1774 CApp = CApp + ' Pcd->%s = %d; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
1775 CApp = CApp + "}\n"\r
1776 return CApp\r
1777\r
1778 @staticmethod\r
1779 def GenerateDefaultValueAssignStatement(Pcd):\r
1780 CApp = ' Assign_%s_%s_Default_Value(Pcd);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
1781 return CApp\r
1782\r
1783 def GenerateInitValueFunction(self, Pcd, SkuName, DefaultStoreName):\r
1784 CApp = "// Value in Dsc for Sku: %s, DefaultStore %s\n" % (SkuName, DefaultStoreName)\r
1785 CApp = CApp + "void Assign_%s_%s_%s_%s_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, SkuName, DefaultStoreName, Pcd.DatumType)\r
1786 CApp = CApp + ' UINT32 FieldSize;\n'\r
1787 CApp = CApp + ' CHAR8 *Value;\n'\r
1788\r
1789 CApp = CApp + "// SkuName: %s, DefaultStoreName: %s \n" % (TAB_DEFAULT, TAB_DEFAULT_STORES_DEFAULT)\r
1790 inherit_OverrideValues = Pcd.SkuOverrideValues[SkuName]\r
1791 if (SkuName, DefaultStoreName) == (TAB_DEFAULT, TAB_DEFAULT_STORES_DEFAULT):\r
1792 pcddefaultvalue = Pcd.DefaultFromDSC.get(TAB_DEFAULT, {}).get(TAB_DEFAULT_STORES_DEFAULT, Pcd.DefaultValue) if Pcd.DefaultFromDSC else Pcd.DefaultValue\r
1793 else:\r
1794 if not Pcd.DscRawValue:\r
1795 # handle the case that structure pcd is not appear in DSC\r
1796 self.CopyDscRawValue(Pcd)\r
1797 pcddefaultvalue = Pcd.DscRawValue.get(SkuName, {}).get(DefaultStoreName)\r
1798 for FieldList in [pcddefaultvalue, inherit_OverrideValues.get(DefaultStoreName)]:\r
1799 if not FieldList:\r
1800 continue\r
1801 if pcddefaultvalue and FieldList == pcddefaultvalue:\r
1802 IsArray = IsFieldValueAnArray(FieldList)\r
1803 if IsArray:\r
1804 try:\r
1805 FieldList = ValueExpressionEx(FieldList, TAB_VOID)(True)\r
1806 except BadExpression:\r
1807 EdkLogger.error("Build", FORMAT_INVALID, "Invalid value format for %s.%s, from DSC: %s" %\r
1808 (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldList))\r
1809 Value, ValueSize = ParseFieldValue (FieldList)\r
1810\r
1811 if (SkuName, DefaultStoreName) == (TAB_DEFAULT, TAB_DEFAULT_STORES_DEFAULT):\r
1812 if isinstance(Value, str):\r
1813 CApp = CApp + ' Pcd = %s; // From DSC Default Value %s\n' % (Value, Pcd.DefaultFromDSC.get(TAB_DEFAULT, {}).get(TAB_DEFAULT_STORES_DEFAULT, Pcd.DefaultValue) if Pcd.DefaultFromDSC else Pcd.DefaultValue)\r
1814 elif IsArray:\r
1815 #\r
1816 # Use memcpy() to copy value into field\r
1817 #\r
1818 CApp = CApp + ' Value = %s; // From DSC Default Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), Pcd.DefaultFromDSC.get(TAB_DEFAULT, {}).get(TAB_DEFAULT_STORES_DEFAULT, Pcd.DefaultValue) if Pcd.DefaultFromDSC else Pcd.DefaultValue)\r
1819 CApp = CApp + ' memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
1820 else:\r
1821 if isinstance(Value, str):\r
1822 CApp = CApp + ' Pcd = %s; // From DSC Default Value %s\n' % (Value, Pcd.DscRawValue.get(SkuName, {}).get(DefaultStoreName))\r
1823 elif IsArray:\r
1824 #\r
1825 # Use memcpy() to copy value into field\r
1826 #\r
1827 CApp = CApp + ' Value = %s; // From DSC Default Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), Pcd.DscRawValue.get(SkuName, {}).get(DefaultStoreName))\r
1828 CApp = CApp + ' memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
1829 continue\r
1830 if (SkuName, DefaultStoreName) == (TAB_DEFAULT, TAB_DEFAULT_STORES_DEFAULT) or (( (SkuName, '') not in Pcd.ValueChain) and ( (SkuName, DefaultStoreName) not in Pcd.ValueChain )):\r
1831 for FieldName in FieldList:\r
1832 IsArray = IsFieldValueAnArray(FieldList[FieldName][0])\r
1833 if IsArray:\r
1834 try:\r
1835 FieldList[FieldName][0] = ValueExpressionEx(FieldList[FieldName][0], TAB_VOID, self._GuidDict)(True)\r
1836 except BadExpression:\r
1837 EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
1838 (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName)), FieldList[FieldName][1], FieldList[FieldName][2]))\r
1839 try:\r
1840 Value, ValueSize = ParseFieldValue (FieldList[FieldName][0])\r
1841 except Exception:\r
1842 EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " % (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName)), FieldList[FieldName][1], FieldList[FieldName][2]))\r
1843 if isinstance(Value, str):\r
1844 CApp = CApp + ' Pcd->%s = %s; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
1845 elif IsArray:\r
1846 #\r
1847 # Use memcpy() to copy value into field\r
1848 #\r
1849 CApp = CApp + ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.DatumType, FieldName)\r
1850 CApp = CApp + ' Value = %s; // From %s Line %d Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
1851 CApp = CApp + ' memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize)\r
1852 else:\r
1853 if ValueSize > 4:\r
1854 CApp = CApp + ' Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
1855 else:\r
1856 CApp = CApp + ' Pcd->%s = %d; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
1857 CApp = CApp + "}\n"\r
1858 return CApp\r
1859\r
1860 @staticmethod\r
1861 def GenerateInitValueStatement(Pcd, SkuName, DefaultStoreName):\r
1862 CApp = ' Assign_%s_%s_%s_%s_Value(Pcd);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, SkuName, DefaultStoreName)\r
1863 return CApp\r
1864\r
1865 def GenerateCommandLineValue(self, Pcd):\r
1866 CApp = "// Value in CommandLine\n"\r
1867 CApp = CApp + "void Assign_%s_%s_CommandLine_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.DatumType)\r
1868 CApp = CApp + ' UINT32 FieldSize;\n'\r
1869 CApp = CApp + ' CHAR8 *Value;\n'\r
1870\r
1871 pcddefaultvalue = Pcd.PcdValueFromComm\r
1872 for FieldList in [pcddefaultvalue, Pcd.PcdFieldValueFromComm]:\r
1873 if not FieldList:\r
1874 continue\r
1875 if pcddefaultvalue and FieldList == pcddefaultvalue:\r
1876 IsArray = IsFieldValueAnArray(FieldList)\r
1877 if IsArray:\r
1878 try:\r
1879 FieldList = ValueExpressionEx(FieldList, TAB_VOID)(True)\r
1880 except BadExpression:\r
1881 EdkLogger.error("Build", FORMAT_INVALID, "Invalid value format for %s.%s, from Command: %s" %\r
1882 (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldList))\r
1883 Value, ValueSize = ParseFieldValue (FieldList)\r
1884\r
1885 if isinstance(Value, str):\r
1886 CApp = CApp + ' Pcd = %s; // From Command Line \n' % (Value)\r
1887 elif IsArray:\r
1888 #\r
1889 # Use memcpy() to copy value into field\r
1890 #\r
1891 CApp = CApp + ' Value = %s; // From Command Line.\n' % (DscBuildData.IntToCString(Value, ValueSize))\r
1892 CApp = CApp + ' memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
1893 continue\r
1894 for FieldName in FieldList:\r
1895 IsArray = IsFieldValueAnArray(FieldList[FieldName][0])\r
1896 if IsArray:\r
1897 try:\r
1898 FieldList[FieldName][0] = ValueExpressionEx(FieldList[FieldName][0], TAB_VOID, self._GuidDict)(True)\r
1899 except BadExpression:\r
1900 EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
1901 (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName)), FieldList[FieldName][1], FieldList[FieldName][2]))\r
1902 except:\r
1903 print("error")\r
1904 try:\r
1905 Value, ValueSize = ParseFieldValue (FieldList[FieldName][0])\r
1906 except Exception:\r
1907 EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " % (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName)), FieldList[FieldName][1], FieldList[FieldName][2]))\r
1908 if isinstance(Value, str):\r
1909 CApp = CApp + ' Pcd->%s = %s; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
1910 elif IsArray:\r
1911 #\r
1912 # Use memcpy() to copy value into field\r
1913 #\r
1914 CApp = CApp + ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.DatumType, FieldName)\r
1915 CApp = CApp + ' Value = %s; // From %s Line %d Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
1916 CApp = CApp + ' memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize)\r
1917 else:\r
1918 if ValueSize > 4:\r
1919 CApp = CApp + ' Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
1920 else:\r
1921 CApp = CApp + ' Pcd->%s = %d; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
1922 CApp = CApp + "}\n"\r
1923 return CApp\r
1924\r
1925 @staticmethod\r
1926 def GenerateCommandLineValueStatement(Pcd):\r
1927 CApp = ' Assign_%s_%s_CommandLine_Value(Pcd);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
1928 return CApp\r
1929 def GenerateFdfValue(self,Pcd):\r
1930 CApp = "// Value in Fdf\n"\r
1931 CApp = CApp + "void Assign_%s_%s_Fdf_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,Pcd.DatumType)\r
1932 CApp = CApp + ' UINT32 FieldSize;\n'\r
1933 CApp = CApp + ' CHAR8 *Value;\n'\r
1934\r
1935 pcddefaultvalue = Pcd.PcdValueFromFdf\r
1936 for FieldList in [pcddefaultvalue,Pcd.PcdFieldValueFromFdf]:\r
1937 if not FieldList:\r
1938 continue\r
1939 if pcddefaultvalue and FieldList == pcddefaultvalue:\r
1940 IsArray = IsFieldValueAnArray(FieldList)\r
1941 if IsArray:\r
1942 try:\r
1943 FieldList = ValueExpressionEx(FieldList, TAB_VOID)(True)\r
1944 except BadExpression:\r
1945 EdkLogger.error("Build", FORMAT_INVALID, "Invalid value format for %s.%s, from Fdf: %s" %\r
1946 (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldList))\r
1947 Value, ValueSize = ParseFieldValue (FieldList)\r
1948\r
1949 if isinstance(Value, str):\r
1950 CApp = CApp + ' Pcd = %s; // From Fdf \n' % (Value)\r
1951 elif IsArray:\r
1952 #\r
1953 # Use memcpy() to copy value into field\r
1954 #\r
1955 CApp = CApp + ' Value = %s; // From Fdf .\n' % (DscBuildData.IntToCString(Value, ValueSize))\r
1956 CApp = CApp + ' memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
1957 continue\r
1958 for FieldName in FieldList:\r
1959 IsArray = IsFieldValueAnArray(FieldList[FieldName][0])\r
1960 if IsArray:\r
1961 try:\r
1962 FieldList[FieldName][0] = ValueExpressionEx(FieldList[FieldName][0], TAB_VOID, self._GuidDict)(True)\r
1963 except BadExpression:\r
1964 EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
1965 (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName)), FieldList[FieldName][1], FieldList[FieldName][2]))\r
1966 except:\r
1967 print("error")\r
1968 try:\r
1969 Value, ValueSize = ParseFieldValue (FieldList[FieldName][0])\r
1970 except Exception:\r
1971 EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " % (".".join((Pcd.TokenSpaceGuidCName,Pcd.TokenCName,FieldName)),FieldList[FieldName][1], FieldList[FieldName][2]))\r
1972 if isinstance(Value, str):\r
1973 CApp = CApp + ' Pcd->%s = %s; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
1974 elif IsArray:\r
1975 #\r
1976 # Use memcpy() to copy value into field\r
1977 #\r
1978 CApp = CApp + ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.DatumType, FieldName)\r
1979 CApp = CApp + ' Value = %s; // From %s Line %d Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
1980 CApp = CApp + ' memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize)\r
1981 else:\r
1982 if ValueSize > 4:\r
1983 CApp = CApp + ' Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
1984 else:\r
1985 CApp = CApp + ' Pcd->%s = %d; // From %s Line %s Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
1986 CApp = CApp + "}\n"\r
1987 return CApp\r
1988\r
1989 @staticmethod\r
1990 def GenerateFdfValueStatement(Pcd):\r
1991 CApp = ' Assign_%s_%s_Fdf_Value(Pcd);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
1992 return CApp\r
1993\r
1994 def GenerateInitializeFunc(self, SkuName, DefaultStore, Pcd, InitByteValue, CApp):\r
1995 OverrideValues = {DefaultStore:""}\r
1996 if Pcd.SkuOverrideValues:\r
1997 OverrideValues = Pcd.SkuOverrideValues[SkuName]\r
1998 for DefaultStoreName in OverrideValues:\r
1999 CApp = CApp + 'void\n'\r
2000 CApp = CApp + 'Initialize_%s_%s_%s_%s(\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
2001 CApp = CApp + ' void\n'\r
2002 CApp = CApp + ' )\n'\r
2003 CApp = CApp + '{\n'\r
2004 CApp = CApp + ' UINT32 Size;\n'\r
2005 CApp = CApp + ' UINT32 FieldSize;\n'\r
2006 CApp = CApp + ' CHAR8 *Value;\n'\r
2007 CApp = CApp + ' UINT32 OriginalSize;\n'\r
2008 CApp = CApp + ' VOID *OriginalPcd;\n'\r
2009 CApp = CApp + ' %s *Pcd; // From %s Line %d \n' % (Pcd.DatumType, Pcd.PkgPath, Pcd.PcdDefineLineNo)\r
2010 CApp = CApp + '\n'\r
2011\r
2012 if SkuName in Pcd.SkuInfoList:\r
2013 DefaultValue = Pcd.SkuInfoList[SkuName].DefaultStoreDict.get(DefaultStoreName, Pcd.SkuInfoList[SkuName].HiiDefaultValue if Pcd.SkuInfoList[SkuName].HiiDefaultValue else Pcd.SkuInfoList[SkuName].DefaultValue)\r
2014 else:\r
2015 DefaultValue = Pcd.DefaultValue\r
2016 PcdDefaultValue = StringToArray(DefaultValue.strip())\r
2017\r
2018 InitByteValue += '%s.%s.%s.%s|%s|%s\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.DatumType, PcdDefaultValue)\r
2019\r
2020 #\r
2021 # Get current PCD value and size\r
2022 #\r
2023 CApp = CApp + ' OriginalPcd = PcdGetPtr (%s, %s, %s, %s, &OriginalSize);\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
2024\r
2025 #\r
2026 # Determine the size of the PCD. For simple structures, sizeof(TYPE) provides\r
2027 # the correct value. For structures with a flexible array member, the flexible\r
2028 # array member is detected, and the size is based on the highest index used with\r
2029 # the flexible array member. The flexible array member must be the last field\r
2030 # in a structure. The size formula for this case is:\r
2031 # OFFSET_OF(FlexbleArrayField) + sizeof(FlexibleArray[0]) * (HighestIndex + 1)\r
2032 #\r
2033 CApp = CApp + DscBuildData.GenerateSizeStatments(Pcd)\r
2034\r
2035 #\r
2036 # Allocate and zero buffer for the PCD\r
2037 # Must handle cases where current value is smaller, larger, or same size\r
2038 # Always keep that larger one as the current size\r
2039 #\r
2040 CApp = CApp + ' Size = (OriginalSize > Size ? OriginalSize : Size);\n'\r
2041 CApp = CApp + ' Pcd = (%s *)malloc (Size);\n' % (Pcd.DatumType)\r
2042 CApp = CApp + ' memset (Pcd, 0, Size);\n'\r
2043\r
2044 #\r
2045 # Copy current PCD value into allocated buffer.\r
2046 #\r
2047 CApp = CApp + ' memcpy (Pcd, OriginalPcd, OriginalSize);\n'\r
2048\r
2049 #\r
2050 # Assign field values in PCD\r
2051 #\r
2052 CApp = CApp + DscBuildData.GenerateDefaultValueAssignStatement(Pcd)\r
2053 if Pcd.Type not in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD],\r
2054 self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:\r
2055 for skuname in self.SkuIdMgr.GetSkuChain(SkuName):\r
2056 storeset = [DefaultStoreName] if DefaultStoreName == TAB_DEFAULT_STORES_DEFAULT else [TAB_DEFAULT_STORES_DEFAULT, DefaultStoreName]\r
2057 for defaultstorenameitem in storeset:\r
2058 CApp = CApp + "// SkuName: %s, DefaultStoreName: %s \n" % (skuname, defaultstorenameitem)\r
2059 CApp = CApp + DscBuildData.GenerateInitValueStatement(Pcd, skuname, defaultstorenameitem)\r
2060 if skuname == SkuName:\r
2061 break\r
2062 else:\r
2063 CApp = CApp + "// SkuName: %s, DefaultStoreName: STANDARD \n" % self.SkuIdMgr.SystemSkuId\r
2064 CApp = CApp + DscBuildData.GenerateInitValueStatement(Pcd, self.SkuIdMgr.SystemSkuId, TAB_DEFAULT_STORES_DEFAULT)\r
2065 CApp = CApp + DscBuildData.GenerateFdfValueStatement(Pcd)\r
2066 CApp = CApp + DscBuildData.GenerateCommandLineValueStatement(Pcd)\r
2067 #\r
2068 # Set new PCD value and size\r
2069 #\r
2070 CApp = CApp + ' PcdSetPtr (%s, %s, %s, %s, Size, (UINT8 *)Pcd);\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
2071\r
2072 #\r
2073 # Free PCD\r
2074 #\r
2075 CApp = CApp + ' free (Pcd);\n'\r
2076 CApp = CApp + '}\n'\r
2077 CApp = CApp + '\n'\r
2078 return InitByteValue, CApp\r
2079\r
2080 def GenerateByteArrayValue (self, StructuredPcds):\r
2081 #\r
2082 # Generate/Compile/Run C application to determine if there are any flexible array members\r
2083 #\r
2084 if not StructuredPcds:\r
2085 return\r
2086\r
2087 InitByteValue = ""\r
2088 CApp = PcdMainCHeader\r
2089\r
2090 IncludeFiles = set()\r
2091 for PcdName in StructuredPcds:\r
2092 Pcd = StructuredPcds[PcdName]\r
2093 for IncludeFile in Pcd.StructuredPcdIncludeFile:\r
2094 if IncludeFile not in IncludeFiles:\r
2095 IncludeFiles.add(IncludeFile)\r
2096 CApp = CApp + '#include <%s>\n' % (IncludeFile)\r
2097 CApp = CApp + '\n'\r
2098 for PcdName in StructuredPcds:\r
2099 Pcd = StructuredPcds[PcdName]\r
2100 CApp = CApp + self.GenerateSizeFunction(Pcd)\r
2101 CApp = CApp + self.GenerateDefaultValueAssignFunction(Pcd)\r
2102 CApp = CApp + self.GenerateFdfValue(Pcd)\r
2103 CApp = CApp + self.GenerateCommandLineValue(Pcd)\r
2104 if not Pcd.SkuOverrideValues or Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD],\r
2105 self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:\r
2106 CApp = CApp + self.GenerateInitValueFunction(Pcd, self.SkuIdMgr.SystemSkuId, TAB_DEFAULT_STORES_DEFAULT)\r
2107 else:\r
2108 for SkuName in self.SkuIdMgr.SkuOverrideOrder():\r
2109 if SkuName not in Pcd.SkuOverrideValues:\r
2110 continue\r
2111 for DefaultStoreName in Pcd.SkuOverrideValues[SkuName]:\r
2112 CApp = CApp + self.GenerateInitValueFunction(Pcd, SkuName, DefaultStoreName)\r
2113 if not Pcd.SkuOverrideValues or Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD],\r
2114 self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:\r
2115 InitByteValue, CApp = self.GenerateInitializeFunc(self.SkuIdMgr.SystemSkuId, TAB_DEFAULT_STORES_DEFAULT, Pcd, InitByteValue, CApp)\r
2116 else:\r
2117 for SkuName in self.SkuIdMgr.SkuOverrideOrder():\r
2118 if SkuName not in Pcd.SkuOverrideValues:\r
2119 continue\r
2120 for DefaultStoreName in Pcd.DefaultStoreName:\r
2121 Pcd = StructuredPcds[PcdName]\r
2122 InitByteValue, CApp = self.GenerateInitializeFunc(SkuName, DefaultStoreName, Pcd, InitByteValue, CApp)\r
2123\r
2124 CApp = CApp + 'VOID\n'\r
2125 CApp = CApp + 'PcdEntryPoint(\n'\r
2126 CApp = CApp + ' VOID\n'\r
2127 CApp = CApp + ' )\n'\r
2128 CApp = CApp + '{\n'\r
2129 for Pcd in StructuredPcds.values():\r
2130 if not Pcd.SkuOverrideValues or Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD], self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:\r
2131 CApp = CApp + ' Initialize_%s_%s_%s_%s();\n' % (self.SkuIdMgr.SystemSkuId, TAB_DEFAULT_STORES_DEFAULT, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
2132 else:\r
2133 for SkuName in self.SkuIdMgr.SkuOverrideOrder():\r
2134 if SkuName not in Pcd.SkuOverrideValues:\r
2135 continue\r
2136 for DefaultStoreName in Pcd.SkuOverrideValues[SkuName]:\r
2137 CApp = CApp + ' Initialize_%s_%s_%s_%s();\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
2138 CApp = CApp + '}\n'\r
2139\r
2140 CApp = CApp + PcdMainCEntry + '\n'\r
2141\r
2142 if not os.path.exists(self.OutputPath):\r
2143 os.makedirs(self.OutputPath)\r
2144 CAppBaseFileName = os.path.join(self.OutputPath, PcdValueInitName)\r
2145 SaveFileOnChange(CAppBaseFileName + '.c', CApp, False)\r
2146\r
2147 MakeApp = PcdMakefileHeader\r
2148 if sys.platform == "win32":\r
2149 MakeApp = MakeApp + 'APPNAME = %s\n' % (PcdValueInitName) + 'OBJECTS = %s\%s.obj\n' % (self.OutputPath, PcdValueInitName) + 'INC = '\r
2150 else:\r
2151 MakeApp = MakeApp + PcdGccMakefile\r
2152 MakeApp = MakeApp + 'APPNAME = %s\n' % (PcdValueInitName) + 'OBJECTS = %s/%s.o\n' % (self.OutputPath, PcdValueInitName) + \\r
2153 'include $(MAKEROOT)/Makefiles/app.makefile\n' + 'INCLUDE +='\r
2154\r
2155 IncSearchList = []\r
2156 PlatformInc = {}\r
2157 for Cache in self._Bdb._CACHE_.values():\r
2158 if Cache.MetaFile.Ext.lower() != '.dec':\r
2159 continue\r
2160 if Cache.Includes:\r
2161 if str(Cache.MetaFile.Path) not in PlatformInc:\r
2162 PlatformInc[str(Cache.MetaFile.Path)] = []\r
2163 PlatformInc[str(Cache.MetaFile.Path)].append (os.path.dirname(Cache.MetaFile.Path))\r
2164 PlatformInc[str(Cache.MetaFile.Path)].extend (Cache.CommonIncludes)\r
2165\r
2166 PcdDependDEC = []\r
2167 for Pcd in StructuredPcds.values():\r
2168 for PackageDec in Pcd.PackageDecs:\r
2169 Package = os.path.normpath(mws.join(GlobalData.gWorkspace, PackageDec))\r
2170 if not os.path.exists(Package):\r
2171 EdkLogger.error('Build', RESOURCE_NOT_AVAILABLE, "The dependent Package %s of PCD %s.%s is not exist." % (PackageDec, Pcd.TokenSpaceGuidCName, Pcd.TokenCName))\r
2172 if Package not in PcdDependDEC:\r
2173 PcdDependDEC.append(Package)\r
2174\r
2175 if PlatformInc and PcdDependDEC:\r
2176 for pkg in PcdDependDEC:\r
2177 if pkg in PlatformInc:\r
2178 for inc in PlatformInc[pkg]:\r
2179 MakeApp += '-I' + str(inc) + ' '\r
2180 IncSearchList.append(inc)\r
2181 MakeApp = MakeApp + '\n'\r
2182\r
2183 CC_FLAGS = LinuxCFLAGS\r
2184 if sys.platform == "win32":\r
2185 CC_FLAGS = WindowsCFLAGS\r
2186 BuildOptions = {}\r
2187 for Options in self.BuildOptions:\r
2188 if Options[2] != EDKII_NAME:\r
2189 continue\r
2190 Family = Options[0]\r
2191 if Family and Family != self.ToolChainFamily:\r
2192 continue\r
2193 Target, Tag, Arch, Tool, Attr = Options[1].split("_")\r
2194 if Tool != 'CC':\r
2195 continue\r
2196\r
2197 if Target == "*" or Target == self._Target:\r
2198 if Tag == "*" or Tag == self._Toolchain:\r
2199 if Arch == "*" or Arch == self.Arch:\r
2200 if Tool not in BuildOptions:\r
2201 BuildOptions[Tool] = {}\r
2202 if Attr != "FLAGS" or Attr not in BuildOptions[Tool] or self.BuildOptions[Options].startswith('='):\r
2203 BuildOptions[Tool][Attr] = self.BuildOptions[Options]\r
2204 else:\r
2205 # append options for the same tool except PATH\r
2206 if Attr != 'PATH':\r
2207 BuildOptions[Tool][Attr] += " " + self.BuildOptions[Options]\r
2208 else:\r
2209 BuildOptions[Tool][Attr] = self.BuildOptions[Options]\r
2210 if BuildOptions:\r
2211 for Tool in BuildOptions:\r
2212 for Attr in BuildOptions[Tool]:\r
2213 if Attr == "FLAGS":\r
2214 Value = BuildOptions[Tool][Attr]\r
2215 ValueList = Value.split()\r
2216 if ValueList:\r
2217 for Id, Item in enumerate(ValueList):\r
2218 if Item in ['-D', '/D', '-U', '/U']:\r
2219 CC_FLAGS += ' ' + Item\r
2220 if Id + 1 < len(ValueList):\r
2221 CC_FLAGS += ' ' + ValueList[Id + 1]\r
2222 elif Item.startswith(('-D', '/D', '-U', '/U')):\r
2223 CC_FLAGS += ' ' + Item\r
2224 MakeApp += CC_FLAGS\r
2225\r
2226 if sys.platform == "win32":\r
2227 MakeApp = MakeApp + PcdMakefileEnd\r
2228 MakeApp = MakeApp + '\n'\r
2229 IncludeFileFullPaths = []\r
2230 for includefile in IncludeFiles:\r
2231 for includepath in IncSearchList:\r
2232 includefullpath = os.path.join(str(includepath), includefile)\r
2233 if os.path.exists(includefullpath):\r
2234 IncludeFileFullPaths.append(os.path.normpath(includefullpath))\r
2235 break\r
2236 SearchPathList = []\r
2237 SearchPathList.append(os.path.normpath(mws.join(GlobalData.gWorkspace, "BaseTools/Source/C/Include")))\r
2238 SearchPathList.append(os.path.normpath(mws.join(GlobalData.gWorkspace, "BaseTools/Source/C/Common")))\r
2239 SearchPathList.extend(str(item) for item in IncSearchList)\r
2240 IncFileList = GetDependencyList(IncludeFileFullPaths, SearchPathList)\r
2241 for include_file in IncFileList:\r
2242 MakeApp += "$(OBJECTS) : %s\n" % include_file\r
2243 MakeFileName = os.path.join(self.OutputPath, 'Makefile')\r
2244 MakeApp += "$(OBJECTS) : %s\n" % MakeFileName\r
2245 SaveFileOnChange(MakeFileName, MakeApp, False)\r
2246\r
2247 InputValueFile = os.path.join(self.OutputPath, 'Input.txt')\r
2248 OutputValueFile = os.path.join(self.OutputPath, 'Output.txt')\r
2249 SaveFileOnChange(InputValueFile, InitByteValue, False)\r
2250\r
2251 PcdValueInitExe = PcdValueInitName\r
2252 if not sys.platform == "win32":\r
2253 PcdValueInitExe = os.path.join(os.getenv("EDK_TOOLS_PATH"), 'Source', 'C', 'bin', PcdValueInitName)\r
2254 else:\r
2255 PcdValueInitExe = os.path.join(os.getenv("EDK_TOOLS_PATH"), 'Bin', 'Win32', PcdValueInitName) +".exe"\r
2256\r
2257 Messages = ''\r
2258 if sys.platform == "win32":\r
2259 MakeCommand = 'nmake -f %s' % (MakeFileName)\r
2260 returncode, StdOut, StdErr = DscBuildData.ExecuteCommand (MakeCommand)\r
2261 Messages = StdOut\r
2262 else:\r
2263 MakeCommand = 'make -f %s' % (MakeFileName)\r
2264 returncode, StdOut, StdErr = DscBuildData.ExecuteCommand (MakeCommand)\r
2265 Messages = StdErr\r
2266 Messages = Messages.split('\n')\r
2267 MessageGroup = []\r
2268 if returncode != 0:\r
2269 CAppBaseFileName = os.path.join(self.OutputPath, PcdValueInitName)\r
2270 File = open (CAppBaseFileName + '.c', 'r')\r
2271 FileData = File.readlines()\r
2272 File.close()\r
2273 for Message in Messages:\r
2274 if " error" in Message or "warning" in Message:\r
2275 FileInfo = Message.strip().split('(')\r
2276 if len (FileInfo) > 1:\r
2277 FileName = FileInfo [0]\r
2278 FileLine = FileInfo [1].split (')')[0]\r
2279 else:\r
2280 FileInfo = Message.strip().split(':')\r
2281 FileName = FileInfo [0]\r
2282 FileLine = FileInfo [1]\r
2283 if FileLine.isdigit():\r
2284 error_line = FileData[int (FileLine) - 1]\r
2285 if r"//" in error_line:\r
2286 c_line, dsc_line = error_line.split(r"//")\r
2287 else:\r
2288 dsc_line = error_line\r
2289 message_itmes = Message.split(":")\r
2290 Index = 0\r
2291 if "PcdValueInit.c" not in Message:\r
2292 if not MessageGroup:\r
2293 MessageGroup.append(Message)\r
2294 break\r
2295 else:\r
2296 for item in message_itmes:\r
2297 if "PcdValueInit.c" in item:\r
2298 Index = message_itmes.index(item)\r
2299 message_itmes[Index] = dsc_line.strip()\r
2300 break\r
2301 MessageGroup.append(":".join(message_itmes[Index:]).strip())\r
2302 continue\r
2303 else:\r
2304 MessageGroup.append(Message)\r
2305 if MessageGroup:\r
2306 EdkLogger.error("build", PCD_STRUCTURE_PCD_ERROR, "\n".join(MessageGroup) )\r
2307 else:\r
2308 EdkLogger.error('Build', COMMAND_FAILURE, 'Can not execute command: %s' % MakeCommand)\r
2309\r
2310 if DscBuildData.NeedUpdateOutput(OutputValueFile, PcdValueInitExe, InputValueFile):\r
2311 Command = PcdValueInitExe + ' -i %s -o %s' % (InputValueFile, OutputValueFile)\r
2312 returncode, StdOut, StdErr = DscBuildData.ExecuteCommand (Command)\r
2313 if returncode != 0:\r
2314 EdkLogger.warn('Build', COMMAND_FAILURE, 'Can not collect output from command: %s' % Command)\r
2315\r
2316 File = open (OutputValueFile, 'r')\r
2317 FileBuffer = File.readlines()\r
2318 File.close()\r
2319\r
2320 StructurePcdSet = []\r
2321 for Pcd in FileBuffer:\r
2322 PcdValue = Pcd.split ('|')\r
2323 PcdInfo = PcdValue[0].split ('.')\r
2324 StructurePcdSet.append((PcdInfo[0], PcdInfo[1], PcdInfo[2], PcdInfo[3], PcdValue[2].strip()))\r
2325 return StructurePcdSet\r
2326\r
2327 @staticmethod\r
2328 def NeedUpdateOutput(OutputFile, ValueCFile, StructureInput):\r
2329 if not os.path.exists(OutputFile):\r
2330 return True\r
2331 if os.stat(OutputFile).st_mtime <= os.stat(ValueCFile).st_mtime:\r
2332 return True\r
2333 if os.stat(OutputFile).st_mtime <= os.stat(StructureInput).st_mtime:\r
2334 return True\r
2335 return False\r
2336\r
2337 ## Retrieve dynamic PCD settings\r
2338 #\r
2339 # @param Type PCD type\r
2340 #\r
2341 # @retval a dict object contains settings of given PCD type\r
2342 #\r
2343 def _GetDynamicPcd(self, Type):\r
2344\r
2345\r
2346 Pcds = OrderedDict()\r
2347 #\r
2348 # tdict is a special dict kind of type, used for selecting correct\r
2349 # PCD settings for certain ARCH and SKU\r
2350 #\r
2351 PcdDict = tdict(True, 4)\r
2352 PcdList = []\r
2353 # Find out all possible PCD candidates for self._Arch\r
2354 RecordList = self._RawData[Type, self._Arch]\r
2355 AvailableSkuIdSet = copy.copy(self.SkuIds)\r
2356\r
2357\r
2358 for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, Dummy3, Dummy4, Dummy5 in RecordList:\r
2359 SkuName = SkuName.upper()\r
2360 SkuName = TAB_DEFAULT if SkuName == TAB_COMMON else SkuName\r
2361 if SkuName not in AvailableSkuIdSet:\r
2362 EdkLogger.error('build', PARAMETER_INVALID, 'Sku %s is not defined in [SkuIds] section' % SkuName,\r
2363 File=self.MetaFile, Line=Dummy5)\r
2364 if "." not in TokenSpaceGuid:\r
2365 PcdList.append((PcdCName, TokenSpaceGuid, SkuName, Dummy5))\r
2366 PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid] = Setting\r
2367\r
2368 # Remove redundant PCD candidates, per the ARCH and SKU\r
2369 for PcdCName, TokenSpaceGuid, SkuName, Dummy4 in PcdList:\r
2370\r
2371 Setting = PcdDict[self._Arch, SkuName, PcdCName, TokenSpaceGuid]\r
2372 if Setting is None:\r
2373 continue\r
2374\r
2375 PcdValue, DatumType, MaxDatumSize = self._ValidatePcd(PcdCName, TokenSpaceGuid, Setting, Type, Dummy4)\r
2376 if MaxDatumSize:\r
2377 if int(MaxDatumSize, 0) > 0xFFFF:\r
2378 EdkLogger.error('build', FORMAT_INVALID, "The size value must not exceed the maximum value of 0xFFFF (UINT16) for %s." % ".".join((TokenSpaceGuid, PcdCName)),\r
2379 File=self.MetaFile, Line=Dummy4)\r
2380 if int(MaxDatumSize, 0) < 0:\r
2381 EdkLogger.error('build', FORMAT_INVALID, "The size value can't be set to negative value for %s." % ".".join((TokenSpaceGuid, PcdCName)),\r
2382 File=self.MetaFile, Line=Dummy4)\r
2383 SkuInfo = SkuInfoClass(SkuName, self.SkuIds[SkuName][0], '', '', '', '', '', PcdValue)\r
2384 if (PcdCName, TokenSpaceGuid) in Pcds:\r
2385 pcdObject = Pcds[PcdCName, TokenSpaceGuid]\r
2386 pcdObject.SkuInfoList[SkuName] = SkuInfo\r
2387 if MaxDatumSize.strip():\r
2388 CurrentMaxSize = int(MaxDatumSize.strip(), 0)\r
2389 else:\r
2390 CurrentMaxSize = 0\r
2391 if pcdObject.MaxDatumSize:\r
2392 PcdMaxSize = int(pcdObject.MaxDatumSize, 0)\r
2393 else:\r
2394 PcdMaxSize = 0\r
2395 if CurrentMaxSize > PcdMaxSize:\r
2396 pcdObject.MaxDatumSize = str(CurrentMaxSize)\r
2397 else:\r
2398 Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject(\r
2399 PcdCName,\r
2400 TokenSpaceGuid,\r
2401 self._PCD_TYPE_STRING_[Type],\r
2402 DatumType,\r
2403 PcdValue,\r
2404 '',\r
2405 MaxDatumSize,\r
2406 {SkuName : SkuInfo},\r
2407 False,\r
2408 None,\r
2409 IsDsc=True)\r
2410\r
2411 for pcd in Pcds.values():\r
2412 pcdDecObject = self._DecPcds[pcd.TokenCName, pcd.TokenSpaceGuidCName]\r
2413 # Only fix the value while no value provided in DSC file.\r
2414 for sku in pcd.SkuInfoList.values():\r
2415 if not sku.DefaultValue:\r
2416 sku.DefaultValue = pcdDecObject.DefaultValue\r
2417 if TAB_DEFAULT not in pcd.SkuInfoList and TAB_COMMON not in pcd.SkuInfoList:\r
2418 valuefromDec = pcdDecObject.DefaultValue\r
2419 SkuInfo = SkuInfoClass(TAB_DEFAULT, '0', '', '', '', '', '', valuefromDec)\r
2420 pcd.SkuInfoList[TAB_DEFAULT] = SkuInfo\r
2421 elif TAB_DEFAULT not in pcd.SkuInfoList and TAB_COMMON in pcd.SkuInfoList:\r
2422 pcd.SkuInfoList[TAB_DEFAULT] = pcd.SkuInfoList[TAB_COMMON]\r
2423 del pcd.SkuInfoList[TAB_COMMON]\r
2424 elif TAB_DEFAULT in pcd.SkuInfoList and TAB_COMMON in pcd.SkuInfoList:\r
2425 del pcd.SkuInfoList[TAB_COMMON]\r
2426\r
2427 map(self.FilterSkuSettings, Pcds.values())\r
2428\r
2429 return Pcds\r
2430\r
2431 def FilterSkuSettings(self, PcdObj):\r
2432\r
2433 if self.SkuIdMgr.SkuUsageType == self.SkuIdMgr.SINGLE:\r
2434 if TAB_DEFAULT in PcdObj.SkuInfoList and self.SkuIdMgr.SystemSkuId not in PcdObj.SkuInfoList:\r
2435 PcdObj.SkuInfoList[self.SkuIdMgr.SystemSkuId] = PcdObj.SkuInfoList[TAB_DEFAULT]\r
2436 PcdObj.SkuInfoList = {TAB_DEFAULT:PcdObj.SkuInfoList[self.SkuIdMgr.SystemSkuId]}\r
2437 PcdObj.SkuInfoList[TAB_DEFAULT].SkuIdName = TAB_DEFAULT\r
2438 PcdObj.SkuInfoList[TAB_DEFAULT].SkuId = '0'\r
2439\r
2440 elif self.SkuIdMgr.SkuUsageType == self.SkuIdMgr.DEFAULT:\r
2441 PcdObj.SkuInfoList = {TAB_DEFAULT:PcdObj.SkuInfoList[TAB_DEFAULT]}\r
2442\r
2443 return PcdObj\r
2444\r
2445 @staticmethod\r
2446 def CompareVarAttr(Attr1, Attr2):\r
2447 if not Attr1 or not Attr2: # for empty string\r
2448 return True\r
2449 Attr1s = [attr.strip() for attr in Attr1.split(",")]\r
2450 Attr1Set = set(Attr1s)\r
2451 Attr2s = [attr.strip() for attr in Attr2.split(",")]\r
2452 Attr2Set = set(Attr2s)\r
2453 if Attr2Set == Attr1Set:\r
2454 return True\r
2455 else:\r
2456 return False\r
2457\r
2458 def CopyDscRawValue(self, Pcd):\r
2459 if Pcd.DscRawValue is None:\r
2460 Pcd.DscRawValue = dict()\r
2461 if Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD], self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:\r
2462 if self.SkuIdMgr.SystemSkuId not in Pcd.DscRawValue:\r
2463 Pcd.DscRawValue[self.SkuIdMgr.SystemSkuId] = {}\r
2464 Pcd.DscRawValue[self.SkuIdMgr.SystemSkuId][TAB_DEFAULT_STORES_DEFAULT] = Pcd.DefaultValue\r
2465 for skuname in Pcd.SkuInfoList:\r
2466 Pcd.DscRawValue[skuname] = {}\r
2467 if Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
2468 for defaultstore in Pcd.SkuInfoList[skuname].DefaultStoreDict:\r
2469 Pcd.DscRawValue[skuname][defaultstore] = Pcd.SkuInfoList[skuname].DefaultStoreDict[defaultstore]\r
2470 else:\r
2471 Pcd.DscRawValue[skuname][TAB_DEFAULT_STORES_DEFAULT] = Pcd.SkuInfoList[skuname].DefaultValue\r
2472 def CompletePcdValues(self, PcdSet):\r
2473 Pcds = {}\r
2474 DefaultStoreObj = DefaultStore(self._GetDefaultStores())\r
2475 SkuIds = {skuname:skuid for skuname, skuid in self.SkuIdMgr.AvailableSkuIdSet.items() if skuname != TAB_COMMON}\r
2476 DefaultStores = set(storename for pcdobj in PcdSet.values() for skuobj in pcdobj.SkuInfoList.values() for storename in skuobj.DefaultStoreDict)\r
2477 for PcdCName, TokenSpaceGuid in PcdSet:\r
2478 PcdObj = PcdSet[(PcdCName, TokenSpaceGuid)]\r
2479 self.CopyDscRawValue(PcdObj)\r
2480 if PcdObj.Type not in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_DEFAULT],\r
2481 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII],\r
2482 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_VPD],\r
2483 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_DEFAULT],\r
2484 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII],\r
2485 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_VPD]]:\r
2486 Pcds[PcdCName, TokenSpaceGuid]= PcdObj\r
2487 continue\r
2488 PcdType = PcdObj.Type\r
2489 if PcdType in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
2490 for skuid in PcdObj.SkuInfoList:\r
2491 skuobj = PcdObj.SkuInfoList[skuid]\r
2492 mindefaultstorename = DefaultStoreObj.GetMin(set(defaultstorename for defaultstorename in skuobj.DefaultStoreDict))\r
2493 for defaultstorename in DefaultStores:\r
2494 if defaultstorename not in skuobj.DefaultStoreDict:\r
2495 skuobj.DefaultStoreDict[defaultstorename] = copy.deepcopy(skuobj.DefaultStoreDict[mindefaultstorename])\r
2496 skuobj.HiiDefaultValue = skuobj.DefaultStoreDict[mindefaultstorename]\r
2497 for skuname, skuid in SkuIds.items():\r
2498 if skuname not in PcdObj.SkuInfoList:\r
2499 nextskuid = self.SkuIdMgr.GetNextSkuId(skuname)\r
2500 while nextskuid not in PcdObj.SkuInfoList:\r
2501 nextskuid = self.SkuIdMgr.GetNextSkuId(nextskuid)\r
2502 PcdObj.SkuInfoList[skuname] = copy.deepcopy(PcdObj.SkuInfoList[nextskuid])\r
2503 PcdObj.SkuInfoList[skuname].SkuId = skuid\r
2504 PcdObj.SkuInfoList[skuname].SkuIdName = skuname\r
2505 if PcdType in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
2506 PcdObj.DefaultValue = PcdObj.SkuInfoList.values()[0].HiiDefaultValue if self.SkuIdMgr.SkuUsageType == self.SkuIdMgr.SINGLE else PcdObj.SkuInfoList[TAB_DEFAULT].HiiDefaultValue\r
2507 Pcds[PcdCName, TokenSpaceGuid]= PcdObj\r
2508 return Pcds\r
2509 ## Retrieve dynamic HII PCD settings\r
2510 #\r
2511 # @param Type PCD type\r
2512 #\r
2513 # @retval a dict object contains settings of given PCD type\r
2514 #\r
2515 def _GetDynamicHiiPcd(self, Type):\r
2516\r
2517 VariableAttrs = {}\r
2518\r
2519 Pcds = OrderedDict()\r
2520 #\r
2521 # tdict is a special dict kind of type, used for selecting correct\r
2522 # PCD settings for certain ARCH and SKU\r
2523 #\r
2524 PcdDict = tdict(True, 5)\r
2525 PcdSet = set()\r
2526 RecordList = self._RawData[Type, self._Arch]\r
2527 # Find out all possible PCD candidates for self._Arch\r
2528 AvailableSkuIdSet = copy.copy(self.SkuIds)\r
2529 DefaultStoresDefine = self._GetDefaultStores()\r
2530\r
2531 for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, DefaultStore, Dummy4, Dummy5 in RecordList:\r
2532 SkuName = SkuName.upper()\r
2533 SkuName = TAB_DEFAULT if SkuName == TAB_COMMON else SkuName\r
2534 DefaultStore = DefaultStore.upper()\r
2535 if DefaultStore == TAB_COMMON:\r
2536 DefaultStore = TAB_DEFAULT_STORES_DEFAULT\r
2537 if SkuName not in AvailableSkuIdSet:\r
2538 EdkLogger.error('build', PARAMETER_INVALID, 'Sku %s is not defined in [SkuIds] section' % SkuName,\r
2539 File=self.MetaFile, Line=Dummy5)\r
2540 if DefaultStore not in DefaultStoresDefine:\r
2541 EdkLogger.error('build', PARAMETER_INVALID, 'DefaultStores %s is not defined in [DefaultStores] section' % DefaultStore,\r
2542 File=self.MetaFile, Line=Dummy5)\r
2543 if "." not in TokenSpaceGuid:\r
2544 PcdSet.add((PcdCName, TokenSpaceGuid, SkuName, DefaultStore, Dummy5))\r
2545 PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid, DefaultStore] = Setting\r
2546\r
2547\r
2548 # Remove redundant PCD candidates, per the ARCH and SKU\r
2549 for PcdCName, TokenSpaceGuid, SkuName, DefaultStore, Dummy4 in PcdSet:\r
2550\r
2551 Setting = PcdDict[self._Arch, SkuName, PcdCName, TokenSpaceGuid, DefaultStore]\r
2552 if Setting is None:\r
2553 continue\r
2554 VariableName, VariableGuid, VariableOffset, DefaultValue, VarAttribute = self._ValidatePcd(PcdCName, TokenSpaceGuid, Setting, Type, Dummy4)\r
2555\r
2556 rt, Msg = VariableAttributes.ValidateVarAttributes(VarAttribute)\r
2557 if not rt:\r
2558 EdkLogger.error("build", PCD_VARIABLE_ATTRIBUTES_ERROR, "Variable attributes settings for %s is incorrect.\n %s" % (".".join((TokenSpaceGuid, PcdCName)), Msg),\r
2559 ExtraData="[%s]" % VarAttribute)\r
2560 ExceedMax = False\r
2561 FormatCorrect = True\r
2562 if VariableOffset.isdigit():\r
2563 if int(VariableOffset, 10) > 0xFFFF:\r
2564 ExceedMax = True\r
2565 elif variablePattern.match(VariableOffset):\r
2566 if int(VariableOffset, 16) > 0xFFFF:\r
2567 ExceedMax = True\r
2568 # For Offset written in "A.B"\r
2569 elif VariableOffset.find('.') > -1:\r
2570 VariableOffsetList = VariableOffset.split(".")\r
2571 if not (len(VariableOffsetList) == 2\r
2572 and IsValidWord(VariableOffsetList[0])\r
2573 and IsValidWord(VariableOffsetList[1])):\r
2574 FormatCorrect = False\r
2575 else:\r
2576 FormatCorrect = False\r
2577 if not FormatCorrect:\r
2578 EdkLogger.error('Build', FORMAT_INVALID, "Invalid syntax or format of the variable offset value is incorrect for %s." % ".".join((TokenSpaceGuid, PcdCName)))\r
2579\r
2580 if ExceedMax:\r
2581 EdkLogger.error('Build', OPTION_VALUE_INVALID, "The variable offset value must not exceed the maximum value of 0xFFFF (UINT16) for %s." % ".".join((TokenSpaceGuid, PcdCName)))\r
2582 if (VariableName, VariableGuid) not in VariableAttrs:\r
2583 VariableAttrs[(VariableName, VariableGuid)] = VarAttribute\r
2584 else:\r
2585 if not DscBuildData.CompareVarAttr(VariableAttrs[(VariableName, VariableGuid)], VarAttribute):\r
2586 EdkLogger.error('Build', PCD_VARIABLE_ATTRIBUTES_CONFLICT_ERROR, "The variable %s.%s for DynamicHii PCDs has conflicting attributes [%s] and [%s] " % (VariableGuid, VariableName, VarAttribute, VariableAttrs[(VariableName, VariableGuid)]))\r
2587\r
2588 pcdDecObject = self._DecPcds[PcdCName, TokenSpaceGuid]\r
2589 if (PcdCName, TokenSpaceGuid) in Pcds:\r
2590 pcdObject = Pcds[PcdCName, TokenSpaceGuid]\r
2591 if SkuName in pcdObject.SkuInfoList:\r
2592 Skuitem = pcdObject.SkuInfoList[SkuName]\r
2593 Skuitem.DefaultStoreDict.update({DefaultStore:DefaultValue})\r
2594 else:\r
2595 SkuInfo = SkuInfoClass(SkuName, self.SkuIds[SkuName][0], VariableName, VariableGuid, VariableOffset, DefaultValue, VariableAttribute=VarAttribute, DefaultStore={DefaultStore:DefaultValue})\r
2596 pcdObject.SkuInfoList[SkuName] = SkuInfo\r
2597 else:\r
2598 SkuInfo = SkuInfoClass(SkuName, self.SkuIds[SkuName][0], VariableName, VariableGuid, VariableOffset, DefaultValue, VariableAttribute=VarAttribute, DefaultStore={DefaultStore:DefaultValue})\r
2599 Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject(\r
2600 PcdCName,\r
2601 TokenSpaceGuid,\r
2602 self._PCD_TYPE_STRING_[Type],\r
2603 '',\r
2604 DefaultValue,\r
2605 '',\r
2606 '',\r
2607 {SkuName : SkuInfo},\r
2608 False,\r
2609 None,\r
2610 pcdDecObject.validateranges,\r
2611 pcdDecObject.validlists,\r
2612 pcdDecObject.expressions,\r
2613 IsDsc=True)\r
2614\r
2615\r
2616 for pcd in Pcds.values():\r
2617 SkuInfoObj = pcd.SkuInfoList.values()[0]\r
2618 pcdDecObject = self._DecPcds[pcd.TokenCName, pcd.TokenSpaceGuidCName]\r
2619 pcd.DatumType = pcdDecObject.DatumType\r
2620 # Only fix the value while no value provided in DSC file.\r
2621 for sku in pcd.SkuInfoList.values():\r
2622 if (sku.HiiDefaultValue == "" or sku.HiiDefaultValue is None):\r
2623 sku.HiiDefaultValue = pcdDecObject.DefaultValue\r
2624 for default_store in sku.DefaultStoreDict:\r
2625 sku.DefaultStoreDict[default_store]=pcdDecObject.DefaultValue\r
2626 pcd.DefaultValue = pcdDecObject.DefaultValue\r
2627 if TAB_DEFAULT not in pcd.SkuInfoList and TAB_COMMON not in pcd.SkuInfoList:\r
2628 valuefromDec = pcdDecObject.DefaultValue\r
2629 SkuInfo = SkuInfoClass(TAB_DEFAULT, '0', SkuInfoObj.VariableName, SkuInfoObj.VariableGuid, SkuInfoObj.VariableOffset, valuefromDec, VariableAttribute=SkuInfoObj.VariableAttribute, DefaultStore={DefaultStore:valuefromDec})\r
2630 pcd.SkuInfoList[TAB_DEFAULT] = SkuInfo\r
2631 elif TAB_DEFAULT not in pcd.SkuInfoList and TAB_COMMON in pcd.SkuInfoList:\r
2632 pcd.SkuInfoList[TAB_DEFAULT] = pcd.SkuInfoList[TAB_COMMON]\r
2633 del pcd.SkuInfoList[TAB_COMMON]\r
2634 elif TAB_DEFAULT in pcd.SkuInfoList and TAB_COMMON in pcd.SkuInfoList:\r
2635 del pcd.SkuInfoList[TAB_COMMON]\r
2636\r
2637 if pcd.MaxDatumSize.strip():\r
2638 MaxSize = int(pcd.MaxDatumSize, 0)\r
2639 else:\r
2640 MaxSize = 0\r
2641 if pcd.DatumType not in TAB_PCD_NUMERIC_TYPES:\r
2642 for (_, skuobj) in pcd.SkuInfoList.items():\r
2643 datalen = 0\r
2644 skuobj.HiiDefaultValue = StringToArray(skuobj.HiiDefaultValue)\r
2645 datalen = len(skuobj.HiiDefaultValue.split(","))\r
2646 if datalen > MaxSize:\r
2647 MaxSize = datalen\r
2648 for defaultst in skuobj.DefaultStoreDict:\r
2649 skuobj.DefaultStoreDict[defaultst] = StringToArray(skuobj.DefaultStoreDict[defaultst])\r
2650 pcd.DefaultValue = StringToArray(pcd.DefaultValue)\r
2651 pcd.MaxDatumSize = str(MaxSize)\r
2652 rt, invalidhii = DscBuildData.CheckVariableNameAssignment(Pcds)\r
2653 if not rt:\r
2654 invalidpcd = ",".join(invalidhii)\r
2655 EdkLogger.error('build', PCD_VARIABLE_INFO_ERROR, Message='The same HII PCD must map to the same EFI variable for all SKUs', File=self.MetaFile, ExtraData=invalidpcd)\r
2656\r
2657 map(self.FilterSkuSettings, Pcds.values())\r
2658\r
2659 return Pcds\r
2660\r
2661 @staticmethod\r
2662 def CheckVariableNameAssignment(Pcds):\r
2663 invalidhii = []\r
2664 for pcdname in Pcds:\r
2665 pcd = Pcds[pcdname]\r
2666 varnameset = set(sku.VariableName for (skuid, sku) in pcd.SkuInfoList.items())\r
2667 if len(varnameset) > 1:\r
2668 invalidhii.append(".".join((pcdname[1], pcdname[0])))\r
2669 if len(invalidhii):\r
2670 return False, invalidhii\r
2671 else:\r
2672 return True, []\r
2673 ## Retrieve dynamic VPD PCD settings\r
2674 #\r
2675 # @param Type PCD type\r
2676 #\r
2677 # @retval a dict object contains settings of given PCD type\r
2678 #\r
2679 def _GetDynamicVpdPcd(self, Type):\r
2680\r
2681\r
2682 Pcds = OrderedDict()\r
2683 #\r
2684 # tdict is a special dict kind of type, used for selecting correct\r
2685 # PCD settings for certain ARCH and SKU\r
2686 #\r
2687 PcdDict = tdict(True, 4)\r
2688 PcdList = []\r
2689\r
2690 # Find out all possible PCD candidates for self._Arch\r
2691 RecordList = self._RawData[Type, self._Arch]\r
2692 AvailableSkuIdSet = copy.copy(self.SkuIds)\r
2693\r
2694 for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, Dummy3, Dummy4, Dummy5 in RecordList:\r
2695 SkuName = SkuName.upper()\r
2696 SkuName = TAB_DEFAULT if SkuName == TAB_COMMON else SkuName\r
2697 if SkuName not in AvailableSkuIdSet:\r
2698 EdkLogger.error('build', PARAMETER_INVALID, 'Sku %s is not defined in [SkuIds] section' % SkuName,\r
2699 File=self.MetaFile, Line=Dummy5)\r
2700 if "." not in TokenSpaceGuid:\r
2701 PcdList.append((PcdCName, TokenSpaceGuid, SkuName, Dummy5))\r
2702 PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid] = Setting\r
2703\r
2704 # Remove redundant PCD candidates, per the ARCH and SKU\r
2705 for PcdCName, TokenSpaceGuid, SkuName, Dummy4 in PcdList:\r
2706 Setting = PcdDict[self._Arch, SkuName, PcdCName, TokenSpaceGuid]\r
2707 if Setting is None:\r
2708 continue\r
2709 #\r
2710 # For the VOID* type, it can have optional data of MaxDatumSize and InitialValue\r
2711 # For the Integer & Boolean type, the optional data can only be InitialValue.\r
2712 # At this point, we put all the data into the PcdClssObject for we don't know the PCD's datumtype\r
2713 # until the DEC parser has been called.\r
2714 #\r
2715 VpdOffset, MaxDatumSize, InitialValue = self._ValidatePcd(PcdCName, TokenSpaceGuid, Setting, Type, Dummy4)\r
2716 if MaxDatumSize:\r
2717 if int(MaxDatumSize, 0) > 0xFFFF:\r
2718 EdkLogger.error('build', FORMAT_INVALID, "The size value must not exceed the maximum value of 0xFFFF (UINT16) for %s." % ".".join((TokenSpaceGuid, PcdCName)),\r
2719 File=self.MetaFile, Line=Dummy4)\r
2720 if int(MaxDatumSize, 0) < 0:\r
2721 EdkLogger.error('build', FORMAT_INVALID, "The size value can't be set to negative value for %s." % ".".join((TokenSpaceGuid, PcdCName)),\r
2722 File=self.MetaFile, Line=Dummy4)\r
2723 SkuInfo = SkuInfoClass(SkuName, self.SkuIds[SkuName][0], '', '', '', '', VpdOffset, InitialValue)\r
2724 if (PcdCName, TokenSpaceGuid) in Pcds:\r
2725 pcdObject = Pcds[PcdCName, TokenSpaceGuid]\r
2726 pcdObject.SkuInfoList[SkuName] = SkuInfo\r
2727 if MaxDatumSize.strip():\r
2728 CurrentMaxSize = int(MaxDatumSize.strip(), 0)\r
2729 else:\r
2730 CurrentMaxSize = 0\r
2731 if pcdObject.MaxDatumSize:\r
2732 PcdMaxSize = int(pcdObject.MaxDatumSize, 0)\r
2733 else:\r
2734 PcdMaxSize = 0\r
2735 if CurrentMaxSize > PcdMaxSize:\r
2736 pcdObject.MaxDatumSize = str(CurrentMaxSize)\r
2737 else:\r
2738 Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject(\r
2739 PcdCName,\r
2740 TokenSpaceGuid,\r
2741 self._PCD_TYPE_STRING_[Type],\r
2742 '',\r
2743 InitialValue,\r
2744 '',\r
2745 MaxDatumSize,\r
2746 {SkuName : SkuInfo},\r
2747 False,\r
2748 None,\r
2749 IsDsc=True)\r
2750 for pcd in Pcds.values():\r
2751 SkuInfoObj = pcd.SkuInfoList.values()[0]\r
2752 pcdDecObject = self._DecPcds[pcd.TokenCName, pcd.TokenSpaceGuidCName]\r
2753 pcd.DatumType = pcdDecObject.DatumType\r
2754 # Only fix the value while no value provided in DSC file.\r
2755 for sku in pcd.SkuInfoList.values():\r
2756 if not sku.DefaultValue:\r
2757 sku.DefaultValue = pcdDecObject.DefaultValue\r
2758 if TAB_DEFAULT not in pcd.SkuInfoList and TAB_COMMON not in pcd.SkuInfoList:\r
2759 valuefromDec = pcdDecObject.DefaultValue\r
2760 SkuInfo = SkuInfoClass(TAB_DEFAULT, '0', '', '', '', '', SkuInfoObj.VpdOffset, valuefromDec)\r
2761 pcd.SkuInfoList[TAB_DEFAULT] = SkuInfo\r
2762 elif TAB_DEFAULT not in pcd.SkuInfoList and TAB_COMMON in pcd.SkuInfoList:\r
2763 pcd.SkuInfoList[TAB_DEFAULT] = pcd.SkuInfoList[TAB_COMMON]\r
2764 del pcd.SkuInfoList[TAB_COMMON]\r
2765 elif TAB_DEFAULT in pcd.SkuInfoList and TAB_COMMON in pcd.SkuInfoList:\r
2766 del pcd.SkuInfoList[TAB_COMMON]\r
2767\r
2768\r
2769 map(self.FilterSkuSettings, Pcds.values())\r
2770 return Pcds\r
2771\r
2772 ## Add external modules\r
2773 #\r
2774 # The external modules are mostly those listed in FDF file, which don't\r
2775 # need "build".\r
2776 #\r
2777 # @param FilePath The path of module description file\r
2778 #\r
2779 def AddModule(self, FilePath):\r
2780 FilePath = NormPath(FilePath)\r
2781 if FilePath not in self.Modules:\r
2782 Module = ModuleBuildClassObject()\r
2783 Module.MetaFile = FilePath\r
2784 self.Modules.append(Module)\r
2785\r
2786 def _GetToolChainFamily(self):\r
2787 self._ToolChainFamily = "MSFT"\r
2788 BuildConfigurationFile = os.path.normpath(os.path.join(GlobalData.gConfDirectory, "target.txt"))\r
2789 if os.path.isfile(BuildConfigurationFile) == True:\r
2790 TargetTxt = TargetTxtClassObject()\r
2791 TargetTxt.LoadTargetTxtFile(BuildConfigurationFile)\r
2792 ToolDefinitionFile = TargetTxt.TargetTxtDictionary[DataType.TAB_TAT_DEFINES_TOOL_CHAIN_CONF]\r
2793 if ToolDefinitionFile == '':\r
2794 ToolDefinitionFile = "tools_def.txt"\r
2795 ToolDefinitionFile = os.path.normpath(mws.join(self.WorkspaceDir, 'Conf', ToolDefinitionFile))\r
2796 if os.path.isfile(ToolDefinitionFile) == True:\r
2797 ToolDef = ToolDefClassObject()\r
2798 ToolDef.LoadToolDefFile(ToolDefinitionFile)\r
2799 ToolDefinition = ToolDef.ToolsDefTxtDatabase\r
2800 if TAB_TOD_DEFINES_FAMILY not in ToolDefinition \\r
2801 or self._Toolchain not in ToolDefinition[TAB_TOD_DEFINES_FAMILY] \\r
2802 or not ToolDefinition[TAB_TOD_DEFINES_FAMILY][self._Toolchain]:\r
2803 self._ToolChainFamily = "MSFT"\r
2804 else:\r
2805 self._ToolChainFamily = ToolDefinition[TAB_TOD_DEFINES_FAMILY][self._Toolchain]\r
2806 return self._ToolChainFamily\r
2807\r
2808 ## Add external PCDs\r
2809 #\r
2810 # The external PCDs are mostly those listed in FDF file to specify address\r
2811 # or offset information.\r
2812 #\r
2813 # @param Name Name of the PCD\r
2814 # @param Guid Token space guid of the PCD\r
2815 # @param Value Value of the PCD\r
2816 #\r
2817 def AddPcd(self, Name, Guid, Value):\r
2818 if (Name, Guid) not in self.Pcds:\r
2819 self.Pcds[Name, Guid] = PcdClassObject(Name, Guid, '', '', '', '', '', {}, False, None)\r
2820 self.Pcds[Name, Guid].DefaultValue = Value\r
2821 @property\r
2822 def DecPcds(self):\r
2823 if self._DecPcds is None:\r
2824 FdfInfList = []\r
2825 if GlobalData.gFdfParser:\r
2826 FdfInfList = GlobalData.gFdfParser.Profile.InfList\r
2827 PkgSet = set()\r
2828 for Inf in FdfInfList:\r
2829 ModuleFile = PathClass(NormPath(Inf), GlobalData.gWorkspace, Arch=self._Arch)\r
2830 if ModuleFile in self._Modules:\r
2831 continue\r
2832 ModuleData = self._Bdb[ModuleFile, self._Arch, self._Target, self._Toolchain]\r
2833 PkgSet.update(ModuleData.Packages)\r
2834 self._DecPcds, self._GuidDict = GetDeclaredPcd(self, self._Bdb, self._Arch, self._Target, self._Toolchain, PkgSet)\r
2835 return self._DecPcds\r
2836 _Macros = property(_GetMacros)\r
2837 Arch = property(_GetArch)\r
2838 Platform = property(_GetPlatformName)\r
2839 PlatformName = property(_GetPlatformName)\r
2840 Guid = property(_GetFileGuid)\r
2841 Version = property(_GetVersion)\r
2842 DscSpecification = property(_GetDscSpec)\r
2843 OutputDirectory = property(_GetOutpuDir)\r
2844 SupArchList = property(_GetSupArch)\r
2845 BuildTargets = property(_GetBuildTarget)\r
2846 SkuName = property(_GetSkuName, _SetSkuName)\r
2847 PcdInfoFlag = property(_GetPcdInfoFlag)\r
2848 VarCheckFlag = property(_GetVarCheckFlag)\r
2849 FlashDefinition = property(_GetFdfFile)\r
2850 Prebuild = property(_GetPrebuild)\r
2851 Postbuild = property(_GetPostbuild)\r
2852 BuildNumber = property(_GetBuildNumber)\r
2853 MakefileName = property(_GetMakefileName)\r
2854 BsBaseAddress = property(_GetBsBaseAddress)\r
2855 RtBaseAddress = property(_GetRtBaseAddress)\r
2856 LoadFixAddress = property(_GetLoadFixAddress)\r
2857 RFCLanguages = property(_GetRFCLanguages)\r
2858 ISOLanguages = property(_GetISOLanguages)\r
2859 VpdToolGuid = property(_GetVpdToolGuid)\r
2860 SkuIds = property(_GetSkuIds)\r
2861 Modules = property(_GetModules)\r
2862 LibraryInstances = property(_GetLibraryInstances)\r
2863 LibraryClasses = property(_GetLibraryClasses)\r
2864 Pcds = property(_GetPcds)\r
2865 BuildOptions = property(_GetBuildOptions)\r
2866 ToolChainFamily = property(_GetToolChainFamily)\r