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