]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/UPT/MkPkg.py
BaseTools: Clear build versions to sync with buildtools/BaseTools
[mirror_edk2.git] / BaseTools / Source / Python / UPT / MkPkg.py
CommitLineData
4234283c
LG
1## @file\r
2# Install distribution package.\r
3#\r
4# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
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
15'''\r
16MkPkg\r
17'''\r
18\r
19##\r
20# Import Modules\r
21#\r
22from os import remove\r
23from os import getcwd\r
24from os import chdir\r
25import os.path\r
26from sys import stdin\r
27from sys import platform\r
28from traceback import format_exc\r
29from platform import python_version\r
30import md5\r
31from time import strftime\r
32from time import localtime\r
33from uuid import uuid4\r
34\r
35from Logger import StringTable as ST\r
36from Logger.ToolError import OPTION_UNKNOWN_ERROR\r
37from Logger.ToolError import OPTION_VALUE_INVALID\r
38from Logger.ToolError import ABORT_ERROR\r
39from Logger.ToolError import UPT_REPKG_ERROR\r
40from Logger.ToolError import CODE_ERROR\r
41from Logger.ToolError import FatalError\r
42from Logger.ToolError import FILE_NOT_FOUND\r
43import Logger.Log as Logger\r
44\r
45from Xml.XmlParser import DistributionPackageXml\r
46from Xml.IniToXml import IniToXml\r
47\r
48from Library.Misc import CheckEnvVariable\r
49from Library import GlobalData\r
50from Library.ParserValidate import IsValidPath\r
51\r
52from Core.DistributionPackageClass import DistributionPackageClass\r
53from Core.PackageFile import PackageFile\r
54\r
55## CheckForExistingDp\r
56#\r
57# Check if there is a same name DP file existing\r
58# @param Path: The path to be checked \r
59#\r
60def CheckForExistingDp(Path):\r
61 if os.path.exists(Path):\r
62 Logger.Info(ST.MSG_DISTRIBUTION_PACKAGE_FILE_EXISTS % Path)\r
63 Input = stdin.readline()\r
64 Input = Input.replace('\r', '').replace('\n', '')\r
65 if Input.upper() != "Y":\r
66 Logger.Error("\nMkPkg", ABORT_ERROR, ST.ERR_USER_ABORT, RaiseError=True)\r
67\r
68## Tool entrance method\r
69#\r
70# This method mainly dispatch specific methods per the command line options.\r
71# If no error found, return zero value so the caller of this tool can know\r
72# if it's executed successfully or not.\r
73#\r
74#\r
75def Main(Options = None):\r
76 if Options == None:\r
77 Logger.Error("\nMkPkg", OPTION_UNKNOWN_ERROR, ST.ERR_OPTION_NOT_FOUND)\r
78 try:\r
79 DataBase = GlobalData.gDB \r
80 ContentFileClosed = True\r
81 CheckEnvVariable()\r
82 WorkspaceDir = GlobalData.gWORKSPACE\r
83\r
84 #\r
85 # Init PackFileToCreate\r
86 #\r
87 if not Options.PackFileToCreate:\r
88 Logger.Error("\nMkPkg", OPTION_UNKNOWN_ERROR, ST.ERR_OPTION_NOT_FOUND)\r
89 \r
90 #\r
91 # Handle if the distribution package file already exists\r
92 #\r
93 CheckForExistingDp(Options.PackFileToCreate)\r
94\r
95 #\r
96 # Check package file existing and valid\r
97 #\r
98 CheckFileList('.DEC', Options.PackageFileList, ST.ERR_INVALID_PACKAGE_NAME, ST.ERR_INVALID_PACKAGE_PATH)\r
99 # \r
100 # Check module file existing and valid\r
101 #\r
102 CheckFileList('.INF', Options.ModuleFileList, ST.ERR_INVALID_MODULE_NAME, ST.ERR_INVALID_MODULE_PATH)\r
103\r
104 #\r
105 # Get list of files that installed with RePackage attribute available\r
106 #\r
107 RePkgDict = DataBase.GetRePkgDict()\r
108 \r
109 ContentFile = PackageFile(GlobalData.gCONTENT_FILE, "w") \r
110 ContentFileClosed = False\r
111 \r
112 #\r
113 # Add temp distribution header\r
114 #\r
115 if Options.PackageInformationDataFile:\r
116 XmlFile = IniToXml(Options.PackageInformationDataFile)\r
117 DistPkg = DistributionPackageXml().FromXml(XmlFile)\r
118 remove(XmlFile)\r
119\r
120 #\r
121 # add distribution level tool/misc files\r
122 # before pack, current dir should be workspace dir, else the full \r
123 # path will be in the pack file\r
124 #\r
125 Cwd = getcwd()\r
126 chdir(WorkspaceDir)\r
127 ToolObject = DistPkg.Tools\r
128 MiscObject = DistPkg.MiscellaneousFiles\r
129 FileList = []\r
130 if ToolObject:\r
131 FileList += ToolObject.GetFileList()\r
132 if MiscObject:\r
133 FileList += MiscObject.GetFileList()\r
134 for FileObject in FileList:\r
135 #\r
136 # If you have unicode file names, please convert them to byte \r
137 # strings in your desired encoding before passing them to \r
138 # write().\r
139 #\r
140 FromFile = os.path.normpath(FileObject.GetURI()).encode('utf_8')\r
141 FileFullPath = os.path.normpath(os.path.join(WorkspaceDir, FromFile))\r
142 if FileFullPath in RePkgDict:\r
143 (DpGuid, DpVersion, DpName, Repackage) = RePkgDict[FileFullPath]\r
144 if not Repackage:\r
145 Logger.Error("\nMkPkg",\r
146 UPT_REPKG_ERROR,\r
147 ST.ERR_UPT_REPKG_ERROR,\r
148 ExtraData=ST.MSG_REPKG_CONFLICT %\\r
149 (FileFullPath, DpGuid, DpVersion, DpName)\r
150 )\r
151 else:\r
152 DistPkg.Header.RePackage = True\r
153 ContentFile.PackFile(FromFile)\r
154 chdir(Cwd)\r
155 \r
156 # \r
157 # Add init dp information\r
158 #\r
159 else:\r
160 DistPkg = DistributionPackageClass()\r
161 DistPkg.Header.Name = 'Distribution Package'\r
162 DistPkg.Header.Guid = str(uuid4())\r
163 DistPkg.Header.Version = '1.0'\r
164 \r
165 DistPkg.GetDistributionPackage(WorkspaceDir, Options.PackageFileList, \\r
166 Options.ModuleFileList)\r
167 FileList, MetaDataFileList = DistPkg.GetDistributionFileList()\r
168 for File in FileList + MetaDataFileList:\r
169 FileFullPath = os.path.normpath(os.path.join(WorkspaceDir, File))\r
170 #\r
171 # check whether file was included in a distribution that can not \r
172 # be repackaged\r
173 #\r
174 if FileFullPath in RePkgDict:\r
175 (DpGuid, DpVersion, DpName, Repackage) = RePkgDict[FileFullPath]\r
176 if not Repackage:\r
177 Logger.Error("\nMkPkg",\r
178 UPT_REPKG_ERROR,\r
179 ST.ERR_UPT_REPKG_ERROR,\r
180 ExtraData = \\r
181 ST.MSG_REPKG_CONFLICT %(FileFullPath, DpName, \\r
182 DpGuid, DpVersion)\r
183 )\r
184 else:\r
185 DistPkg.Header.RePackage = True\r
186 \r
187 Cwd = getcwd()\r
188 chdir(WorkspaceDir) \r
189 ContentFile.PackFiles(FileList)\r
190 chdir(Cwd)\r
191 \r
192 Logger.Verbose(ST.MSG_COMPRESS_DISTRIBUTION_PKG) \r
193 \r
194 ContentFile.Close()\r
195 ContentFileClosed = True\r
196 \r
197 #\r
198 # Add Md5Sigature\r
199 #\r
200 DistPkg.Header.Signature = md5.new(open(str(ContentFile), 'rb').read()).hexdigest()\r
201 #\r
202 # Add current Date\r
203 #\r
204 DistPkg.Header.Date = str(strftime("%Y-%m-%dT%H:%M:%S", localtime()))\r
205 \r
206 #\r
207 # Finish final dp file\r
208 #\r
209 DistPkgFile = PackageFile(Options.PackFileToCreate, "w")\r
210 DistPkgFile.PackFile(str(ContentFile))\r
211 DistPkgXml = DistributionPackageXml()\r
212 DistPkgFile.PackData(DistPkgXml.ToXml(DistPkg), GlobalData.gDESC_FILE)\r
213 DistPkgFile.Close()\r
214 Logger.Quiet(ST.MSG_FINISH)\r
215 ReturnCode = 0\r
216\r
217 except FatalError, XExcept:\r
218 ReturnCode = XExcept.args[0] \r
219 if Logger.GetLevel() <= Logger.DEBUG_9:\r
220 Logger.Quiet(ST.MSG_PYTHON_ON % \\r
221 (python_version(), platform) + format_exc())\r
222 except KeyboardInterrupt:\r
223 ReturnCode = ABORT_ERROR\r
224 if Logger.GetLevel() <= Logger.DEBUG_9:\r
225 Logger.Quiet(ST.MSG_PYTHON_ON % \\r
226 (python_version(), platform) + format_exc())\r
227 except OSError:\r
228 pass\r
229 except:\r
230 Logger.Error(\r
231 "\nMkPkg",\r
232 CODE_ERROR,\r
233 ST.ERR_UNKNOWN_FATAL_CREATING_ERR % \\r
234 Options.PackFileToCreate,\r
235 ExtraData=ST.MSG_SEARCH_FOR_HELP,\r
236 RaiseError=False\r
237 )\r
238 Logger.Quiet(ST.MSG_PYTHON_ON % \\r
239 (python_version(), platform) + format_exc())\r
240 ReturnCode = CODE_ERROR\r
241 finally:\r
242 if os.path.exists(GlobalData.gCONTENT_FILE):\r
243 if not ContentFileClosed:\r
244 ContentFile.Close()\r
245 os.remove(GlobalData.gCONTENT_FILE)\r
246\r
247 return ReturnCode\r
248\r
249\r
250## CheckFileList\r
251# \r
252# @param QualifiedExt: QualifiedExt\r
253# @param FileList: FileList\r
254# @param ErrorStringExt: ErrorStringExt\r
255# @param ErrorStringFullPath: ErrorStringFullPath\r
256#\r
257def CheckFileList(QualifiedExt, FileList, ErrorStringExt, ErrorStringFullPath):\r
258 if not FileList:\r
259 return\r
260 WorkspaceDir = GlobalData.gWORKSPACE\r
261 WorkspaceDir = os.path.normpath(WorkspaceDir)\r
262 for Item in FileList:\r
263 Ext = os.path.splitext(Item)[1]\r
264 if Ext.upper() != QualifiedExt.upper():\r
265 Logger.Error("\nMkPkg", OPTION_VALUE_INVALID, \\r
266 ErrorStringExt % Item)\r
267 \r
268 Item = os.path.normpath(Item)\r
269 Path = os.path.normpath(os.path.join(WorkspaceDir, Item))\r
270 if not os.path.exists(Path):\r
271 Logger.Error("\nMkPkg", FILE_NOT_FOUND, ST.ERR_NOT_FOUND % Item)\r
272 elif Item == Path:\r
273 Logger.Error("\nMkPkg", OPTION_VALUE_INVALID,\r
274 ErrorStringFullPath % Item)\r
275 elif not IsValidPath(Item, WorkspaceDir):\r
276 Logger.Error("\nMkPkg", OPTION_VALUE_INVALID, \\r
277 ErrorStringExt % Item)\r
278 \r
279 if not os.path.split(Item)[0]:\r
280 Logger.Error("\nMkPkg", OPTION_VALUE_INVALID, \\r
281 ST.ERR_INVALID_METAFILE_PATH % Item)\r