Prepare for 1.10.2
[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, getopt, re, time, optparse, xmlrpclib
26 sys.path.insert(0,os.path.join(os.path.dirname(os.path.dirname(sys.argv[0])), 'lib'))
27 import bb
28 from bb import cooker
29 from bb import ui
30 from bb import server
31 from bb.server import none
32 #from bb.server import xmlrpc
33
34 __version__ = "1.10.2"
35
36 if sys.hexversion < 0x020500F0:
37     print "Sorry, python 2.5 or later is required for this version of bitbake"
38     sys.exit(1)
39
40 #============================================================================#
41 # BBOptions
42 #============================================================================#
43 class BBConfiguration( object ):
44     """
45     Manages build options and configurations for one run
46     """
47     def __init__( self, options ):
48         for key, val in options.__dict__.items():
49             setattr( self, key, val )
50
51
52 def print_exception(exc, value, tb):
53     """
54     Print the exception to stderr, only showing the traceback if bitbake
55     debugging is enabled.
56     """
57     if not bb.msg.debug_level['default']:
58         tb = None
59
60     sys.__excepthook__(exc, value, tb)
61
62
63 #============================================================================#
64 # main
65 #============================================================================#
66
67 def main():
68     return_value = 0
69     pythonver = sys.version_info
70     if pythonver[0] < 2 or (pythonver[0] == 2 and pythonver[1] < 5):
71         print "Sorry, bitbake needs python 2.5 or later."
72         sys.exit(1)
73
74     parser = optparse.OptionParser( version = "BitBake Build Tool Core version %s, %%prog version %s" % ( bb.__version__, __version__ ),
75     usage = """%prog [options] [package ...]
76
77 Executes the specified task (default is 'build') for a given set of BitBake files.
78 It expects that BBFILES is defined, which is a space separated list of files to
79 be executed.  BBFILES does support wildcards.
80 Default BBFILES are the .bb files in the current directory.""" )
81
82     parser.add_option( "-b", "--buildfile", help = "execute the task against this .bb file, rather than a package from BBFILES.",
83                action = "store", dest = "buildfile", default = None )
84
85     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.",
86                action = "store_false", dest = "abort", default = True )
87
88     parser.add_option( "-a", "--tryaltconfigs", help = "continue with builds by trying to use alternative providers where possible.",
89                action = "store_true", dest = "tryaltconfigs", default = False )
90
91     parser.add_option( "-f", "--force", help = "force run of specified cmd, regardless of stamp status",
92                action = "store_true", dest = "force", default = False )
93
94     parser.add_option( "-i", "--interactive", help = "drop into the interactive mode also called the BitBake shell.",
95                action = "store_true", dest = "interactive", default = False )
96
97     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",
98                action = "store", dest = "cmd" )
99
100     parser.add_option( "-r", "--read", help = "read the specified file before bitbake.conf",
101                action = "append", dest = "file", default = [] )
102
103     parser.add_option( "-v", "--verbose", help = "output more chit-chat to the terminal",
104                action = "store_true", dest = "verbose", default = False )
105
106     parser.add_option( "-D", "--debug", help = "Increase the debug level. You can specify this more than once.",
107                action = "count", dest="debug", default = 0)
108
109     parser.add_option( "-n", "--dry-run", help = "don't execute, just go through the motions",
110                action = "store_true", dest = "dry_run", default = False )
111
112     parser.add_option( "-p", "--parse-only", help = "quit after parsing the BB files (developers only)",
113                action = "store_true", dest = "parse_only", default = False )
114
115     parser.add_option( "-d", "--disable-psyco", help = "disable using the psyco just-in-time compiler (not recommended)",
116                action = "store_true", dest = "disable_psyco", default = False )
117
118     parser.add_option( "-s", "--show-versions", help = "show current and preferred versions of all packages",
119                action = "store_true", dest = "show_versions", default = False )
120
121     parser.add_option( "-e", "--environment", help = "show the global or per-package environment (this is what used to be bbread)",
122                action = "store_true", dest = "show_environment", default = False )
123
124     parser.add_option( "-g", "--graphviz", help = "emit the dependency trees of the specified packages in the dot syntax",
125                 action = "store_true", dest = "dot_graph", default = False )
126
127     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""",
128                 action = "append", dest = "extra_assume_provided", default = [] )
129
130     parser.add_option( "-l", "--log-domains", help = """Show debug logging for the specified logging domains""",
131                 action = "append", dest = "debug_domains", default = [] )
132
133     parser.add_option( "-P", "--profile", help = "profile the command and print a report",
134                action = "store_true", dest = "profile", default = False )
135
136     parser.add_option( "-u", "--ui", help = "userinterface to use",
137                action = "store", dest = "ui")
138
139     parser.add_option( "", "--revisions-changed", help = "Set the exit code depending on whether upstream floating revisions have changed or not",
140                action = "store_true", dest = "revisions_changed", default = False )
141
142     options, args = parser.parse_args(sys.argv)
143
144     configuration = BBConfiguration(options)
145     configuration.pkgs_to_build = []
146     configuration.pkgs_to_build.extend(args[1:])
147
148     #server = bb.server.xmlrpc
149     server = bb.server.none
150
151     # Save a logfile for cooker into the current working directory. When the
152     # server is daemonized this logfile will be truncated.
153     cooker_logfile = os.path.join (os.getcwd(), "cooker.log")
154
155     # Clear away any spurious environment variables. But don't wipe the
156     # environment totally. This is necessary to ensure the correct operation
157     # of the UIs (e.g. for DISPLAY, etc.)
158     bb.utils.clean_environment()
159
160     cooker = bb.cooker.BBCooker(configuration, server)
161
162     cooker.parseCommandLine()
163
164     serverinfo = server.BitbakeServerInfo(cooker.server)
165
166     server.BitBakeServerFork(serverinfo, cooker.serve, cooker_logfile)
167     del cooker
168
169     sys.excepthook = print_exception
170
171     # Setup a connection to the server (cooker)
172     serverConnection = server.BitBakeServerConnection(serverinfo)
173
174     # Launch the UI
175     if configuration.ui:
176         ui = configuration.ui
177     else:
178         ui = "knotty"
179
180     try:
181             # Dynamically load the UI based on the ui name. Although we
182             # suggest a fixed set this allows you to have flexibility in which
183             # ones are available.
184             exec "from bb.ui import " + ui
185             exec "return_value = " + ui + ".init(serverConnection.connection, serverConnection.events)"
186     except ImportError:
187         print "FATAL: Invalid user interface '%s' specified. " % ui
188         print "Valid interfaces are 'ncurses', 'depexp' or the default, 'knotty'."
189     except Exception, e:
190         print "FATAL: Unable to start to '%s' UI due to exception: %s." % (configuration.ui, e)
191     finally:
192         serverConnection.terminate()
193         return return_value
194
195 if __name__ == "__main__":
196     ret = main()
197     sys.exit(ret)