]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/UPT/Core/DistributionPackageClass.py
BaseTools: Move OverrideAttribs to OptRomInfStatement.py
[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
f7496d71
LG
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
4234283c
LG
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
f7496d71 53\r
4234283c
LG
54 def GetReadOnly(self):\r
55 return self.ReadOnly\r
f7496d71 56\r
4234283c
LG
57 def SetReadOnly(self, ReadOnly):\r
58 self.ReadOnly = ReadOnly\r
f7496d71 59\r
4234283c
LG
60 def GetRePackage(self):\r
61 return self.RePackage\r
f7496d71 62\r
4234283c
LG
63 def SetRePackage(self, RePackage):\r
64 self.RePackage = RePackage\r
f7496d71 65\r
4234283c
LG
66 def GetVendor(self):\r
67 return self.Vendor\r
f7496d71 68\r
4234283c
LG
69 def SetDate(self, Date):\r
70 self.Date = Date\r
f7496d71 71\r
4234283c
LG
72 def GetDate(self):\r
73 return self.Date\r
f7496d71 74\r
4234283c
LG
75 def SetSignature(self, Signature):\r
76 self.Signature = Signature\r
f7496d71 77\r
4234283c
LG
78 def GetSignature(self):\r
79 return self.Signature\r
f7496d71 80\r
4234283c
LG
81 def SetXmlSpecification(self, XmlSpecification):\r
82 self.XmlSpecification = XmlSpecification\r
f7496d71 83\r
4234283c
LG
84 def GetXmlSpecification(self):\r
85 return self.XmlSpecification\r
f7496d71 86\r
4234283c
LG
87## DistributionPackageClass\r
88#\r
89# @param object: DistributionPackageClass\r
f7496d71 90#\r
4234283c
LG
91class DistributionPackageClass(object):\r
92 def __init__(self):\r
93 self.Header = DistributionPackageHeaderObject()\r
94 #\r
95 # {(Guid, Version, Path) : PackageObj}\r
96 #\r
f7496d71 97 self.PackageSurfaceArea = Sdict()\r
4234283c 98 #\r
d0acc87a 99 # {(Guid, Version, Name, Path) : ModuleObj}\r
4234283c 100 #\r
f7496d71 101 self.ModuleSurfaceArea = Sdict()\r
4234283c
LG
102 self.Tools = MiscFileObject()\r
103 self.MiscellaneousFiles = MiscFileObject()\r
104 self.UserExtensions = []\r
105 self.FileList = []\r
f7496d71 106\r
4234283c 107 ## Get all included packages and modules for a distribution package\r
f7496d71 108 #\r
4234283c
LG
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
f7496d71 135 OPTION_VALUE_INVALID,\r
4234283c
LG
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
f7496d71 143 # Actually, this call is not directly call, but wrapped by\r
4234283c
LG
144 # Inf class in InfPomAlignment.\r
145 #\r
146 try:\r
fb0f8067 147 ModuleObj = InfPomAlignment(Filename, WorkspaceDir, PackageObj.GetPackagePath())\r
f7496d71 148\r
4234283c
LG
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
5b0671c1 158 except FatalError as ErrCode:\r
4234283c
LG
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
f7496d71 164\r
4234283c
LG
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
f7496d71
LG
179 ModuleKey = (ModuleObj.GetGuid(),\r
180 ModuleObj.GetVersion(),\r
181 ModuleObj.GetName(),\r
d0acc87a
LG
182 ModuleObj.GetCombinePath())\r
183 self.ModuleSurfaceArea[ModuleKey] = ModuleObj\r
5b0671c1 184 except FatalError as ErrCode:\r
4234283c
LG
185 if ErrCode.message == EDK1_INF_ERROR:\r
186 Logger.Error("UPT",\r
187 EDK1_INF_ERROR,\r
f7496d71 188 ST.WRN_EDK1_INF_FOUND%ModuleFileFullPath,\r
4234283c
LG
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 195\r
f7496d71 196 ## Get all files included for a distribution package, except tool/misc of\r
4234283c 197 # distribution level\r
f7496d71 198 #\r
4234283c
LG
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
f7496d71 205\r
4234283c
LG
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
f7496d71 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
f7496d71 265\r
421ccda3
HC
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
f7496d71 272\r
4234283c 273\r