Ignore deprecation warnings for now
[bitbake.git] / bin / bitbake
1 #!/usr/bin/env python
2 # ex:ts=4:sw=4:sts=4:et
3 # -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-
4 #
5 # Copyright (C) 2003, 2004  Chris Larson
6 # Copyright (C) 2003, 2004  Phil Blundell
7 # Copyright (C) 2003 - 2005 Michael 'Mickey' Lauer
8 # Copyright (C) 2005        Holger Hans Peter Freyther
9 # Copyright (C) 2005        ROAD GmbH
10 # Copyright (C) 2006        Richard Purdie
11 #
12 # This program is free software; you can redistribute it and/or modify
13 # it under the terms of the GNU General Public License version 2 as
14 # published by the Free Software Foundation.
15 #
16 # This program is distributed in the hope that it will be useful,
17 # but WITHOUT ANY WARRANTY; without even the implied warranty of
18 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19 # GNU General Public License for more details.
20 #
21 # You should have received a copy of the GNU General Public License along
22 # with this program; if not, write to the Free Software Foundation, Inc.,
23 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24
25 import sys, os, optparse
26 sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(sys.argv[0])),
27                                 'lib'))
28
29 import warnings
30 import bb
31 import bb.msg
32 from bb import cooker
33 from bb import ui
34 from bb import server
35 from bb.server import none
36 #from bb.server import xmlrpc
37
38 __version__ = "1.9.0"
39
40 if sys.hexversion < 0x020600F0:
41     print "Sorry, python 2.6 or later is required for this version of bitbake"
42     sys.exit(1)
43
44
45 #============================================================================#
46 # BBOptions
47 #============================================================================#
48 class BBConfiguration(object):
49     """
50     Manages build options and configurations for one run
51     """
52
53     def __init__(self, options):
54         for key, val in options.__dict__.items():
55             setattr(self, key, val)
56         self.pkgs_to_build = []
57
58
59 def print_exception(exc, value, tb):
60     """
61     Print the exception to stderr, only showing the traceback if bitbake
62     debugging is enabled.
63     """
64     if not bb.msg.debug_level['default']:
65         tb = None
66
67     sys.__excepthook__(exc, value, tb)
68
69 sys.excepthook = print_exception
70
71
72 _warnings_showwarning = warnings.showwarning
73 def _showwarning(message, category, filename, lineno, file=None, line=None):
74     """Display python warning messages using bb.msg"""
75     if file is not None:
76         if _warnings_showwarning is not None:
77             _warnings_showwarning(message, category, filename, lineno, file, line)
78     else:
79         s = warnings.formatwarning(message, category, filename, lineno)
80         s = s.split("\n")[0]
81         bb.msg.warn(None, s)
82
83 warnings.showwarning = _showwarning
84 warnings.simplefilter("ignore", DeprecationWarning)
85
86 #============================================================================#
87 # main
88 #============================================================================#
89
90 def main():
91     return_value = 0
92     pythonver = sys.version_info
93     if pythonver[0] < 2 or (pythonver[0] == 2 and pythonver[1] < 5):
94         print "Sorry, bitbake needs python 2.5 or later."
95         sys.exit(1)
96
97     parser = optparse.OptionParser(
98         version = "BitBake Build Tool Core version %s, %%prog version %s" % (bb.__version__, __version__),
99         usage = """%prog [options] [package ...]
100
101 Executes the specified task (default is 'build') for a given set of BitBake files.
102 It expects that BBFILES is defined, which is a space separated list of files to
103 be executed.  BBFILES does support wildcards.
104 Default BBFILES are the .bb files in the current directory.""")
105
106     parser.add_option("-b", "--buildfile", help = "execute the task against this .bb file, rather than a package from BBFILES.",
107                action = "store", dest = "buildfile", default = None)
108
109     parser.add_option("-k", "--continue", help = "continue as much as possible after an error. While the target that failed, and those that depend on it, cannot be remade, the other dependencies of these targets can be processed all the same.",
110                action = "store_false", dest = "abort", default = True)
111
112     parser.add_option("-a", "--tryaltconfigs", help = "continue with builds by trying to use alternative providers where possible.",
113                action = "store_true", dest = "tryaltconfigs", default = False)
114
115     parser.add_option("-f", "--force", help = "force run of specified cmd, regardless of stamp status",
116                action = "store_true", dest = "force", default = False)
117
118     parser.add_option("-i", "--interactive", help = "drop into the interactive mode also called the BitBake shell.",
119                action = "store_true", dest = "interactive", default = False)
120
121     parser.add_option("-c", "--cmd", help = "Specify task to execute. Note that this only executes the specified task for the providee and the packages it depends on, i.e. 'compile' does not implicitly call stage for the dependencies (IOW: use only if you know what you are doing). Depending on the base.bbclass a listtasks tasks is defined and will show available tasks",
122                action = "store", dest = "cmd")
123
124     parser.add_option("-r", "--read", help = "read the specified file before bitbake.conf",
125                action = "append", dest = "file", default = [])
126
127     parser.add_option("-v", "--verbose", help = "output more chit-chat to the terminal",
128                action = "store_true", dest = "verbose", default = False)
129
130     parser.add_option("-D", "--debug", help = "Increase the debug level. You can specify this more than once.",
131                action = "count", dest="debug", default = 0)
132
133     parser.add_option("-n", "--dry-run", help = "don't execute, just go through the motions",
134                action = "store_true", dest = "dry_run", default = False)
135
136     parser.add_option("-p", "--parse-only", help = "quit after parsing the BB files (developers only)",
137                action = "store_true", dest = "parse_only", default = False)
138
139     parser.add_option("-d", "--disable-psyco", help = "disable using the psyco just-in-time compiler (not recommended)",
140                action = "store_true", dest = "disable_psyco", default = False)
141
142     parser.add_option("-s", "--show-versions", help = "show current and preferred versions of all packages",
143                action = "store_true", dest = "show_versions", default = False)
144
145     parser.add_option("-e", "--environment", help = "show the global or per-package environment (this is what used to be bbread)",
146                action = "store_true", dest = "show_environment", default = False)
147
148     parser.add_option("-g", "--graphviz", help = "emit the dependency trees of the specified packages in the dot syntax",
149                 action = "store_true", dest = "dot_graph", default = False)
150
151     parser.add_option("-I", "--ignore-deps", help = """Assume these dependencies don't exist and are already provided (equivalent to ASSUME_PROVIDED). Useful to make dependency graphs more appealing""",
152                 action = "append", dest = "extra_assume_provided", default = [])
153
154     parser.add_option("-l", "--log-domains", help = """Show debug logging for the specified logging domains""",
155                 action = "append", dest = "debug_domains", default = [])
156
157     parser.add_option("-P", "--profile", help = "profile the command and print a report",
158                action = "store_true", dest = "profile", default = False)
159
160     parser.add_option("-u", "--ui", help = "userinterface to use",
161                action = "store", dest = "ui")
162
163     parser.add_option("", "--revisions-changed", help = "Set the exit code depending on whether upstream floating revisions have changed or not",
164                action = "store_true", dest = "revisions_changed", default = False)
165
166     options, args = parser.parse_args(sys.argv)
167
168     configuration = BBConfiguration(options)
169     configuration.pkgs_to_build.extend(args[1:])
170
171     #server = bb.server.xmlrpc
172     server = bb.server.none
173
174     # Save a logfile for cooker into the current working directory. When the
175     # server is daemonized this logfile will be truncated.
176     cooker_logfile = os.path.join(os.getcwd(), "cooker.log")
177
178     cooker = bb.cooker.BBCooker(configuration, server)
179
180     # Clear away any spurious environment variables. But don't wipe the
181     # environment totally. This is necessary to ensure the correct operation
182     # of the UIs (e.g. for DISPLAY, etc.)
183     bb.utils.clean_environment()
184
185     cooker.parseCommandLine()
186
187     serverinfo = server.BitbakeServerInfo(cooker.server)
188
189     server.BitBakeServerFork(serverinfo, cooker.serve, cooker_logfile)
190     del cooker
191
192     # Setup a connection to the server (cooker)
193     serverConnection = server.BitBakeServerConnection(serverinfo)
194
195     # Launch the UI
196     if configuration.ui:
197         ui = configuration.ui
198     else:
199         ui = "knotty"
200
201     try:
202         # Dynamically load the UI based on the ui name. Although we
203         # suggest a fixed set this allows you to have flexibility in which
204         # ones are available.
205         uimodule = __import__("bb.ui", fromlist = [ui])
206         return_value = getattr(uimodule, ui).init(serverConnection.connection, serverConnection.events)
207     except AttributeError:
208         print "FATAL: Invalid user interface '%s' specified. " % ui
209         print "Valid interfaces are 'ncurses', 'depexp' or the default, 'knotty'."
210     except Exception, e:
211         print "FATAL: Unable to start to '%s' UI due to exception: %s." % (configuration.ui, e)
212     finally:
213         serverConnection.terminate()
214         return return_value
215
216 if __name__ == "__main__":
217     ret = main()
218     sys.exit(ret)