]> git.proxmox.com Git - mirror_edk2.git/blob - BaseTools/Source/Python/UPT/UPT.py
Sync BaseTool trunk (version r2601) into EDKII BaseTools.
[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 from BuildVersion import gBUILD_VERSION
47
48 ##
49 # Version and Copyright
50 #
51 #VersionNumber = "1.0"
52 #__version__ = "Revision " + VersionNumber
53 #__copyright__ = "Copyright (c) 2011 Intel Corporation All Rights Reserved."
54
55 ## CheckConflictOption
56 #
57 # CheckConflictOption
58 #
59 def CheckConflictOption(Opt):
60 if (Opt.PackFileToCreate and Opt.PackFileToInstall and Opt.PackFileToRemove):
61 Logger.Error("UPT", OPTION_CONFLICT, ExtraData=ST.ERR_REQUIRE_I_C_R_OPTION)
62 elif Opt.PackFileToCreate and Opt.PackFileToInstall:
63 Logger.Error("UPT", OPTION_CONFLICT, ExtraData=ST.ERR_I_C_EXCLUSIVE)
64 elif Opt.PackFileToInstall and Opt.PackFileToRemove:
65 Logger.Error("UPT", OPTION_CONFLICT, ExtraData=ST.ERR_I_R_EXCLUSIVE)
66 elif Opt.PackFileToCreate and Opt.PackFileToRemove:
67 Logger.Error("UPT", OPTION_CONFLICT, ExtraData=ST.ERR_C_R_EXCLUSIVE)
68
69 ## SetLogLevel
70 #
71 def SetLogLevel(Opt):
72 if Opt.opt_verbose:
73 Logger.SetLevel(Logger.VERBOSE)
74 elif Opt.opt_quiet:
75 Logger.SetLevel(Logger.QUIET + 1)
76 elif Opt.debug_level != None:
77 if Opt.debug_level < 0 or Opt.debug_level > 9:
78 Logger.Warn("UPT", ST.ERR_DEBUG_LEVEL)
79 Logger.SetLevel(Logger.INFO)
80 else:
81 Logger.SetLevel(Opt.debug_level + 1)
82 elif Opt.opt_slient:
83 Logger.SetLevel(Logger.SILENT)
84 else:
85 Logger.SetLevel(Logger.INFO)
86
87 ## Main
88 #
89 # Main
90 #
91 def Main():
92 Logger.Initialize()
93
94 Parser = OptionParser(version=(MSG_VERSION + ' ' + gBUILD_VERSION), description=MSG_DESCRIPTION,
95 prog="UPT.exe", usage=MSG_USAGE)
96
97 Parser.add_option("-d", "--debug", action="store", type="int", dest="debug_level", help=ST.HLP_PRINT_DEBUG_INFO)
98
99 Parser.add_option("-v", "--verbose", action="store_true", dest="opt_verbose",
100 help=ST.HLP_PRINT_INFORMATIONAL_STATEMENT)
101
102 Parser.add_option("-s", "--silent", action="store_true", dest="opt_slient", help=ST.HLP_RETURN_NO_DISPLAY)
103
104 Parser.add_option("-q", "--quiet", action="store_true", dest="opt_quiet", help=ST.HLP_RETURN_AND_DISPLAY)
105
106 Parser.add_option("-i", "--install", action="store", type="string", dest="Install_Distribution_Package_File",
107 help=ST.HLP_SPECIFY_PACKAGE_NAME_INSTALL)
108
109 Parser.add_option("-c", "--create", action="store", type="string", dest="Create_Distribution_Package_File",
110 help=ST.HLP_SPECIFY_PACKAGE_NAME_CREATE)
111
112 Parser.add_option("-r", "--remove", action="store", type="string", dest="Remove_Distribution_Package_File",
113 help=ST.HLP_SPECIFY_PACKAGE_NAME_REMOVE)
114
115 Parser.add_option("-t", "--template", action="store", type="string", dest="Package_Information_Data_File",
116 help=ST.HLP_SPECIFY_TEMPLATE_NAME_CREATE)
117
118 Parser.add_option("-p", "--dec-filename", action="append", type="string", dest="EDK2_DEC_Filename",
119 help=ST.HLP_SPECIFY_DEC_NAME_CREATE)
120
121 Parser.add_option("-m", "--inf-filename", action="append", type="string", dest="EDK2_INF_Filename",
122 help=ST.HLP_SPECIFY_INF_NAME_CREATE)
123
124 Parser.add_option("-f", "--force", action="store_true", dest="Yes", help=ST.HLP_DISABLE_PROMPT)
125
126 Parser.add_option("-n", "--custom-path", action="store_true", dest="CustomPath", help=ST.HLP_CUSTOM_PATH_PROMPT)
127
128 Parser.add_option("-x", "--free-lock", action="store_true", dest="SkipLock", help=ST.HLP_SKIP_LOCK_CHECK)
129
130 Opt = Parser.parse_args()[0]
131
132 Var2Var = [
133 ("PackageInformationDataFile", Opt.Package_Information_Data_File),
134 ("PackFileToInstall", Opt.Install_Distribution_Package_File),
135 ("PackFileToCreate", Opt.Create_Distribution_Package_File),
136 ("PackFileToRemove", Opt.Remove_Distribution_Package_File),
137 ("PackageFileList", Opt.EDK2_DEC_Filename),
138 ("ModuleFileList", Opt.EDK2_INF_Filename)
139 ]
140 for Var in Var2Var:
141 setattr(Opt, Var[0], Var[1])
142
143 try:
144 CheckEnvVariable()
145 except FatalError, XExcept:
146 if Logger.GetLevel() <= Logger.DEBUG_9:
147 Logger.Quiet(ST.MSG_PYTHON_ON % (python_version(), platform) + format_exc())
148 return XExcept.args[0]
149
150 GlobalData.gWORKSPACE = os.path.normpath(environ["WORKSPACE"])
151 WorkspaceDir = GlobalData.gWORKSPACE
152
153 SetLogLevel(Opt)
154
155 GlobalData.gDB = IpiDatabase(os.path.normpath(os.path.join(WorkspaceDir, "Conf/DistributionPackageDatabase.db")))
156 GlobalData.gDB.InitDatabase(Opt.SkipLock)
157
158 #
159 # Make sure the Db will get closed correctly
160 #
161 try:
162 ReturnCode = 0
163 CheckConflictOption(Opt)
164
165 RunModule = None
166 if Opt.PackFileToCreate:
167 if Opt.PackageInformationDataFile:
168 if not os.path.exists(Opt.PackageInformationDataFile):
169 if not os.path.exists(os.path.join(WorkspaceDir, Opt.PackageInformationDataFile)):
170 Logger.Error("\nUPT", FILE_NOT_FOUND, ST.ERR_NO_TEMPLATE_FILE % Opt.PackageInformationDataFile)
171 else:
172 Opt.PackageInformationDataFile = os.path.join(WorkspaceDir, Opt.PackageInformationDataFile)
173 else:
174 Logger.Error("UPT", OPTION_MISSING, ExtraData=ST.ERR_REQUIRE_T_OPTION)
175 if not Opt.PackFileToCreate.endswith('.dist'):
176 Logger.Error("CreatePkg", FILE_TYPE_MISMATCH, ExtraData=ST.ERR_DIST_EXT_ERROR % Opt.PackFileToCreate)
177 RunModule = MkPkg.Main
178
179 elif Opt.PackFileToInstall:
180 if not Opt.PackFileToInstall.endswith('.dist'):
181 Logger.Error("InstallPkg", FILE_TYPE_MISMATCH, ExtraData=ST.ERR_DIST_EXT_ERROR % Opt.PackFileToInstall)
182
183 #
184 # check file existence, if not absolute path, then try current working directory, then $(WORKSPACE)
185 #
186 Existed = True
187 if os.path.isabs(Opt.PackFileToInstall):
188 if not (os.path.exists(Opt.PackFileToInstall) and os.path.isfile(Opt.PackFileToInstall)):
189 Existed = False
190 else:
191 AbsPath = os.path.normpath(os.path.join(os.getcwd(), Opt.PackFileToInstall))
192 if not (os.path.exists(AbsPath) and os.path.isfile(AbsPath)):
193 AbsPath = os.path.normpath(os.path.join(WorkspaceDir, Opt.PackFileToInstall))
194 if not (os.path.exists(AbsPath) and os.path.isfile(AbsPath)):
195 Existed = False
196
197 if Existed:
198 Opt.PackFileToInstall = AbsPath
199
200 if not Existed:
201 Logger.Error("InstallPkg", FILE_NOT_FOUND, ST.ERR_INSTALL_DIST_NOT_FOUND % Opt.PackFileToInstall)
202
203 setattr(Opt, 'PackageFile', Opt.PackFileToInstall)
204 RunModule = InstallPkg.Main
205
206 elif Opt.PackFileToRemove:
207 if not Opt.PackFileToRemove.endswith('.dist'):
208 Logger.Error("RemovePkg", FILE_TYPE_MISMATCH, ExtraData=ST.ERR_DIST_EXT_ERROR % Opt.PackFileToRemove)
209 head, tail = os.path.split(Opt.PackFileToRemove)
210 if head or not tail:
211 Logger.Error("RemovePkg",
212 FILE_TYPE_MISMATCH,
213 ExtraData=ST.ERR_DIST_FILENAME_ONLY_FOR_REMOVE % Opt.PackFileToRemove)
214
215 setattr(Opt, 'DistributionFile', Opt.PackFileToRemove)
216 RunModule = RmPkg.Main
217 else:
218 Parser.print_usage()
219 return OPTION_MISSING
220
221 ReturnCode = RunModule(Opt)
222 except FatalError, XExcept:
223 ReturnCode = XExcept.args[0]
224 if Logger.GetLevel() <= Logger.DEBUG_9:
225 Logger.Quiet(ST.MSG_PYTHON_ON % (python_version(), platform) + \
226 format_exc())
227 finally:
228 GlobalData.gDB.CloseDb()
229
230 return ReturnCode
231
232 if __name__ == '__main__':
233 RETVAL = Main()
234 #
235 # 0-127 is a safe return range, and 1 is a standard default error
236 #
237 if RETVAL < 0 or RETVAL > 127:
238 RETVAL = 1
239 sys.exit(RETVAL)