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