Remove the necessity to append do_ to commands to clean up UI.
[bitbake.git] / bin / oebuild
1 #!/usr/bin/python
2
3 import sys
4 sys.path.append('/usr/share/oe')
5 from oe import *
6 import oe
7 import os
8
9 def usage(errorlevel=0, txt=''):
10         global tasks
11         if txt:
12                 print
13                 print txt
14
15         print "Usage: oebuild [options]... task oefile"
16 #       print "Run TASK on OEFILE or standard input if OEFILE is -."
17         print "Run task on oefile."
18         print "Example: oebuild build content/glibc-2.3.1.oe"
19         print ""
20         print "  %s\t\t%s" % ("-v, --version", "output version information and exit")
21         sys.exit(0)
22
23 __version__ = 1.0
24 def version():
25         print "OpenEmbedded Build Infrastructure Core version %s" % oe.__version__
26         print "OEBuild version %s" % __version__
27
28 import getopt
29 try:
30         (opts, args) = getopt.getopt(sys.argv[1:], 'vh', [ 'version', 'help' ])
31 except getopt.GetoptError:
32         usage(1)
33
34 def get_oefiles():
35         """Get default oefiles"""
36         dirs = os.listdir(os.getcwd())
37         oefiles = []
38         for f in dirs:
39                 (root, ext) = os.path.splitext(f)
40                 if ext == ".oe":
41                         oefiles.append(os.path.abspath(os.path.join(os.getcwd(),f)))
42         return oefiles
43
44 def get_oefile():
45         """Get default oefile"""
46         oefiles = get_oefiles()
47         if len(oefiles):
48                 return oefiles[0]
49         else:
50                 return None
51
52
53 def get_cmd():
54         """Get default command"""
55         return "build"
56
57 def load_oefile(oefile, cfgdata):
58         oepath = data.getVar('OEPATH', cfg)
59         topdir = data.getVar('TOPDIR', cfg)
60         if not topdir:
61                 topdir = os.path.abspath(os.getcwd())
62                 # set topdir to here
63                 data.setVar('TOPDIR', topdir, cfg)
64         oefile = os.path.abspath(oefile)
65         oefile_loc = os.path.abspath(os.path.dirname(oefile))
66         # expand tmpdir to include this topdir
67         data.setVar('TMPDIR', data.getVar('TMPDIR', cfg, 1) or "", cfg)
68         # add topdir to oepath
69         oepath += ":%s" % topdir
70         # set topdir to location of .oe file
71         topdir = oefile_loc
72         #data.setVar('TOPDIR', topdir, cfg)
73         # add that topdir to oepath
74         oepath += ":%s" % topdir
75         # go there
76         os.chdir(topdir)
77         data.setVar('OEPATH', oepath, cfg)
78         from copy import copy
79         oe = copy(cfgdata)
80         try:
81                 oe = parse.handle(oefile, oe) # read .oe data
82                 return oe
83         except IOError, OSError:
84                 return None
85
86 # handle opts
87 optsonly = [ opt for (opt,val) in opts]
88 if '--version' in optsonly or '-v' in optsonly:
89         version()
90         sys.exit(0)
91
92 if '--help' in optsonly or '-h' in optsonly:
93         usage(1)
94
95 # variable initialization
96 oefile = None
97 cmd = None
98 oedata = None
99 cfg = data.init()
100 graph = digraph()
101
102 try:
103         cfg = parse.handle("conf/oe.conf", cfg) # Read configuration
104 except IOError:
105         (type, value, traceback) = sys.exc_info()
106         fatal("Unable to open oe.conf: %s" % value)
107
108 if len(args) == 0:
109         # user didnt specify command or .oe
110         # see if we can find a .oe file in the current dir
111         oefile = get_oefile()
112         cmd = get_cmd()
113 elif len(args) == 1:
114         # one of two cases:
115         #       1) oebuild COMMAND
116         #       2) oebuild OEFILE
117         # First, see if this is a valid task.
118         oedata = load_oefile(args[0], cfg)
119         if not oedata:
120                 # If so, assume its a command.
121                 #       If its a command, but we cant get a .oe file
122                 #       in the current dir, usage()
123                 cmd = args[0]
124         else:
125                 # If not, assume a .oe file.
126                 oefile = args[0]
127
128         if not cmd:
129                 cmd = get_cmd()
130
131         if not oefile:
132                 oefile = get_oefile()
133 elif len(args) == 2:
134         # user specified both
135         cmd = args[0]
136         oefile = args[1]
137 else:
138         # invalid
139         usage(1)
140
141 if not cmd:
142         usage(1)
143
144 if not oefile:
145         usage(1)
146
147 if not oedata:
148         oedata = load_oefile(oefile, cfg)
149
150 if not oedata:
151         fatal("Unable to open %s" % oefile)
152
153 for var in oedata.keys():
154         if data.getVarFlag(var, 'handler', oedata):
155                 event.register(data.getVar(var, oedata))
156                 continue
157
158         if not data.getVarFlag(var, 'task', oedata):
159                 continue
160
161         deps = data.getVarFlag(var, 'deps', oedata) or []
162         postdeps = data.getVarFlag(var, 'postdeps', oedata) or []
163         build.add_task(var, var, deps)
164         for p in postdeps:
165                 d = build.get_task_data()
166                 pcontent = data.getVar(p, d) or p
167                 pdeps = data.getVarFlag(pcontent, 'deps', oedata) or []
168                 pdeps.append(var)
169                 data.setVarFlag(pcontent, 'deps', pdeps, oedata)
170                 build.add_task(p, pcontent, pdeps)
171
172 try:
173         build.exec_task('do_%s' % cmd, oedata)
174 except build.FuncFailed:
175         fatal("task stack execution failed")
176 except build.EventException:
177         (type, value, traceback) = sys.exc_info()
178         e = value.event
179         fatal("%s event exception, aborting" % event.getName(e))