]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/UPT/UPT.py
MdePkg: Add two PcdApi for Patch VOID* PCD set operation.
[mirror_edk2.git] / BaseTools / Source / Python / UPT / UPT.py
CommitLineData
4234283c
LG
1## @file\r
2#\r
3# This file is the main entry for UPT \r
4#\r
510f154e 5# Copyright (c) 2011 - 2015, Intel Corporation. All rights reserved.<BR>\r
4234283c
LG
6#\r
7# This program and the accompanying materials are licensed and made available \r
8# under the terms and conditions of the BSD License which accompanies this \r
9# distribution. The full text of the license may be found at \r
10# http://opensource.org/licenses/bsd-license.php\r
11#\r
12# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
13# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
14#\r
15\r
16'''\r
17UPT\r
18'''\r
19\r
20## import modules\r
21#\r
421ccda3 22from Core import FileHook\r
4234283c
LG
23import sys\r
24import os.path\r
4234283c 25from sys import platform\r
421ccda3 26import platform as pf\r
4234283c
LG
27from optparse import OptionParser\r
28from traceback import format_exc\r
29from platform import python_version\r
30\r
31from Logger import StringTable as ST\r
32import Logger.Log as Logger\r
33from Logger.StringTable import MSG_VERSION\r
34from Logger.StringTable import MSG_DESCRIPTION\r
35from Logger.StringTable import MSG_USAGE\r
36from Logger.ToolError import FILE_NOT_FOUND\r
37from Logger.ToolError import OPTION_MISSING\r
38from Logger.ToolError import FILE_TYPE_MISMATCH\r
39from Logger.ToolError import OPTION_CONFLICT\r
40from Logger.ToolError import FatalError\r
af0c61ae 41from Logger.ToolError import UPT_ALREADY_INSTALLED_ERROR\r
421ccda3 42\r
4234283c
LG
43import MkPkg\r
44import InstallPkg\r
45import RmPkg\r
421ccda3
HC
46import InventoryWs\r
47import ReplacePkg\r
48from Library.Misc import GetWorkspace\r
4234283c
LG
49from Library import GlobalData\r
50from Core.IpiDb import IpiDatabase\r
2bcc713e 51from BuildVersion import gBUILD_VERSION\r
4234283c 52\r
4234283c
LG
53## CheckConflictOption\r
54#\r
55# CheckConflictOption\r
56#\r
57def CheckConflictOption(Opt):\r
421ccda3
HC
58 if (Opt.PackFileToCreate or Opt.PackFileToInstall or Opt.PackFileToRemove or Opt.PackFileToReplace) \\r
59 and Opt.InventoryWs:\r
60 Logger.Error("UPT", OPTION_CONFLICT, ExtraData=ST.ERR_L_OA_EXCLUSIVE)\r
61 elif Opt.PackFileToReplace and (Opt.PackFileToCreate or Opt.PackFileToInstall or Opt.PackFileToRemove):\r
62 Logger.Error("UPT", OPTION_CONFLICT, ExtraData=ST.ERR_U_ICR_EXCLUSIVE)\r
63 elif (Opt.PackFileToCreate and Opt.PackFileToInstall and Opt.PackFileToRemove):\r
4234283c
LG
64 Logger.Error("UPT", OPTION_CONFLICT, ExtraData=ST.ERR_REQUIRE_I_C_R_OPTION)\r
65 elif Opt.PackFileToCreate and Opt.PackFileToInstall:\r
66 Logger.Error("UPT", OPTION_CONFLICT, ExtraData=ST.ERR_I_C_EXCLUSIVE)\r
67 elif Opt.PackFileToInstall and Opt.PackFileToRemove:\r
68 Logger.Error("UPT", OPTION_CONFLICT, ExtraData=ST.ERR_I_R_EXCLUSIVE)\r
69 elif Opt.PackFileToCreate and Opt.PackFileToRemove:\r
70 Logger.Error("UPT", OPTION_CONFLICT, ExtraData=ST.ERR_C_R_EXCLUSIVE)\r
71\r
421ccda3
HC
72 if Opt.CustomPath and Opt.UseGuidedPkgPath:\r
73 Logger.Warn("UPT", ST.WARN_CUSTOMPATH_OVERRIDE_USEGUIDEDPATH)\r
74 Opt.UseGuidedPkgPath = False\r
75\r
4234283c
LG
76## SetLogLevel\r
77#\r
78def SetLogLevel(Opt):\r
79 if Opt.opt_verbose:\r
80 Logger.SetLevel(Logger.VERBOSE)\r
81 elif Opt.opt_quiet:\r
82 Logger.SetLevel(Logger.QUIET + 1)\r
83 elif Opt.debug_level != None:\r
84 if Opt.debug_level < 0 or Opt.debug_level > 9:\r
85 Logger.Warn("UPT", ST.ERR_DEBUG_LEVEL)\r
86 Logger.SetLevel(Logger.INFO)\r
87 else:\r
88 Logger.SetLevel(Opt.debug_level + 1)\r
89 elif Opt.opt_slient:\r
90 Logger.SetLevel(Logger.SILENT)\r
91 else:\r
92 Logger.SetLevel(Logger.INFO)\r
93\r
94## Main\r
95#\r
96# Main\r
97#\r
98def Main():\r
99 Logger.Initialize()\r
100\r
b36d134f 101 Parser = OptionParser(version=(MSG_VERSION + ' ' + gBUILD_VERSION), description=MSG_DESCRIPTION,\r
4234283c
LG
102 prog="UPT.exe", usage=MSG_USAGE)\r
103\r
104 Parser.add_option("-d", "--debug", action="store", type="int", dest="debug_level", help=ST.HLP_PRINT_DEBUG_INFO)\r
105\r
106 Parser.add_option("-v", "--verbose", action="store_true", dest="opt_verbose",\r
107 help=ST.HLP_PRINT_INFORMATIONAL_STATEMENT)\r
108\r
109 Parser.add_option("-s", "--silent", action="store_true", dest="opt_slient", help=ST.HLP_RETURN_NO_DISPLAY)\r
110\r
111 Parser.add_option("-q", "--quiet", action="store_true", dest="opt_quiet", help=ST.HLP_RETURN_AND_DISPLAY)\r
112\r
113 Parser.add_option("-i", "--install", action="store", type="string", dest="Install_Distribution_Package_File",\r
114 help=ST.HLP_SPECIFY_PACKAGE_NAME_INSTALL)\r
115\r
116 Parser.add_option("-c", "--create", action="store", type="string", dest="Create_Distribution_Package_File",\r
117 help=ST.HLP_SPECIFY_PACKAGE_NAME_CREATE)\r
118\r
119 Parser.add_option("-r", "--remove", action="store", type="string", dest="Remove_Distribution_Package_File",\r
120 help=ST.HLP_SPECIFY_PACKAGE_NAME_REMOVE)\r
121\r
122 Parser.add_option("-t", "--template", action="store", type="string", dest="Package_Information_Data_File",\r
123 help=ST.HLP_SPECIFY_TEMPLATE_NAME_CREATE)\r
124\r
125 Parser.add_option("-p", "--dec-filename", action="append", type="string", dest="EDK2_DEC_Filename",\r
126 help=ST.HLP_SPECIFY_DEC_NAME_CREATE)\r
127\r
128 Parser.add_option("-m", "--inf-filename", action="append", type="string", dest="EDK2_INF_Filename",\r
129 help=ST.HLP_SPECIFY_INF_NAME_CREATE)\r
130\r
421ccda3
HC
131 Parser.add_option("-l", "--list", action="store_true", dest="List_Dist_Installed",\r
132 help=ST.HLP_LIST_DIST_INSTALLED)\r
133\r
4234283c
LG
134 Parser.add_option("-f", "--force", action="store_true", dest="Yes", help=ST.HLP_DISABLE_PROMPT)\r
135\r
136 Parser.add_option("-n", "--custom-path", action="store_true", dest="CustomPath", help=ST.HLP_CUSTOM_PATH_PROMPT)\r
137\r
138 Parser.add_option("-x", "--free-lock", action="store_true", dest="SkipLock", help=ST.HLP_SKIP_LOCK_CHECK)\r
139\r
421ccda3
HC
140 Parser.add_option("-u", "--replace", action="store", type="string", dest="Replace_Distribution_Package_File",\r
141 help=ST.HLP_SPECIFY_PACKAGE_NAME_REPLACE)\r
142\r
143 Parser.add_option("-o", "--original", action="store", type="string", dest="Original_Distribution_Package_File",\r
144 help=ST.HLP_SPECIFY_PACKAGE_NAME_TO_BE_REPLACED)\r
145\r
146 Parser.add_option("--use-guided-paths", action="store_true", dest="Use_Guided_Paths", help=ST.HLP_USE_GUIDED_PATHS)\r
147\r
4234283c
LG
148 Opt = Parser.parse_args()[0]\r
149\r
150 Var2Var = [\r
151 ("PackageInformationDataFile", Opt.Package_Information_Data_File),\r
152 ("PackFileToInstall", Opt.Install_Distribution_Package_File),\r
153 ("PackFileToCreate", Opt.Create_Distribution_Package_File),\r
154 ("PackFileToRemove", Opt.Remove_Distribution_Package_File),\r
155 ("PackageFileList", Opt.EDK2_DEC_Filename),\r
421ccda3
HC
156 ("ModuleFileList", Opt.EDK2_INF_Filename),\r
157 ("InventoryWs", Opt.List_Dist_Installed),\r
158 ("PackFileToReplace", Opt.Replace_Distribution_Package_File),\r
159 ("PackFileToBeReplaced", Opt.Original_Distribution_Package_File),\r
160 ("UseGuidedPkgPath", Opt.Use_Guided_Paths),\r
4234283c 161 ]\r
421ccda3 162\r
4234283c
LG
163 for Var in Var2Var:\r
164 setattr(Opt, Var[0], Var[1])\r
165\r
166 try:\r
421ccda3 167 GlobalData.gWORKSPACE = GetWorkspace()\r
4234283c
LG
168 except FatalError, XExcept:\r
169 if Logger.GetLevel() <= Logger.DEBUG_9:\r
170 Logger.Quiet(ST.MSG_PYTHON_ON % (python_version(), platform) + format_exc())\r
171 return XExcept.args[0]\r
172\r
421ccda3
HC
173 # Start *********************************************\r
174 # Support WORKSPACE is a long path\r
175 # Only work well on windows\r
176 # Linux Solution TBD\r
177 if pf.system() == 'Windows':\r
178 os.system('@echo off\nsubst b: /D')\r
179 os.system('subst b: "%s"' % GlobalData.gWORKSPACE)\r
180 GlobalData.gWORKSPACE = 'B:\\'\r
181 # End ***********************************************\r
182\r
4234283c
LG
183 WorkspaceDir = GlobalData.gWORKSPACE\r
184\r
185 SetLogLevel(Opt)\r
186\r
421ccda3
HC
187 Mgr = FileHook.RecoverMgr(WorkspaceDir)\r
188 FileHook.SetRecoverMgr(Mgr)\r
189\r
190 GlobalData.gDB = IpiDatabase(os.path.normpath(os.path.join(WorkspaceDir, \\r
191 "Conf/DistributionPackageDatabase.db")), WorkspaceDir)\r
4234283c
LG
192 GlobalData.gDB.InitDatabase(Opt.SkipLock)\r
193\r
194 #\r
195 # Make sure the Db will get closed correctly\r
196 #\r
197 try:\r
198 ReturnCode = 0\r
199 CheckConflictOption(Opt)\r
200\r
201 RunModule = None\r
202 if Opt.PackFileToCreate:\r
203 if Opt.PackageInformationDataFile:\r
204 if not os.path.exists(Opt.PackageInformationDataFile):\r
205 if not os.path.exists(os.path.join(WorkspaceDir, Opt.PackageInformationDataFile)):\r
206 Logger.Error("\nUPT", FILE_NOT_FOUND, ST.ERR_NO_TEMPLATE_FILE % Opt.PackageInformationDataFile)\r
207 else:\r
208 Opt.PackageInformationDataFile = os.path.join(WorkspaceDir, Opt.PackageInformationDataFile)\r
209 else:\r
210 Logger.Error("UPT", OPTION_MISSING, ExtraData=ST.ERR_REQUIRE_T_OPTION)\r
211 if not Opt.PackFileToCreate.endswith('.dist'):\r
212 Logger.Error("CreatePkg", FILE_TYPE_MISMATCH, ExtraData=ST.ERR_DIST_EXT_ERROR % Opt.PackFileToCreate)\r
213 RunModule = MkPkg.Main\r
214\r
215 elif Opt.PackFileToInstall:\r
216 if not Opt.PackFileToInstall.endswith('.dist'):\r
217 Logger.Error("InstallPkg", FILE_TYPE_MISMATCH, ExtraData=ST.ERR_DIST_EXT_ERROR % Opt.PackFileToInstall)\r
421ccda3
HC
218\r
219 AbsPath = GetFullPathDist(Opt.PackFileToInstall, WorkspaceDir)\r
220 if not AbsPath:\r
4234283c
LG
221 Logger.Error("InstallPkg", FILE_NOT_FOUND, ST.ERR_INSTALL_DIST_NOT_FOUND % Opt.PackFileToInstall)\r
222\r
421ccda3 223 Opt.PackFileToInstall = AbsPath\r
4234283c
LG
224 setattr(Opt, 'PackageFile', Opt.PackFileToInstall)\r
225 RunModule = InstallPkg.Main\r
226\r
227 elif Opt.PackFileToRemove:\r
228 if not Opt.PackFileToRemove.endswith('.dist'):\r
229 Logger.Error("RemovePkg", FILE_TYPE_MISMATCH, ExtraData=ST.ERR_DIST_EXT_ERROR % Opt.PackFileToRemove)\r
230 head, tail = os.path.split(Opt.PackFileToRemove)\r
231 if head or not tail:\r
232 Logger.Error("RemovePkg",\r
233 FILE_TYPE_MISMATCH,\r
234 ExtraData=ST.ERR_DIST_FILENAME_ONLY_FOR_REMOVE % Opt.PackFileToRemove)\r
235\r
236 setattr(Opt, 'DistributionFile', Opt.PackFileToRemove)\r
237 RunModule = RmPkg.Main\r
421ccda3
HC
238 elif Opt.InventoryWs:\r
239 RunModule = InventoryWs.Main\r
240\r
241 elif Opt.PackFileToBeReplaced and not Opt.PackFileToReplace:\r
242 Logger.Error("ReplacePkg", OPTION_MISSING, ExtraData=ST.ERR_REQUIRE_U_OPTION)\r
243\r
244 elif Opt.PackFileToReplace:\r
245 if not Opt.PackFileToReplace.endswith('.dist'):\r
246 Logger.Error("ReplacePkg", FILE_TYPE_MISMATCH, ExtraData=ST.ERR_DIST_EXT_ERROR % Opt.PackFileToReplace)\r
247 if not Opt.PackFileToBeReplaced:\r
248 Logger.Error("ReplacePkg", OPTION_MISSING, ExtraData=ST.ERR_REQUIRE_O_OPTION)\r
249 if not Opt.PackFileToBeReplaced.endswith('.dist'):\r
250 Logger.Error("ReplacePkg",\r
251 FILE_TYPE_MISMATCH,\r
252 ExtraData=ST.ERR_DIST_EXT_ERROR % Opt.PackFileToBeReplaced)\r
253\r
254 head, tail = os.path.split(Opt.PackFileToBeReplaced)\r
255 if head or not tail:\r
256 Logger.Error("ReplacePkg",\r
257 FILE_TYPE_MISMATCH,\r
258 ExtraData=ST.ERR_DIST_FILENAME_ONLY_FOR_REPLACE_ORIG % Opt.PackFileToBeReplaced)\r
259\r
260 AbsPath = GetFullPathDist(Opt.PackFileToReplace, WorkspaceDir)\r
261 if not AbsPath:\r
262 Logger.Error("ReplacePkg", FILE_NOT_FOUND, ST.ERR_REPLACE_DIST_NOT_FOUND % Opt.PackFileToReplace)\r
263\r
264 Opt.PackFileToReplace = AbsPath\r
265 RunModule = ReplacePkg.Main\r
266\r
4234283c
LG
267 else:\r
268 Parser.print_usage()\r
269 return OPTION_MISSING\r
270\r
271 ReturnCode = RunModule(Opt)\r
272 except FatalError, XExcept:\r
273 ReturnCode = XExcept.args[0]\r
274 if Logger.GetLevel() <= Logger.DEBUG_9:\r
275 Logger.Quiet(ST.MSG_PYTHON_ON % (python_version(), platform) + \\r
276 format_exc())\r
277 finally:\r
421ccda3 278 try:\r
af0c61ae 279 if ReturnCode != 0 and ReturnCode != UPT_ALREADY_INSTALLED_ERROR:\r
421ccda3
HC
280 Logger.Quiet(ST.MSG_RECOVER_START)\r
281 GlobalData.gDB.RollBack()\r
282 Mgr.rollback()\r
283 Logger.Quiet(ST.MSG_RECOVER_DONE)\r
284 else:\r
285 GlobalData.gDB.Commit()\r
286 Mgr.commit()\r
287 except StandardError:\r
288 Logger.Quiet(ST.MSG_RECOVER_FAIL)\r
4234283c 289 GlobalData.gDB.CloseDb()\r
421ccda3
HC
290 if pf.system() == 'Windows':\r
291 os.system('subst b: /D')\r
4234283c
LG
292\r
293 return ReturnCode\r
294\r
421ccda3
HC
295## GetFullPathDist\r
296#\r
297# This function will check DistFile existence, if not absolute path, then try current working directory,\r
298# then $(WORKSPACE),and return the AbsPath. If file doesn't find, then return None\r
299#\r
300# @param DistFile: The distribution file in either relative path or absolute path\r
301# @param WorkspaceDir: Workspace Directory\r
302# @return AbsPath: The Absolute path of the distribution file if existed, None else\r
303#\r
304def GetFullPathDist(DistFile, WorkspaceDir):\r
305 if os.path.isabs(DistFile):\r
306 if not (os.path.exists(DistFile) and os.path.isfile(DistFile)):\r
307 return None\r
308 else:\r
309 return DistFile\r
310 else:\r
311 AbsPath = os.path.normpath(os.path.join(os.getcwd(), DistFile))\r
312 if not (os.path.exists(AbsPath) and os.path.isfile(AbsPath)):\r
313 AbsPath = os.path.normpath(os.path.join(WorkspaceDir, DistFile))\r
314 if not (os.path.exists(AbsPath) and os.path.isfile(AbsPath)):\r
315 return None\r
316\r
317 return AbsPath\r
318\r
4234283c
LG
319if __name__ == '__main__':\r
320 RETVAL = Main()\r
321 #\r
322 # 0-127 is a safe return range, and 1 is a standard default error\r
323 #\r
324 if RETVAL < 0 or RETVAL > 127:\r
325 RETVAL = 1\r
326 sys.exit(RETVAL)\r