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