]> git.proxmox.com Git - mirror_edk2.git/blob - BaseTools/Source/Python/UPT/UPT.py
Sync BaseTools Branch (version r2271) to EDKII main trunk.
[mirror_edk2.git] / BaseTools / Source / Python / UPT / UPT.py
1 ## @file
2 #
3 # This file is the main entry for UPT
4 #
5 # Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
6 #
7 # This program and the accompanying materials are licensed and made available
8 # under the terms and conditions of the BSD License which accompanies this
9 # distribution. The full text of the license may be found at
10 # http://opensource.org/licenses/bsd-license.php
11 #
12 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
14 #
15
16 '''
17 UPT
18 '''
19
20 ## import modules
21 #
22 import sys
23 import os.path
24 from os import environ
25 from sys import platform
26 from optparse import OptionParser
27 from traceback import format_exc
28 from platform import python_version
29
30 from Logger import StringTable as ST
31 import Logger.Log as Logger
32 from Logger.StringTable import MSG_VERSION
33 from Logger.StringTable import MSG_DESCRIPTION
34 from Logger.StringTable import MSG_USAGE
35 from Logger.ToolError import FILE_NOT_FOUND
36 from Logger.ToolError import OPTION_MISSING
37 from Logger.ToolError import FILE_TYPE_MISMATCH
38 from Logger.ToolError import OPTION_CONFLICT
39 from Logger.ToolError import FatalError
40 import MkPkg
41 import InstallPkg
42 import RmPkg
43 from Library.Misc import CheckEnvVariable
44 from Library import GlobalData
45 from Core.IpiDb import IpiDatabase
46
47 ##
48 # Version and Copyright
49 #
50 #VersionNumber = "1.0"
51 #__version__ = "Revision " + VersionNumber
52 #__copyright__ = "Copyright (c) 2011 Intel Corporation All Rights Reserved."
53
54 ## CheckConflictOption
55 #
56 # CheckConflictOption
57 #
58 def CheckConflictOption(Opt):
59 if (Opt.PackFileToCreate and Opt.PackFileToInstall and Opt.PackFileToRemove):
60 Logger.Error("UPT", OPTION_CONFLICT, ExtraData=ST.ERR_REQUIRE_I_C_R_OPTION)
61 elif Opt.PackFileToCreate and Opt.PackFileToInstall:
62 Logger.Error("UPT", OPTION_CONFLICT, ExtraData=ST.ERR_I_C_EXCLUSIVE)
63 elif Opt.PackFileToInstall and Opt.PackFileToRemove:
64 Logger.Error("UPT", OPTION_CONFLICT, ExtraData=ST.ERR_I_R_EXCLUSIVE)
65 elif Opt.PackFileToCreate and Opt.PackFileToRemove:
66 Logger.Error("UPT", OPTION_CONFLICT, ExtraData=ST.ERR_C_R_EXCLUSIVE)
67
68 ## SetLogLevel
69 #
70 def SetLogLevel(Opt):
71 if Opt.opt_verbose:
72 Logger.SetLevel(Logger.VERBOSE)
73 elif Opt.opt_quiet:
74 Logger.SetLevel(Logger.QUIET + 1)
75 elif Opt.debug_level != None:
76 if Opt.debug_level < 0 or Opt.debug_level > 9:
77 Logger.Warn("UPT", ST.ERR_DEBUG_LEVEL)
78 Logger.SetLevel(Logger.INFO)
79 else:
80 Logger.SetLevel(Opt.debug_level + 1)
81 elif Opt.opt_slient:
82 Logger.SetLevel(Logger.SILENT)
83 else:
84 Logger.SetLevel(Logger.INFO)
85
86 ## Main
87 #
88 # Main
89 #
90 def Main():
91 Logger.Initialize()
92
93 Parser = OptionParser(version=MSG_VERSION, description=MSG_DESCRIPTION,
94 prog="UPT.exe", usage=MSG_USAGE)
95
96 Parser.add_option("-d", "--debug", action="store", type="int", dest="debug_level", help=ST.HLP_PRINT_DEBUG_INFO)
97
98 Parser.add_option("-v", "--verbose", action="store_true", dest="opt_verbose",
99 help=ST.HLP_PRINT_INFORMATIONAL_STATEMENT)
100
101 Parser.add_option("-s", "--silent", action="store_true", dest="opt_slient", help=ST.HLP_RETURN_NO_DISPLAY)
102
103 Parser.add_option("-q", "--quiet", action="store_true", dest="opt_quiet", help=ST.HLP_RETURN_AND_DISPLAY)
104
105 Parser.add_option("-i", "--install", action="store", type="string", dest="Install_Distribution_Package_File",
106 help=ST.HLP_SPECIFY_PACKAGE_NAME_INSTALL)
107
108 Parser.add_option("-c", "--create", action="store", type="string", dest="Create_Distribution_Package_File",
109 help=ST.HLP_SPECIFY_PACKAGE_NAME_CREATE)
110
111 Parser.add_option("-r", "--remove", action="store", type="string", dest="Remove_Distribution_Package_File",
112 help=ST.HLP_SPECIFY_PACKAGE_NAME_REMOVE)
113
114 Parser.add_option("-t", "--template", action="store", type="string", dest="Package_Information_Data_File",
115 help=ST.HLP_SPECIFY_TEMPLATE_NAME_CREATE)
116
117 Parser.add_option("-p", "--dec-filename", action="append", type="string", dest="EDK2_DEC_Filename",
118 help=ST.HLP_SPECIFY_DEC_NAME_CREATE)
119
120 Parser.add_option("-m", "--inf-filename", action="append", type="string", dest="EDK2_INF_Filename",
121 help=ST.HLP_SPECIFY_INF_NAME_CREATE)
122
123 Parser.add_option("-f", "--force", action="store_true", dest="Yes", help=ST.HLP_DISABLE_PROMPT)
124
125 Parser.add_option("-n", "--custom-path", action="store_true", dest="CustomPath", help=ST.HLP_CUSTOM_PATH_PROMPT)
126
127 Parser.add_option("-x", "--free-lock", action="store_true", dest="SkipLock", help=ST.HLP_SKIP_LOCK_CHECK)
128
129 Opt = Parser.parse_args()[0]
130
131 Var2Var = [
132 ("PackageInformationDataFile", Opt.Package_Information_Data_File),
133 ("PackFileToInstall", Opt.Install_Distribution_Package_File),
134 ("PackFileToCreate", Opt.Create_Distribution_Package_File),
135 ("PackFileToRemove", Opt.Remove_Distribution_Package_File),
136 ("PackageFileList", Opt.EDK2_DEC_Filename),
137 ("ModuleFileList", Opt.EDK2_INF_Filename)
138 ]
139 for Var in Var2Var:
140 setattr(Opt, Var[0], Var[1])
141
142 try:
143 CheckEnvVariable()
144 except FatalError, XExcept:
145 if Logger.GetLevel() <= Logger.DEBUG_9:
146 Logger.Quiet(ST.MSG_PYTHON_ON % (python_version(), platform) + format_exc())
147 return XExcept.args[0]
148
149 GlobalData.gWORKSPACE = os.path.normpath(environ["WORKSPACE"])
150 WorkspaceDir = GlobalData.gWORKSPACE
151
152 SetLogLevel(Opt)
153
154 GlobalData.gDB = IpiDatabase(os.path.normpath(os.path.join(WorkspaceDir, "Conf/DistributionPackageDatabase.db")))
155 GlobalData.gDB.InitDatabase(Opt.SkipLock)
156
157 #
158 # Make sure the Db will get closed correctly
159 #
160 try:
161 ReturnCode = 0
162 CheckConflictOption(Opt)
163
164 RunModule = None
165 if Opt.PackFileToCreate:
166 if Opt.PackageInformationDataFile:
167 if not os.path.exists(Opt.PackageInformationDataFile):
168 if not os.path.exists(os.path.join(WorkspaceDir, Opt.PackageInformationDataFile)):
169 Logger.Error("\nUPT", FILE_NOT_FOUND, ST.ERR_NO_TEMPLATE_FILE % Opt.PackageInformationDataFile)
170 else:
171 Opt.PackageInformationDataFile = os.path.join(WorkspaceDir, Opt.PackageInformationDataFile)
172 else:
173 Logger.Error("UPT", OPTION_MISSING, ExtraData=ST.ERR_REQUIRE_T_OPTION)
174 if not Opt.PackFileToCreate.endswith('.dist'):
175 Logger.Error("CreatePkg", FILE_TYPE_MISMATCH, ExtraData=ST.ERR_DIST_EXT_ERROR % Opt.PackFileToCreate)
176 RunModule = MkPkg.Main
177
178 elif Opt.PackFileToInstall:
179 if not Opt.PackFileToInstall.endswith('.dist'):
180 Logger.Error("InstallPkg", FILE_TYPE_MISMATCH, ExtraData=ST.ERR_DIST_EXT_ERROR % Opt.PackFileToInstall)
181
182 #
183 # check file existence, if not absolute path, then try current working directory, then $(WORKSPACE)
184 #
185 Existed = True
186 if os.path.isabs(Opt.PackFileToInstall):
187 if not (os.path.exists(Opt.PackFileToInstall) and os.path.isfile(Opt.PackFileToInstall)):
188 Existed = False
189 else:
190 AbsPath = os.path.normpath(os.path.join(os.getcwd(), Opt.PackFileToInstall))
191 if not (os.path.exists(AbsPath) and os.path.isfile(AbsPath)):
192 AbsPath = os.path.normpath(os.path.join(WorkspaceDir, Opt.PackFileToInstall))
193 if not (os.path.exists(AbsPath) and os.path.isfile(AbsPath)):
194 Existed = False
195
196 if Existed:
197 Opt.PackFileToInstall = AbsPath
198
199 if not Existed:
200 Logger.Error("InstallPkg", FILE_NOT_FOUND, ST.ERR_INSTALL_DIST_NOT_FOUND % Opt.PackFileToInstall)
201
202 setattr(Opt, 'PackageFile', Opt.PackFileToInstall)
203 RunModule = InstallPkg.Main
204
205 elif Opt.PackFileToRemove:
206 if not Opt.PackFileToRemove.endswith('.dist'):
207 Logger.Error("RemovePkg", FILE_TYPE_MISMATCH, ExtraData=ST.ERR_DIST_EXT_ERROR % Opt.PackFileToRemove)
208 head, tail = os.path.split(Opt.PackFileToRemove)
209 if head or not tail:
210 Logger.Error("RemovePkg",
211 FILE_TYPE_MISMATCH,
212 ExtraData=ST.ERR_DIST_FILENAME_ONLY_FOR_REMOVE % Opt.PackFileToRemove)
213
214 setattr(Opt, 'DistributionFile', Opt.PackFileToRemove)
215 RunModule = RmPkg.Main
216 else:
217 Parser.print_usage()
218 return OPTION_MISSING
219
220 ReturnCode = RunModule(Opt)
221 except FatalError, XExcept:
222 ReturnCode = XExcept.args[0]
223 if Logger.GetLevel() <= Logger.DEBUG_9:
224 Logger.Quiet(ST.MSG_PYTHON_ON % (python_version(), platform) + \
225 format_exc())
226 finally:
227 GlobalData.gDB.CloseDb()
228
229 return ReturnCode
230
231 if __name__ == '__main__':
232 RETVAL = Main()
233 #
234 # 0-127 is a safe return range, and 1 is a standard default error
235 #
236 if RETVAL < 0 or RETVAL > 127:
237 RETVAL = 1
238 sys.exit(RETVAL)