Update version to 1.13.1
[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 os
26 import sys, logging
27 sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(__file__)),
28                                 'lib'))
29
30 import optparse
31 import warnings
32 from traceback import format_exception
33 try:
34     import bb
35 except RuntimeError, exc:
36     sys.exit(str(exc))
37 from bb import event
38 import bb.msg
39 from bb import cooker
40 from bb import ui
41 from bb import server
42 #from bb.server import none
43 from bb.server import process
44 #from bb.server import xmlrpc
45
46 __version__ = "1.13.1"
47 logger = logging.getLogger("BitBake")
48
49
50
51 class BBConfiguration(object):
52     """
53     Manages build options and configurations for one run
54     """
55
56     def __init__(self, options):
57         for key, val in options.__dict__.items():
58             setattr(self, key, val)
59         self.pkgs_to_build = []
60
61
62 def get_ui(config):
63     if config.ui:
64         interface = config.ui
65     else:
66         interface = 'knotty'
67
68     try:
69         # Dynamically load the UI based on the ui name. Although we
70         # suggest a fixed set this allows you to have flexibility in which
71         # ones are available.
72         module = __import__("bb.ui", fromlist = [interface])
73         return getattr(module, interface).main
74     except AttributeError:
75         sys.exit("FATAL: Invalid user interface '%s' specified.\n"
76                  "Valid interfaces: depexp, goggle, ncurses, knotty [default]." % interface)
77
78
79 # Display bitbake/OE warnings via the BitBake.Warnings logger, ignoring others"""
80 warnlog = logging.getLogger("BitBake.Warnings")
81 _warnings_showwarning = warnings.showwarning
82 def _showwarning(message, category, filename, lineno, file=None, line=None):
83     if file is not None:
84         if _warnings_showwarning is not None:
85             _warnings_showwarning(message, category, filename, lineno, file, line)
86     else:
87         s = warnings.formatwarning(message, category, filename, lineno)
88         warnlog.warn(s)
89
90 warnings.showwarning = _showwarning
91 warnings.filterwarnings("ignore")
92 warnings.filterwarnings("default", module="(<string>$|(oe|bb)\.)")
93 warnings.filterwarnings("ignore", category=PendingDeprecationWarning)
94 warnings.filterwarnings("ignore", category=ImportWarning)
95 warnings.filterwarnings("ignore", category=DeprecationWarning, module="<string>$")
96 warnings.filterwarnings("ignore", message="With-statements now directly support multiple context managers")
97
98
99 def main():
100     parser = optparse.OptionParser(
101         version = "BitBake Build Tool Core version %s, %%prog version %s" % (bb.__version__, __version__),
102         usage = """%prog [options] [package ...]
103
104 Executes the specified task (default is 'build') for a given set of BitBake files.
105 It expects that BBFILES is defined, which is a space separated list of files to
106 be executed.  BBFILES does support wildcards.
107 Default BBFILES are the .bb files in the current directory.""")
108
109     parser.add_option("-b", "--buildfile", help = "execute the task against this .bb file, rather than a package from BBFILES.",
110                action = "store", dest = "buildfile", default = None)
111
112     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.",
113                action = "store_false", dest = "abort", default = True)
114
115     parser.add_option("-a", "--tryaltconfigs", help = "continue with builds by trying to use alternative providers where possible.",
116                action = "store_true", dest = "tryaltconfigs", default = False)
117
118     parser.add_option("-f", "--force", help = "force run of specified cmd, regardless of stamp status",
119                action = "store_true", dest = "force", 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("-S", "--dump-signatures", help = "don't execute, just dump out the signature construction information",
137                action = "store_true", dest = "dump_signatures", default = False)
138
139     parser.add_option("-p", "--parse-only", help = "quit after parsing the BB files (developers only)",
140                action = "store_true", dest = "parse_only", 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     ui_main = get_ui(configuration)
172
173     # Save a logfile for cooker into the current working directory. When the
174     # server is daemonized this logfile will be truncated.
175     cooker_logfile = os.path.join(os.getcwd(), "cooker.log")
176
177     bb.utils.init_logger(bb.msg, configuration.verbose, configuration.debug,
178                          configuration.debug_domains)
179
180     # Ensure logging messages get sent to the UI as events
181     handler = bb.event.LogHandler()
182     logger.addHandler(handler)
183
184     # Clear away any spurious environment variables. But don't wipe the
185     # environment totally. This is necessary to ensure the correct operation
186     # of the UIs (e.g. for DISPLAY, etc.)
187     bb.utils.clean_environment()
188
189     #server = bb.server.none.BitBakeServer()    
190     server = bb.server.process.BitBakeServer()
191     #server = bb.server.xmlrpc.BitBakeServer()
192
193     server.initServer()
194     idle = server.getServerIdleCB()
195
196     cooker = bb.cooker.BBCooker(configuration, idle)
197     cooker.parseCommandLine()
198
199     server.addcooker(cooker)
200     server.saveConnectionDetails()
201     server.detach(cooker_logfile)
202
203     # Should no longer need to ever reference cooker
204     del cooker
205
206     logger.removeHandler(handler)
207
208     # Setup a connection to the server (cooker)
209     server_connection = server.establishConnection()
210
211     try:
212         return server.launchUI(ui_main, server_connection.connection, server_connection.events)
213     finally:
214         server_connection.terminate()
215
216     return 1
217
218 if __name__ == "__main__":
219     try:
220         ret = main()
221     except Exception:
222         ret = 1
223         import traceback
224         traceback.print_exc(5)
225     sys.exit(ret)
226