]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/UPT/GenMetaFile/GenDecFile.py
BaseTools: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / BaseTools / Source / Python / UPT / GenMetaFile / GenDecFile.py
CommitLineData
4234283c
LG
1## @file GenDecFile.py\r
2#\r
3# This file contained the logical of transfer package object to DEC files.\r
4#\r
64285f15 5# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>\r
4234283c 6#\r
2e351cbe 7# SPDX-License-Identifier: BSD-2-Clause-Patent\r
4234283c
LG
8#\r
9\r
10'''\r
11GenDEC\r
12'''\r
421ccda3
HC
13import os\r
14import stat\r
15import codecs\r
fcb1af1b 16from hashlib import md5\r
421ccda3 17from Core.FileHook import __FileHookOpen__\r
4234283c
LG
18from Library.Parsing import GenSection\r
19from Library.CommentGenerating import GenHeaderCommentSection\r
20from Library.CommentGenerating import GenGenericCommentF\r
21from Library.CommentGenerating import GenDecTailComment\r
22from Library.CommentGenerating import _GetHelpStr\r
23from Library.Misc import GuidStringToGuidStructureString\r
24from Library.Misc import SaveFileOnChange\r
25from Library.Misc import ConvertPath\r
421ccda3 26from Library.Misc import GetLocalValue\r
4234283c
LG
27from Library.DataType import TAB_SPACE_SPLIT\r
28from Library.DataType import TAB_COMMA_SPLIT\r
421ccda3 29from Library.DataType import END_OF_LINE\r
4234283c 30from Library.DataType import TAB_ARCH_COMMON\r
421ccda3
HC
31from Library.DataType import TAB_VALUE_SPLIT\r
32from Library.DataType import TAB_COMMENT_SPLIT\r
33from Library.DataType import TAB_PCD_VALIDRANGE\r
34from Library.DataType import TAB_PCD_VALIDLIST\r
35from Library.DataType import TAB_PCD_EXPRESSION\r
4234283c
LG
36from Library.DataType import TAB_DEC_DEFINES_DEC_SPECIFICATION\r
37from Library.DataType import TAB_DEC_DEFINES_PACKAGE_NAME\r
38from Library.DataType import TAB_DEC_DEFINES_PACKAGE_GUID\r
39from Library.DataType import TAB_DEC_DEFINES_PACKAGE_VERSION\r
421ccda3
HC
40from Library.DataType import TAB_DEC_DEFINES_PKG_UNI_FILE\r
41from Library.DataType import TAB_DEC_PACKAGE_ABSTRACT\r
42from Library.DataType import TAB_DEC_PACKAGE_DESCRIPTION\r
43from Library.DataType import TAB_DEC_BINARY_ABSTRACT\r
44from Library.DataType import TAB_DEC_BINARY_DESCRIPTION\r
45from Library.DataType import TAB_LANGUAGE_EN_X\r
46from Library.DataType import TAB_BINARY_HEADER_USERID\r
47from Library.DataType import TAB_BINARY_HEADER_IDENTIFIER\r
48from Library.DataType import TAB_COMMENT_EDK1_SPLIT\r
49from Library.DataType import TAB_ENCODING_UTF16LE\r
50from Library.DataType import TAB_CAPHEX_START\r
51from Library.DataType import TAB_HEX_START\r
52from Library.DataType import TAB_UNDERLINE_SPLIT\r
53from Library.DataType import TAB_STR_TOKENERR\r
54from Library.DataType import TAB_STR_TOKENCNAME\r
55from Library.DataType import TAB_PCD_ERROR_SECTION_COMMENT\r
56from Library.DataType import TAB_PCD_ERROR\r
57from Library.DataType import TAB_SECTION_START\r
58from Library.DataType import TAB_SECTION_END\r
59from Library.DataType import TAB_SPLIT\r
645a5128 60import Library.DataType as DT\r
421ccda3 61from Library.UniClassObject import FormatUniEntry\r
64285f15 62from Library.StringUtils import GetUniFileName\r
4234283c
LG
63\r
64def GenPcd(Package, Content):\r
65 #\r
66 # generate [Pcd] section\r
f7496d71 67 # <TokenSpcCName>.<TokenCName>|<Value>|<DatumType>|<Token>\r
4234283c
LG
68 #\r
69 ValidUsageDict = {}\r
70 for Pcd in Package.GetPcdList():\r
71 #\r
72 # Generate generic comment\r
73 #\r
74 HelpTextList = Pcd.GetHelpTextList()\r
75 HelpStr = _GetHelpStr(HelpTextList)\r
76 CommentStr = GenGenericCommentF(HelpStr, 2)\r
f7496d71 77\r
421ccda3
HC
78 PromptList = Pcd.GetPromptList()\r
79 PromptStr = _GetHelpStr(PromptList)\r
80 CommentStr += GenGenericCommentF(PromptStr.strip(), 1, True)\r
f7496d71 81\r
4234283c 82 PcdErrList = Pcd.GetPcdErrorsList()\r
421ccda3
HC
83 for PcdErr in PcdErrList:\r
84 CommentStr += GenPcdErrComment(PcdErr)\r
4234283c 85 Statement = CommentStr\r
f7496d71 86\r
4234283c
LG
87 CName = Pcd.GetCName()\r
88 TokenSpaceGuidCName = Pcd.GetTokenSpaceGuidCName()\r
89 DefaultValue = Pcd.GetDefaultValue()\r
90 DatumType = Pcd.GetDatumType()\r
91 Token = Pcd.GetToken()\r
92 ValidUsage = Pcd.GetValidUsage()\r
93\r
94 if ValidUsage == 'FeaturePcd':\r
95 ValidUsage = 'PcdsFeatureFlag'\r
96 elif ValidUsage == 'PatchPcd':\r
97 ValidUsage = 'PcdsPatchableInModule'\r
98 elif ValidUsage == 'FixedPcd':\r
99 ValidUsage = 'PcdsFixedAtBuild'\r
100 elif ValidUsage == 'Pcd':\r
101 ValidUsage = 'PcdsDynamic'\r
102 elif ValidUsage == 'PcdEx':\r
103 ValidUsage = 'PcdsDynamicEx'\r
f7496d71 104\r
4234283c
LG
105 if ValidUsage in ValidUsageDict:\r
106 NewSectionDict = ValidUsageDict[ValidUsage]\r
107 else:\r
108 NewSectionDict = {}\r
109 ValidUsageDict[ValidUsage] = NewSectionDict\r
110 Statement += TokenSpaceGuidCName + '.' + CName\r
111 Statement += '|' + DefaultValue\r
112 Statement += '|' + DatumType\r
113 Statement += '|' + Token\r
114 #\r
115 # generate tail comment\r
116 #\r
117 if Pcd.GetSupModuleList():\r
118 Statement += GenDecTailComment(Pcd.GetSupModuleList())\r
119\r
0d1f5b2b 120 ArchList = sorted(Pcd.GetSupArchList())\r
4234283c
LG
121 SortedArch = ' '.join(ArchList)\r
122 if SortedArch in NewSectionDict:\r
123 NewSectionDict[SortedArch] = \\r
124 NewSectionDict[SortedArch] + [Statement]\r
125 else:\r
f7496d71
LG
126 NewSectionDict[SortedArch] = [Statement]\r
127\r
4234283c 128 for ValidUsage in ValidUsageDict:\r
421ccda3 129 Content += GenSection(ValidUsage, ValidUsageDict[ValidUsage], True, True)\r
f7496d71 130\r
4234283c
LG
131 return Content\r
132\r
421ccda3
HC
133def GenPcdErrorMsgSection(Package, Content):\r
134 if not Package.PcdErrorCommentDict:\r
135 return Content\r
f7496d71 136\r
421ccda3
HC
137 #\r
138 # Generate '# [Error.<TokenSpcCName>]' section\r
139 #\r
140 Content += END_OF_LINE + END_OF_LINE\r
141 SectionComment = TAB_COMMENT_SPLIT + END_OF_LINE\r
142 SectionComment += TAB_COMMENT_SPLIT + TAB_SPACE_SPLIT + TAB_PCD_ERROR_SECTION_COMMENT + END_OF_LINE\r
143 SectionComment += TAB_COMMENT_SPLIT + END_OF_LINE\r
144 TokenSpcCNameList = []\r
f7496d71 145\r
421ccda3
HC
146 #\r
147 # Get TokenSpcCName list in PcdErrorCommentDict in Package object\r
148 #\r
149 for (TokenSpcCName, ErrorNumber) in Package.PcdErrorCommentDict:\r
150 if TokenSpcCName not in TokenSpcCNameList:\r
151 TokenSpcCNameList.append(TokenSpcCName)\r
f7496d71 152\r
421ccda3
HC
153 for TokenSpcCNameItem in TokenSpcCNameList:\r
154 SectionName = TAB_COMMENT_SPLIT + TAB_SPACE_SPLIT + TAB_SECTION_START + TAB_PCD_ERROR + \\r
155 TAB_SPLIT + TokenSpcCNameItem + TAB_SECTION_END + END_OF_LINE\r
156 Content += SectionComment\r
157 Content += SectionName\r
158 for (TokenSpcCName, ErrorNumber) in Package.PcdErrorCommentDict:\r
159 if TokenSpcCNameItem == TokenSpcCName:\r
160 PcdErrorMsg = GetLocalValue(Package.PcdErrorCommentDict[(TokenSpcCName, ErrorNumber)])\r
161 SectionItem = TAB_COMMENT_SPLIT + TAB_SPACE_SPLIT + TAB_SPACE_SPLIT + \\r
162 ErrorNumber + TAB_SPACE_SPLIT + TAB_VALUE_SPLIT + TAB_SPACE_SPLIT + \\r
163 PcdErrorMsg + END_OF_LINE\r
164 Content += SectionItem\r
f7496d71 165\r
421ccda3
HC
166 Content += TAB_COMMENT_SPLIT\r
167 return Content\r
f7496d71 168\r
4234283c
LG
169def GenGuidProtocolPpi(Package, Content):\r
170 #\r
171 # generate [Guids] section\r
172 #\r
173 NewSectionDict = {}\r
421ccda3
HC
174\r
175 LeftOffset = 46\r
176 # Get the line offset need\r
177 # If the real one < the min one, use the min one\r
178 # else use the real one\r
179 for Guid in Package.GetGuidList():\r
180 if len(Guid.GetCName()) > LeftOffset:\r
181 LeftOffset = len(Guid.GetCName())\r
182\r
183 # Generate\r
4234283c
LG
184 for Guid in Package.GetGuidList():\r
185 #\r
186 # Generate generic comment\r
187 #\r
188 HelpTextList = Guid.GetHelpTextList()\r
189 HelpStr = _GetHelpStr(HelpTextList)\r
190 CommentStr = GenGenericCommentF(HelpStr, 2)\r
191\r
192 Statement = CommentStr\r
193 CName = Guid.GetCName()\r
194 Value = GuidStringToGuidStructureString(Guid.GetGuid())\r
421ccda3 195 Statement += CName.ljust(LeftOffset) + ' = ' + Value\r
4234283c
LG
196 #\r
197 # generate tail comment\r
198 #\r
199 if Guid.GetSupModuleList():\r
f7496d71 200 Statement += GenDecTailComment(Guid.GetSupModuleList())\r
0d1f5b2b 201 ArchList = sorted(Guid.GetSupArchList())\r
4234283c
LG
202 SortedArch = ' '.join(ArchList)\r
203 if SortedArch in NewSectionDict:\r
204 NewSectionDict[SortedArch] = \\r
205 NewSectionDict[SortedArch] + [Statement]\r
206 else:\r
f7496d71 207 NewSectionDict[SortedArch] = [Statement]\r
4234283c 208\r
421ccda3 209 Content += GenSection('Guids', NewSectionDict, True, True)\r
f7496d71 210\r
4234283c
LG
211 #\r
212 # generate [Protocols] section\r
213 #\r
214 NewSectionDict = {}\r
421ccda3
HC
215 LeftOffset = 46\r
216 # Get the line offset need\r
217 # If the real one < the min one, use the min one\r
218 # else use the real one\r
219 for Protocol in Package.GetProtocolList():\r
220 if len(Protocol.GetCName()) > LeftOffset:\r
221 LeftOffset = len(Protocol.GetCName())\r
222\r
4234283c
LG
223 for Protocol in Package.GetProtocolList():\r
224 #\r
225 # Generate generic comment\r
226 #\r
227 HelpTextList = Protocol.GetHelpTextList()\r
228 HelpStr = _GetHelpStr(HelpTextList)\r
f7496d71 229 CommentStr = GenGenericCommentF(HelpStr, 2)\r
4234283c 230\r
f7496d71 231 Statement = CommentStr\r
4234283c
LG
232 CName = Protocol.GetCName()\r
233 Value = GuidStringToGuidStructureString(Protocol.GetGuid())\r
421ccda3 234 Statement += CName.ljust(LeftOffset) + ' = ' + Value\r
4234283c
LG
235\r
236 #\r
237 # generate tail comment\r
238 #\r
239 if Protocol.GetSupModuleList():\r
240 Statement += GenDecTailComment(Protocol.GetSupModuleList())\r
0d1f5b2b 241 ArchList = sorted(Protocol.GetSupArchList())\r
4234283c
LG
242 SortedArch = ' '.join(ArchList)\r
243 if SortedArch in NewSectionDict:\r
244 NewSectionDict[SortedArch] = \\r
245 NewSectionDict[SortedArch] + [Statement]\r
246 else:\r
f7496d71 247 NewSectionDict[SortedArch] = [Statement]\r
4234283c 248\r
f7496d71 249 Content += GenSection('Protocols', NewSectionDict, True, True)\r
4234283c
LG
250\r
251 #\r
252 # generate [Ppis] section\r
253 #\r
254 NewSectionDict = {}\r
421ccda3
HC
255 LeftOffset = 46\r
256 # Get the line offset need\r
257 # If the real one < the min one, use the min one\r
258 # else use the real one\r
259 for Ppi in Package.GetPpiList():\r
260 if len(Ppi.GetCName()) > LeftOffset:\r
261 LeftOffset = len(Ppi.GetCName())\r
262\r
4234283c
LG
263 for Ppi in Package.GetPpiList():\r
264 #\r
265 # Generate generic comment\r
266 #\r
267 HelpTextList = Ppi.GetHelpTextList()\r
268 HelpStr = _GetHelpStr(HelpTextList)\r
269 CommentStr = GenGenericCommentF(HelpStr, 2)\r
270\r
271 Statement = CommentStr\r
272 CName = Ppi.GetCName()\r
273 Value = GuidStringToGuidStructureString(Ppi.GetGuid())\r
421ccda3 274 Statement += CName.ljust(LeftOffset) + ' = ' + Value\r
4234283c
LG
275\r
276 #\r
277 # generate tail comment\r
278 #\r
279 if Ppi.GetSupModuleList():\r
280 Statement += GenDecTailComment(Ppi.GetSupModuleList())\r
0d1f5b2b 281 ArchList = sorted(Ppi.GetSupArchList())\r
4234283c
LG
282 SortedArch = ' '.join(ArchList)\r
283 if SortedArch in NewSectionDict:\r
284 NewSectionDict[SortedArch] = \\r
285 NewSectionDict[SortedArch] + [Statement]\r
286 else:\r
f7496d71 287 NewSectionDict[SortedArch] = [Statement]\r
4234283c 288\r
421ccda3 289 Content += GenSection('Ppis', NewSectionDict, True, True)\r
f7496d71 290\r
4234283c
LG
291 return Content\r
292\r
293## Transfer Package Object to Dec files\r
294#\r
f7496d71 295# Transfer all contents of a standard Package Object to a Dec file\r
4234283c 296#\r
f7496d71 297# @param Package: A Package\r
4234283c 298#\r
421ccda3 299def PackageToDec(Package, DistHeader = None):\r
4234283c
LG
300 #\r
301 # Init global information for the file\r
302 #\r
303 ContainerFile = Package.GetFullPath()\r
f7496d71 304\r
4234283c 305 Content = ''\r
f7496d71 306\r
4234283c 307 #\r
f7496d71 308 # Generate file header\r
4234283c 309 #\r
421ccda3
HC
310 PackageAbstract = GetLocalValue(Package.GetAbstract())\r
311 PackageDescription = GetLocalValue(Package.GetDescription())\r
312 PackageCopyright = ''\r
313 PackageLicense = ''\r
314 for (Lang, Copyright) in Package.GetCopyright():\r
315 if Lang:\r
316 pass\r
317 PackageCopyright = Copyright\r
318 for (Lang, License) in Package.GetLicense():\r
319 if Lang:\r
320 pass\r
321 PackageLicense = License\r
322 if not PackageAbstract and DistHeader:\r
323 PackageAbstract = GetLocalValue(DistHeader.GetAbstract())\r
324 if not PackageDescription and DistHeader:\r
325 PackageDescription = GetLocalValue(DistHeader.GetDescription())\r
326 if not PackageCopyright and DistHeader:\r
327 for (Lang, Copyright) in DistHeader.GetCopyright():\r
328 PackageCopyright = Copyright\r
329 if not PackageLicense and DistHeader:\r
330 for (Lang, License) in DistHeader.GetLicense():\r
331 PackageLicense = License\r
f7496d71 332\r
421ccda3
HC
333 #\r
334 # Generate header comment section of DEC file\r
335 #\r
336 Content += GenHeaderCommentSection(PackageAbstract, \\r
337 PackageDescription, \\r
338 PackageCopyright, \\r
875cc5bb 339 PackageLicense).replace('\r\n', '\n')\r
421ccda3
HC
340\r
341 #\r
f7496d71 342 # Generate Binary header\r
421ccda3
HC
343 #\r
344 for UserExtension in Package.GetUserExtensionList():\r
345 if UserExtension.GetUserID() == TAB_BINARY_HEADER_USERID \\r
346 and UserExtension.GetIdentifier() == TAB_BINARY_HEADER_IDENTIFIER:\r
347 PackageBinaryAbstract = GetLocalValue(UserExtension.GetBinaryAbstract())\r
348 PackageBinaryDescription = GetLocalValue(UserExtension.GetBinaryDescription())\r
349 PackageBinaryCopyright = ''\r
350 PackageBinaryLicense = ''\r
351 for (Lang, Copyright) in UserExtension.GetBinaryCopyright():\r
352 PackageBinaryCopyright = Copyright\r
353 for (Lang, License) in UserExtension.GetBinaryLicense():\r
f7496d71 354 PackageBinaryLicense = License\r
421ccda3
HC
355 if PackageBinaryAbstract and PackageBinaryDescription and \\r
356 PackageBinaryCopyright and PackageBinaryLicense:\r
f7496d71
LG
357 Content += GenHeaderCommentSection(PackageBinaryAbstract,\r
358 PackageBinaryDescription,\r
359 PackageBinaryCopyright,\r
421ccda3
HC
360 PackageBinaryLicense,\r
361 True)\r
362\r
363 #\r
364 # Generate PACKAGE_UNI_FILE for the Package\r
365 #\r
366 FileHeader = GenHeaderCommentSection(PackageAbstract, PackageDescription, PackageCopyright, PackageLicense, False, \\r
367 TAB_COMMENT_EDK1_SPLIT)\r
368 GenPackageUNIEncodeFile(Package, FileHeader)\r
369\r
4234283c 370 #\r
f7496d71 371 # for each section, maintain a dict, sorted arch will be its key,\r
4234283c
LG
372 #statement list will be its data\r
373 # { 'Arch1 Arch2 Arch3': [statement1, statement2],\r
f7496d71 374 # 'Arch1' : [statement1, statement3]\r
4234283c
LG
375 # }\r
376 #\r
f7496d71 377\r
4234283c 378 #\r
f7496d71 379 # generate [Defines] section\r
4234283c 380 #\r
421ccda3 381 LeftOffset = 31\r
4234283c
LG
382 NewSectionDict = {TAB_ARCH_COMMON : []}\r
383 SpecialItemList = []\r
f7496d71 384\r
421ccda3 385 Statement = (u'%s ' % TAB_DEC_DEFINES_DEC_SPECIFICATION).ljust(LeftOffset) + u'= %s' % '0x00010017'\r
4234283c 386 SpecialItemList.append(Statement)\r
f7496d71 387\r
4234283c
LG
388 BaseName = Package.GetBaseName()\r
389 if BaseName.startswith('.') or BaseName.startswith('-'):\r
390 BaseName = '_' + BaseName\r
421ccda3 391 Statement = (u'%s ' % TAB_DEC_DEFINES_PACKAGE_NAME).ljust(LeftOffset) + u'= %s' % BaseName\r
4234283c 392 SpecialItemList.append(Statement)\r
421ccda3
HC
393\r
394 Statement = (u'%s ' % TAB_DEC_DEFINES_PACKAGE_VERSION).ljust(LeftOffset) + u'= %s' % Package.GetVersion()\r
4234283c 395 SpecialItemList.append(Statement)\r
421ccda3
HC
396\r
397 Statement = (u'%s ' % TAB_DEC_DEFINES_PACKAGE_GUID).ljust(LeftOffset) + u'= %s' % Package.GetGuid()\r
398 SpecialItemList.append(Statement)\r
399\r
400 if Package.UNIFlag:\r
401 Statement = (u'%s ' % TAB_DEC_DEFINES_PKG_UNI_FILE).ljust(LeftOffset) + u'= %s' % Package.GetBaseName() + '.uni'\r
f7496d71 402 SpecialItemList.append(Statement)\r
421ccda3 403\r
4234283c
LG
404 for SortedArch in NewSectionDict:\r
405 NewSectionDict[SortedArch] = \\r
406 NewSectionDict[SortedArch] + SpecialItemList\r
407 Content += GenSection('Defines', NewSectionDict)\r
408\r
409 #\r
410 # generate [Includes] section\r
411 #\r
412 NewSectionDict = {}\r
413 IncludeArchList = Package.GetIncludeArchList()\r
f7496d71 414 if IncludeArchList:\r
4234283c
LG
415 for Path, ArchList in IncludeArchList:\r
416 Statement = Path\r
417 ArchList.sort()\r
418 SortedArch = ' '.join(ArchList)\r
419 if SortedArch in NewSectionDict:\r
420 NewSectionDict[SortedArch] = \\r
421 NewSectionDict[SortedArch] + [ConvertPath(Statement)]\r
422 else:\r
423 NewSectionDict[SortedArch] = [ConvertPath(Statement)]\r
424\r
421ccda3 425 Content += GenSection('Includes', NewSectionDict)\r
4234283c 426\r
421ccda3
HC
427 #\r
428 # generate [guids][protocols][ppis] sections\r
429 #\r
4234283c
LG
430 Content = GenGuidProtocolPpi(Package, Content)\r
431\r
432 #\r
433 # generate [LibraryClasses] section\r
434 #\r
435 NewSectionDict = {}\r
436 for LibraryClass in Package.GetLibraryClassList():\r
437 #\r
438 # Generate generic comment\r
439 #\r
440 HelpTextList = LibraryClass.GetHelpTextList()\r
441 HelpStr = _GetHelpStr(HelpTextList)\r
442 if HelpStr:\r
421ccda3
HC
443 HelpStr = '@libraryclass' + HelpStr\r
444 CommentStr = GenGenericCommentF(HelpStr, 2, False, True)\r
4234283c
LG
445\r
446 Statement = CommentStr\r
447 Name = LibraryClass.GetLibraryClass()\r
448 IncludeHeader = LibraryClass.GetIncludeHeader()\r
449 Statement += Name + '|' + ConvertPath(IncludeHeader)\r
450 #\r
451 # generate tail comment\r
452 #\r
453 if LibraryClass.GetSupModuleList():\r
454 Statement += \\r
455 GenDecTailComment(LibraryClass.GetSupModuleList())\r
0d1f5b2b 456 ArchList = sorted(LibraryClass.GetSupArchList())\r
4234283c
LG
457 SortedArch = ' '.join(ArchList)\r
458 if SortedArch in NewSectionDict:\r
459 NewSectionDict[SortedArch] = \\r
460 NewSectionDict[SortedArch] + [Statement]\r
461 else:\r
f7496d71 462 NewSectionDict[SortedArch] = [Statement]\r
4234283c 463\r
421ccda3 464 Content += GenSection('LibraryClasses', NewSectionDict, True, True)\r
4234283c 465\r
421ccda3
HC
466 #\r
467 # Generate '# [Error.<TokenSpcCName>]' section\r
468 #\r
469 Content = GenPcdErrorMsgSection(Package, Content)\r
f7496d71 470\r
421ccda3
HC
471 Content = GenPcd(Package, Content)\r
472\r
4234283c
LG
473 #\r
474 # generate [UserExtensions] section\r
475 #\r
476 NewSectionDict = {}\r
477 for UserExtension in Package.GetUserExtensionList():\r
421ccda3
HC
478 if UserExtension.GetUserID() == TAB_BINARY_HEADER_USERID and \\r
479 UserExtension.GetIdentifier() == TAB_BINARY_HEADER_IDENTIFIER:\r
480 continue\r
645a5128
HC
481\r
482 # Generate Private Section first\r
483 if UserExtension.GetUserID() == DT.TAB_INTEL and UserExtension.GetIdentifier() == DT.TAB_PRIVATE:\r
484 Content += '\n' + UserExtension.GetStatement()\r
485 continue\r
486\r
4234283c
LG
487 Statement = UserExtension.GetStatement()\r
488 if not Statement:\r
489 continue\r
421ccda3
HC
490 else:\r
491 LineList = Statement.split('\n')\r
492 NewStatement = ""\r
493 for Line in LineList:\r
494 NewStatement += " %s\n" % Line\r
f7496d71 495\r
4234283c
LG
496 SectionList = []\r
497 SectionName = 'UserExtensions'\r
498 UserId = UserExtension.GetUserID()\r
499 if UserId:\r
500 if '.' in UserId:\r
501 UserId = '"' + UserId + '"'\r
502 SectionName += '.' + UserId\r
503 if UserExtension.GetIdentifier():\r
504 SectionName += '.' + '"' + UserExtension.GetIdentifier() + '"'\r
505 if not UserExtension.GetSupArchList():\r
506 SectionList.append(SectionName)\r
507 else:\r
508 for Arch in UserExtension.GetSupArchList():\r
509 SectionList.append(SectionName + '.' + Arch)\r
510 SectionName = ', '.join(SectionList)\r
511 SectionName = ''.join(['[', SectionName, ']\n'])\r
421ccda3 512 Content += '\n' + SectionName + NewStatement\r
4234283c
LG
513\r
514 SaveFileOnChange(ContainerFile, Content, False)\r
421ccda3
HC
515 if DistHeader.ReadOnly:\r
516 os.chmod(ContainerFile, stat.S_IRUSR|stat.S_IRGRP|stat.S_IROTH)\r
517 else:\r
518 os.chmod(ContainerFile, stat.S_IRUSR|stat.S_IRGRP|stat.S_IROTH|stat.S_IWUSR|stat.S_IWGRP|stat.S_IWOTH)\r
4234283c
LG
519 return ContainerFile\r
520\r
421ccda3
HC
521## GenPackageUNIEncodeFile\r
522# GenPackageUNIEncodeFile, default is a UCS-2LE encode file\r
523#\r
524def GenPackageUNIEncodeFile(PackageObject, UniFileHeader = '', Encoding=TAB_ENCODING_UTF16LE):\r
525 GenUNIFlag = False\r
526 OnlyLANGUAGE_EN_X = True\r
527 BinaryAbstract = []\r
528 BinaryDescription = []\r
529 #\r
f7496d71 530 # If more than one language code is used for any element that would be present in the PACKAGE_UNI_FILE,\r
421ccda3
HC
531 # then the PACKAGE_UNI_FILE must be created.\r
532 #\r
533 for (Key, Value) in PackageObject.GetAbstract() + PackageObject.GetDescription():\r
534 if Key == TAB_LANGUAGE_EN_X:\r
535 GenUNIFlag = True\r
536 else:\r
537 OnlyLANGUAGE_EN_X = False\r
f7496d71 538\r
421ccda3
HC
539 for UserExtension in PackageObject.GetUserExtensionList():\r
540 if UserExtension.GetUserID() == TAB_BINARY_HEADER_USERID \\r
541 and UserExtension.GetIdentifier() == TAB_BINARY_HEADER_IDENTIFIER:\r
542 for (Key, Value) in UserExtension.GetBinaryAbstract():\r
543 if Key == TAB_LANGUAGE_EN_X:\r
544 GenUNIFlag = True\r
545 else:\r
546 OnlyLANGUAGE_EN_X = False\r
547 BinaryAbstract.append((Key, Value))\r
548\r
549 for (Key, Value) in UserExtension.GetBinaryDescription():\r
550 if Key == TAB_LANGUAGE_EN_X:\r
551 GenUNIFlag = True\r
552 else:\r
553 OnlyLANGUAGE_EN_X = False\r
554 BinaryDescription.append((Key, Value))\r
555\r
556 for Pcd in PackageObject.GetPcdList():\r
557 for TxtObj in Pcd.GetPromptList() + Pcd.GetHelpTextList():\r
558 if TxtObj.GetLang() == TAB_LANGUAGE_EN_X:\r
559 GenUNIFlag = True\r
560 else:\r
561 OnlyLANGUAGE_EN_X = False\r
f7496d71 562\r
421ccda3
HC
563 for PcdError in Pcd.GetPcdErrorsList():\r
564 if PcdError.GetErrorNumber().startswith('0x') or PcdError.GetErrorNumber().startswith('0X'):\r
565 for (Key, Value) in PcdError.GetErrorMessageList():\r
566 if Key == TAB_LANGUAGE_EN_X:\r
567 GenUNIFlag = True\r
568 else:\r
569 OnlyLANGUAGE_EN_X = False\r
570 if not GenUNIFlag:\r
571 return\r
572 elif OnlyLANGUAGE_EN_X:\r
573 return\r
574 else:\r
575 PackageObject.UNIFlag = True\r
f7496d71 576\r
421ccda3
HC
577 if not os.path.exists(os.path.dirname(PackageObject.GetFullPath())):\r
578 os.makedirs(os.path.dirname(PackageObject.GetFullPath()))\r
f7496d71 579\r
06eb3540
HC
580 ContainerFile = GetUniFileName(os.path.dirname(PackageObject.GetFullPath()), PackageObject.GetBaseName())\r
581\r
1ccc4d89
LG
582 Content = UniFileHeader + '\r\n'\r
583 Content += '\r\n'\r
f7496d71 584\r
1ccc4d89 585 Content += FormatUniEntry('#string ' + TAB_DEC_PACKAGE_ABSTRACT, PackageObject.GetAbstract(), ContainerFile) + '\r\n'\r
f7496d71 586\r
421ccda3 587 Content += FormatUniEntry('#string ' + TAB_DEC_PACKAGE_DESCRIPTION, PackageObject.GetDescription(), ContainerFile) \\r
1ccc4d89 588 + '\r\n'\r
f7496d71 589\r
1ccc4d89 590 Content += FormatUniEntry('#string ' + TAB_DEC_BINARY_ABSTRACT, BinaryAbstract, ContainerFile) + '\r\n'\r
f7496d71 591\r
1ccc4d89 592 Content += FormatUniEntry('#string ' + TAB_DEC_BINARY_DESCRIPTION, BinaryDescription, ContainerFile) + '\r\n'\r
f7496d71 593\r
421ccda3 594 PromptGenList = []\r
f7496d71 595 HelpTextGenList = []\r
421ccda3
HC
596 for Pcd in PackageObject.GetPcdList():\r
597 # Generate Prompt for each Pcd\r
598 PcdPromptStrName = '#string ' + 'STR_' + Pcd.GetTokenSpaceGuidCName() + '_' + Pcd.GetCName() + '_PROMPT '\r
599 TokenValueList = []\r
600 for TxtObj in Pcd.GetPromptList():\r
601 Lang = TxtObj.GetLang()\r
602 PromptStr = TxtObj.GetString()\r
603 #\r
f7496d71 604 # Avoid generating the same PROMPT entry more than one time.\r
421ccda3
HC
605 #\r
606 if (PcdPromptStrName, Lang) not in PromptGenList:\r
607 TokenValueList.append((Lang, PromptStr))\r
608 PromptGenList.append((PcdPromptStrName, Lang))\r
1ccc4d89 609 PromptString = FormatUniEntry(PcdPromptStrName, TokenValueList, ContainerFile) + '\r\n'\r
421ccda3
HC
610 if PromptString not in Content:\r
611 Content += PromptString\r
f7496d71 612\r
421ccda3
HC
613 # Generate Help String for each Pcd\r
614 PcdHelpStrName = '#string ' + 'STR_' + Pcd.GetTokenSpaceGuidCName() + '_' + Pcd.GetCName() + '_HELP '\r
615 TokenValueList = []\r
616 for TxtObj in Pcd.GetHelpTextList():\r
617 Lang = TxtObj.GetLang()\r
618 HelpStr = TxtObj.GetString()\r
619 #\r
f7496d71 620 # Avoid generating the same HELP entry more than one time.\r
421ccda3
HC
621 #\r
622 if (PcdHelpStrName, Lang) not in HelpTextGenList:\r
623 TokenValueList.append((Lang, HelpStr))\r
624 HelpTextGenList.append((PcdHelpStrName, Lang))\r
1ccc4d89 625 HelpTextString = FormatUniEntry(PcdHelpStrName, TokenValueList, ContainerFile) + '\r\n'\r
421ccda3
HC
626 if HelpTextString not in Content:\r
627 Content += HelpTextString\r
f7496d71 628\r
421ccda3
HC
629 # Generate PcdError for each Pcd if ErrorNo exist.\r
630 for PcdError in Pcd.GetPcdErrorsList():\r
631 ErrorNo = PcdError.GetErrorNumber()\r
632 if ErrorNo.startswith(TAB_HEX_START) or ErrorNo.startswith(TAB_CAPHEX_START):\r
633 PcdErrStrName = '#string ' + TAB_STR_TOKENCNAME + TAB_UNDERLINE_SPLIT + Pcd.GetTokenSpaceGuidCName() \\r
634 + TAB_UNDERLINE_SPLIT + TAB_STR_TOKENERR \\r
635 + TAB_UNDERLINE_SPLIT + ErrorNo[2:]\r
1ccc4d89 636 PcdErrString = FormatUniEntry(PcdErrStrName, PcdError.GetErrorMessageList(), ContainerFile) + '\r\n'\r
421ccda3
HC
637 if PcdErrString not in Content:\r
638 Content += PcdErrString\r
f7496d71 639\r
421ccda3
HC
640 File = codecs.open(ContainerFile, 'w', Encoding)\r
641 File.write(u'\uFEFF' + Content)\r
642 File.stream.close()\r
fb0b35e0
AC
643 Md5Signature = md5(__FileHookOpen__(str(ContainerFile), 'rb').read())\r
644 Md5Sum = Md5Signature.hexdigest()\r
421ccda3
HC
645 if (ContainerFile, Md5Sum) not in PackageObject.FileList:\r
646 PackageObject.FileList.append((ContainerFile, Md5Sum))\r
647\r
648 return ContainerFile\r
f7496d71 649\r
4234283c
LG
650## GenPcdErrComment\r
651#\r
652# @param PcdErrObject: PcdErrorObject\r
f7496d71 653#\r
4234283c 654# @retval CommentStr: Generated comment lines, with prefix "#"\r
f7496d71 655#\r
4234283c 656def GenPcdErrComment (PcdErrObject):\r
f7496d71 657 CommentStr = ''\r
421ccda3 658 ErrorCode = PcdErrObject.GetErrorNumber()\r
4234283c
LG
659 ValidValueRange = PcdErrObject.GetValidValueRange()\r
660 if ValidValueRange:\r
f7496d71 661 CommentStr = TAB_COMMENT_SPLIT + TAB_SPACE_SPLIT + TAB_PCD_VALIDRANGE + TAB_SPACE_SPLIT\r
421ccda3
HC
662 if ErrorCode:\r
663 CommentStr += ErrorCode + TAB_SPACE_SPLIT + TAB_VALUE_SPLIT + TAB_SPACE_SPLIT\r
664 CommentStr += ValidValueRange + END_OF_LINE\r
f7496d71 665\r
4234283c
LG
666 ValidValue = PcdErrObject.GetValidValue()\r
667 if ValidValue:\r
668 ValidValueList = \\r
669 [Value for Value in ValidValue.split(TAB_SPACE_SPLIT) if Value]\r
421ccda3
HC
670 CommentStr = TAB_COMMENT_SPLIT + TAB_SPACE_SPLIT + TAB_PCD_VALIDLIST + TAB_SPACE_SPLIT\r
671 if ErrorCode:\r
672 CommentStr += ErrorCode + TAB_SPACE_SPLIT + TAB_VALUE_SPLIT + TAB_SPACE_SPLIT\r
673 CommentStr += TAB_COMMA_SPLIT.join(ValidValueList) + END_OF_LINE\r
f7496d71 674\r
4234283c
LG
675 Expression = PcdErrObject.GetExpression()\r
676 if Expression:\r
421ccda3
HC
677 CommentStr = TAB_COMMENT_SPLIT + TAB_SPACE_SPLIT + TAB_PCD_EXPRESSION + TAB_SPACE_SPLIT\r
678 if ErrorCode:\r
679 CommentStr += ErrorCode + TAB_SPACE_SPLIT + TAB_VALUE_SPLIT + TAB_SPACE_SPLIT\r
680 CommentStr += Expression + END_OF_LINE\r
f7496d71 681\r
4234283c
LG
682 return CommentStr\r
683\r