]> git.proxmox.com Git - mirror_edk2.git/blob - BaseTools/Source/Python/UPT/GenMetaFile/GenMetaFileMisc.py
BaseTools: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / BaseTools / Source / Python / UPT / GenMetaFile / GenMetaFileMisc.py
1 ## @file GenMetaFileMisc.py
2 #
3 # This file contained the miscellaneous routines for GenMetaFile usage.
4 #
5 # Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
6 #
7 # SPDX-License-Identifier: BSD-2-Clause-Patent
8 #
9
10 '''
11 GenMetaFileMisc
12 '''
13
14 from Library import DataType as DT
15 from Library import GlobalData
16 from Parser.DecParser import Dec
17
18 # AddExternToDefineSec
19 #
20 # @param SectionDict: string of source file path/name
21 # @param Arch: string of source file family field
22 # @param ExternList: string of source file FeatureFlag field
23 #
24 def AddExternToDefineSec(SectionDict, Arch, ExternList):
25 LeftOffset = 31
26 for ArchList, EntryPoint, UnloadImage, Constructor, Destructor, FFE, HelpStringList in ExternList:
27 if Arch or ArchList:
28 if EntryPoint:
29 Statement = (u'%s ' % DT.TAB_INF_DEFINES_ENTRY_POINT).ljust(LeftOffset) + u'= %s' % EntryPoint
30 if FFE:
31 Statement += ' | %s' % FFE
32 if len(HelpStringList) > 0:
33 Statement = HelpStringList[0].GetString() + '\n' + Statement
34 if len(HelpStringList) > 1:
35 Statement = Statement + HelpStringList[1].GetString()
36 SectionDict[Arch] = SectionDict[Arch] + [Statement]
37
38 if UnloadImage:
39 Statement = (u'%s ' % DT.TAB_INF_DEFINES_UNLOAD_IMAGE).ljust(LeftOffset) + u'= %s' % UnloadImage
40 if FFE:
41 Statement += ' | %s' % FFE
42
43 if len(HelpStringList) > 0:
44 Statement = HelpStringList[0].GetString() + '\n' + Statement
45 if len(HelpStringList) > 1:
46 Statement = Statement + HelpStringList[1].GetString()
47 SectionDict[Arch] = SectionDict[Arch] + [Statement]
48
49 if Constructor:
50 Statement = (u'%s ' % DT.TAB_INF_DEFINES_CONSTRUCTOR).ljust(LeftOffset) + u'= %s' % Constructor
51 if FFE:
52 Statement += ' | %s' % FFE
53
54 if len(HelpStringList) > 0:
55 Statement = HelpStringList[0].GetString() + '\n' + Statement
56 if len(HelpStringList) > 1:
57 Statement = Statement + HelpStringList[1].GetString()
58 SectionDict[Arch] = SectionDict[Arch] + [Statement]
59
60 if Destructor:
61 Statement = (u'%s ' % DT.TAB_INF_DEFINES_DESTRUCTOR).ljust(LeftOffset) + u'= %s' % Destructor
62 if FFE:
63 Statement += ' | %s' % FFE
64
65 if len(HelpStringList) > 0:
66 Statement = HelpStringList[0].GetString() + '\n' + Statement
67 if len(HelpStringList) > 1:
68 Statement = Statement + HelpStringList[1].GetString()
69 SectionDict[Arch] = SectionDict[Arch] + [Statement]
70
71 ## ObtainPcdName
72 #
73 # Using TokenSpaceGuidValue and Token to obtain PcdName from DEC file
74 #
75 def ObtainPcdName(Packages, TokenSpaceGuidValue, Token):
76 TokenSpaceGuidName = ''
77 PcdCName = ''
78 TokenSpaceGuidNameFound = False
79
80 for PackageDependency in Packages:
81 #
82 # Generate generic comment
83 #
84 Guid = PackageDependency.GetGuid()
85 Version = PackageDependency.GetVersion()
86
87 Path = None
88 #
89 # find package path/name
90 #
91 for PkgInfo in GlobalData.gWSPKG_LIST:
92 if Guid == PkgInfo[1]:
93 if (not Version) or (Version == PkgInfo[2]):
94 Path = PkgInfo[3]
95 break
96
97 # The dependency package in workspace
98 if Path:
99 DecFile = None
100 if Path not in GlobalData.gPackageDict:
101 DecFile = Dec(Path)
102 GlobalData.gPackageDict[Path] = DecFile
103 else:
104 DecFile = GlobalData.gPackageDict[Path]
105
106 DecGuidsDict = DecFile.GetGuidSectionObject().ValueDict
107 DecPcdsDict = DecFile.GetPcdSectionObject().ValueDict
108
109 TokenSpaceGuidName = ''
110 PcdCName = ''
111 TokenSpaceGuidNameFound = False
112
113 #
114 # Get TokenSpaceGuidCName from Guids section
115 #
116 for GuidKey in DecGuidsDict:
117 GuidList = DecGuidsDict[GuidKey]
118 for GuidItem in GuidList:
119 if TokenSpaceGuidValue.upper() == GuidItem.GuidString.upper():
120 TokenSpaceGuidName = GuidItem.GuidCName
121 TokenSpaceGuidNameFound = True
122 break
123 if TokenSpaceGuidNameFound:
124 break
125 #
126 # Retrieve PcdCName from Pcds Section
127 #
128 for PcdKey in DecPcdsDict:
129 PcdList = DecPcdsDict[PcdKey]
130 for PcdItem in PcdList:
131 if TokenSpaceGuidName == PcdItem.TokenSpaceGuidCName and Token == PcdItem.TokenValue:
132 PcdCName = PcdItem.TokenCName
133 return TokenSpaceGuidName, PcdCName
134
135 # The dependency package in ToBeInstalledDist
136 else:
137 for Dist in GlobalData.gTO_BE_INSTALLED_DIST_LIST:
138 for Package in Dist.PackageSurfaceArea.values():
139 if Guid == Package.Guid:
140 for GuidItem in Package.GuidList:
141 if TokenSpaceGuidValue.upper() == GuidItem.Guid.upper():
142 TokenSpaceGuidName = GuidItem.CName
143 TokenSpaceGuidNameFound = True
144 break
145 for PcdItem in Package.PcdList:
146 if TokenSpaceGuidName == PcdItem.TokenSpaceGuidCName and Token == PcdItem.Token:
147 PcdCName = PcdItem.CName
148 return TokenSpaceGuidName, PcdCName
149
150 return TokenSpaceGuidName, PcdCName
151
152 ## _TransferDict
153 # transfer dict that using (Statement, SortedArch) as key,
154 # (GenericComment, UsageComment) as value into a dict that using SortedArch as
155 # key and NewStatement as value
156 #
157 def TransferDict(OrigDict, Type=None):
158 NewDict = {}
159 LeftOffset = 0
160 if Type in ['INF_GUID', 'INF_PPI_PROTOCOL']:
161 LeftOffset = 45
162 if Type in ['INF_PCD']:
163 LeftOffset = 75
164 if LeftOffset > 0:
165 for Statement, SortedArch in OrigDict:
166 if len(Statement) > LeftOffset:
167 LeftOffset = len(Statement)
168
169 for Statement, SortedArch in OrigDict:
170 Comment = OrigDict[Statement, SortedArch]
171 #
172 # apply the NComment/1Comment rule
173 #
174 if Comment.find('\n') != len(Comment) - 1:
175 NewStateMent = Comment + Statement
176 else:
177 if LeftOffset:
178 NewStateMent = Statement.ljust(LeftOffset) + ' ' + Comment.rstrip('\n')
179 else:
180 NewStateMent = Statement + ' ' + Comment.rstrip('\n')
181
182 if SortedArch in NewDict:
183 NewDict[SortedArch] = NewDict[SortedArch] + [NewStateMent]
184 else:
185 NewDict[SortedArch] = [NewStateMent]
186
187 return NewDict
188