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