]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/UPT/Core/DistributionPackageClass.py
BaseTools: Update UPT tool to support multiple workspaces
[mirror_edk2.git] / BaseTools / Source / Python / UPT / Core / DistributionPackageClass.py
CommitLineData
4234283c
LG
1## @file\r
2# This file is used to define a class object to describe a distribution package\r
3#\r
421ccda3 4# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
4234283c
LG
5#\r
6# This program and the accompanying materials are licensed and made available \r
7# under the terms and conditions of the BSD License which accompanies this \r
8# 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
15DistributionPackageClass\r
16'''\r
17\r
18##\r
19# Import Modules\r
20#\r
21import os.path\r
22\r
23from Library.Misc import Sdict\r
24from Library.Misc import GetNonMetaDataFiles\r
25from PomAdapter.InfPomAlignment import InfPomAlignment\r
26from PomAdapter.DecPomAlignment import DecPomAlignment\r
27import Logger.Log as Logger\r
28from Logger import StringTable as ST\r
29from Logger.ToolError import OPTION_VALUE_INVALID\r
30from Logger.ToolError import FatalError\r
31from Logger.ToolError import EDK1_INF_ERROR\r
32from Object.POM.CommonObject import IdentificationObject\r
33from Object.POM.CommonObject import CommonHeaderObject\r
34from Object.POM.CommonObject import MiscFileObject\r
fb0f8067 35from Common.MultipleWorkspace import MultipleWorkspace as mws\r
4234283c
LG
36\r
37## DistributionPackageHeaderClass\r
38#\r
39# @param IdentificationObject: Identification Object\r
40# @param CommonHeaderObject: Common Header Object\r
41#\r
42class DistributionPackageHeaderObject(IdentificationObject, \\r
43 CommonHeaderObject):\r
44 def __init__(self):\r
45 IdentificationObject.__init__(self)\r
46 CommonHeaderObject.__init__(self)\r
47 self.ReadOnly = ''\r
48 self.RePackage = ''\r
49 self.Vendor = ''\r
50 self.Date = ''\r
51 self.Signature = 'Md5Sum'\r
52 self.XmlSpecification = ''\r
53 \r
54 def GetReadOnly(self):\r
55 return self.ReadOnly\r
56 \r
57 def SetReadOnly(self, ReadOnly):\r
58 self.ReadOnly = ReadOnly\r
59 \r
60 def GetRePackage(self):\r
61 return self.RePackage\r
62 \r
63 def SetRePackage(self, RePackage):\r
64 self.RePackage = RePackage\r
65 \r
66 def GetVendor(self):\r
67 return self.Vendor\r
68 \r
69 def SetDate(self, Date):\r
70 self.Date = Date\r
71 \r
72 def GetDate(self):\r
73 return self.Date\r
74 \r
75 def SetSignature(self, Signature):\r
76 self.Signature = Signature\r
77 \r
78 def GetSignature(self):\r
79 return self.Signature\r
80 \r
81 def SetXmlSpecification(self, XmlSpecification):\r
82 self.XmlSpecification = XmlSpecification\r
83 \r
84 def GetXmlSpecification(self):\r
85 return self.XmlSpecification\r
86 \r
87## DistributionPackageClass\r
88#\r
89# @param object: DistributionPackageClass\r
90# \r
91class DistributionPackageClass(object):\r
92 def __init__(self):\r
93 self.Header = DistributionPackageHeaderObject()\r
94 #\r
95 # {(Guid, Version, Path) : PackageObj}\r
96 #\r
97 self.PackageSurfaceArea = Sdict() \r
98 #\r
d0acc87a 99 # {(Guid, Version, Name, Path) : ModuleObj}\r
4234283c
LG
100 #\r
101 self.ModuleSurfaceArea = Sdict() \r
102 self.Tools = MiscFileObject()\r
103 self.MiscellaneousFiles = MiscFileObject()\r
104 self.UserExtensions = []\r
105 self.FileList = []\r
106 \r
107 ## Get all included packages and modules for a distribution package\r
108 # \r
109 # @param WorkspaceDir: WorkspaceDir\r
110 # @param PackageList: A list of all packages\r
111 # @param ModuleList: A list of all modules\r
112 #\r
113 def GetDistributionPackage(self, WorkspaceDir, PackageList, ModuleList):\r
fb0f8067
HC
114 # Backup WorkspaceDir\r
115 Root = WorkspaceDir\r
116\r
4234283c
LG
117 #\r
118 # Get Packages\r
119 #\r
120 if PackageList:\r
121 for PackageFile in PackageList:\r
fb0f8067
HC
122 PackageFileFullPath = mws.join(Root, PackageFile)\r
123 WorkspaceDir = mws.getWs(Root, PackageFile)\r
124 DecObj = DecPomAlignment(PackageFileFullPath, WorkspaceDir, CheckMulDec=True)\r
4234283c
LG
125 PackageObj = DecObj\r
126 #\r
127 # Parser inf file one bye one\r
128 #\r
129 ModuleInfFileList = PackageObj.GetModuleFileList()\r
130 for File in ModuleInfFileList:\r
131 WsRelPath = os.path.join(PackageObj.GetPackagePath(), File)\r
132 WsRelPath = os.path.normpath(WsRelPath)\r
133 if ModuleList and WsRelPath in ModuleList:\r
134 Logger.Error("UPT",\r
135 OPTION_VALUE_INVALID, \r
136 ST.ERR_NOT_STANDALONE_MODULE_ERROR%\\r
137 (WsRelPath, PackageFile))\r
138 Filename = os.path.normpath\\r
139 (os.path.join(PackageObj.GetRelaPath(), File))\r
140 os.path.splitext(Filename)\r
141 #\r
142 # Call INF parser to generate Inf Object.\r
143 # Actually, this call is not directly call, but wrapped by \r
144 # Inf class in InfPomAlignment.\r
145 #\r
146 try:\r
fb0f8067 147 ModuleObj = InfPomAlignment(Filename, WorkspaceDir, PackageObj.GetPackagePath())\r
4234283c
LG
148 \r
149 #\r
150 # Add module to package\r
151 #\r
152 ModuleDict = PackageObj.GetModuleDict()\r
153 ModuleDict[(ModuleObj.GetGuid(), \\r
154 ModuleObj.GetVersion(), \\r
d0acc87a 155 ModuleObj.GetName(), \\r
4234283c
LG
156 ModuleObj.GetCombinePath())] = ModuleObj\r
157 PackageObj.SetModuleDict(ModuleDict)\r
158 except FatalError, ErrCode:\r
159 if ErrCode.message == EDK1_INF_ERROR:\r
160 Logger.Warn("UPT",\r
161 ST.WRN_EDK1_INF_FOUND%Filename)\r
162 else:\r
163 raise\r
164 \r
165 self.PackageSurfaceArea\\r
166 [(PackageObj.GetGuid(), PackageObj.GetVersion(), \\r
167 PackageObj.GetCombinePath())] = PackageObj\r
168\r
169 #\r
170 # Get Modules\r
171 #\r
172 if ModuleList:\r
173 for ModuleFile in ModuleList:\r
fb0f8067
HC
174 ModuleFileFullPath = mws.join(Root, ModuleFile)\r
175 WorkspaceDir = mws.getWs(Root, ModuleFile)\r
176\r
4234283c 177 try:\r
fb0f8067 178 ModuleObj = InfPomAlignment(ModuleFileFullPath, WorkspaceDir)\r
d0acc87a
LG
179 ModuleKey = (ModuleObj.GetGuid(), \r
180 ModuleObj.GetVersion(), \r
181 ModuleObj.GetName(), \r
182 ModuleObj.GetCombinePath())\r
183 self.ModuleSurfaceArea[ModuleKey] = ModuleObj\r
4234283c
LG
184 except FatalError, ErrCode:\r
185 if ErrCode.message == EDK1_INF_ERROR:\r
186 Logger.Error("UPT",\r
187 EDK1_INF_ERROR,\r
188 ST.WRN_EDK1_INF_FOUND%ModuleFileFullPath, \r
189 ExtraData=ST.ERR_NOT_SUPPORTED_SA_MODULE)\r
190 else:\r
fb0f8067
HC
191 raise\r
192\r
193 # Recover WorkspaceDir\r
194 WorkspaceDir = Root\r
4234283c
LG
195\r
196 ## Get all files included for a distribution package, except tool/misc of \r
197 # distribution level\r
198 # \r
199 # @retval DistFileList A list of filepath for NonMetaDataFile, relative to workspace\r
200 # @retval MetaDataFileList A list of filepath for MetaDataFile, relative to workspace\r
201 #\r
202 def GetDistributionFileList(self):\r
203 MetaDataFileList = []\r
421ccda3 204 SkipModulesUniList = []\r
4234283c
LG
205 \r
206 for Guid, Version, Path in self.PackageSurfaceArea:\r
207 Package = self.PackageSurfaceArea[Guid, Version, Path]\r
208 PackagePath = Package.GetPackagePath()\r
209 FullPath = Package.GetFullPath()\r
210 MetaDataFileList.append(Path)\r
211 IncludePathList = Package.GetIncludePathList()\r
212 for IncludePath in IncludePathList:\r
213 SearchPath = os.path.normpath(os.path.join(os.path.dirname(FullPath), IncludePath))\r
214 AddPath = os.path.normpath(os.path.join(PackagePath, IncludePath))\r
215 self.FileList += GetNonMetaDataFiles(SearchPath, ['CVS', '.svn'], False, AddPath)\r
421ccda3
HC
216 #\r
217 # Add the miscellaneous files on DEC file\r
218 #\r
219 for MiscFileObj in Package.GetMiscFileList():\r
220 for FileObj in MiscFileObj.GetFileList():\r
76d47511 221 MiscFileFullPath = os.path.normpath(os.path.join(PackagePath, FileObj.GetURI()))\r
421ccda3
HC
222 if MiscFileFullPath not in self.FileList:\r
223 self.FileList.append(MiscFileFullPath)\r
224 \r
4234283c
LG
225 Module = None\r
226 ModuleDict = Package.GetModuleDict()\r
d0acc87a
LG
227 for Guid, Version, Name, Path in ModuleDict:\r
228 Module = ModuleDict[Guid, Version, Name, Path]\r
4234283c
LG
229 ModulePath = Module.GetModulePath()\r
230 FullPath = Module.GetFullPath()\r
231 PkgRelPath = os.path.normpath(os.path.join(PackagePath, ModulePath))\r
232 MetaDataFileList.append(Path)\r
421ccda3
HC
233 SkipList = ['CVS', '.svn']\r
234 NonMetaDataFileList = []\r
235 if Module.UniFileClassObject:\r
236 for UniFile in Module.UniFileClassObject.IncFileList:\r
237 OriPath = os.path.normpath(os.path.dirname(FullPath))\r
238 UniFilePath = os.path.normpath(os.path.join(PkgRelPath, UniFile.Path[len(OriPath) + 1:]))\r
239 if UniFilePath not in SkipModulesUniList:\r
240 SkipModulesUniList.append(UniFilePath)\r
241 for IncludeFile in Module.UniFileClassObject.IncludePathList:\r
242 if IncludeFile not in SkipModulesUniList:\r
243 SkipModulesUniList.append(IncludeFile)\r
244 NonMetaDataFileList = GetNonMetaDataFiles(os.path.dirname(FullPath), SkipList, False, PkgRelPath)\r
245 for NonMetaDataFile in NonMetaDataFileList:\r
246 if NonMetaDataFile not in self.FileList:\r
247 self.FileList.append(NonMetaDataFile)\r
d0acc87a
LG
248 for Guid, Version, Name, Path in self.ModuleSurfaceArea:\r
249 Module = self.ModuleSurfaceArea[Guid, Version, Name, Path]\r
4234283c
LG
250 ModulePath = Module.GetModulePath()\r
251 FullPath = Module.GetFullPath()\r
252 MetaDataFileList.append(Path)\r
421ccda3
HC
253 SkipList = ['CVS', '.svn']\r
254 NonMetaDataFileList = []\r
255 if Module.UniFileClassObject:\r
256 for UniFile in Module.UniFileClassObject.IncFileList:\r
257 OriPath = os.path.normpath(os.path.dirname(FullPath))\r
258 UniFilePath = os.path.normpath(os.path.join(ModulePath, UniFile.Path[len(OriPath) + 1:]))\r
259 if UniFilePath not in SkipModulesUniList:\r
260 SkipModulesUniList.append(UniFilePath)\r
261 NonMetaDataFileList = GetNonMetaDataFiles(os.path.dirname(FullPath), SkipList, False, ModulePath)\r
262 for NonMetaDataFile in NonMetaDataFileList:\r
263 if NonMetaDataFile not in self.FileList:\r
264 self.FileList.append(NonMetaDataFile)\r
265 \r
266 for SkipModuleUni in SkipModulesUniList:\r
267 if SkipModuleUni in self.FileList:\r
268 self.FileList.remove(SkipModuleUni)\r
269\r
4234283c
LG
270 return self.FileList, MetaDataFileList\r
271\r
272 \r
273\r