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