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