Complete TODO items related to execution of oebuild with a single commandline argumen...
[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 do_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 "do_build"
56
57 def load_oefile(oefile, cfgdata):
58         oepath = data.getVar('OEPATH', cfg)
59         topdir = os.path.abspath(os.getcwd())
60         oefile_loc = os.path.abspath(os.path.dirname(oefile))
61         # set topdir to here
62         data.setVar('TOPDIR', topdir, cfg)
63         # expand tmpdir to include this topdir
64         data.setVar('TMPDIR', data.getVar('TMPDIR', cfg, 1) or "", cfg)
65         # add topdir to oepath
66         oepath += ":%s" % topdir
67         # set topdir to location of .oe file
68         topdir = oefile_loc
69         data.setVar('TOPDIR', topdir, cfg)
70         # add that topdir to oepath
71         oepath += ":%s" % topdir
72         # go there
73         os.chdir(topdir)
74         data.setVar('OEPATH', oepath, cfg)
75         from copy import copy
76         oe = copy(cfgdata)
77         try:
78                 oe = parse.handle(oefile, oe) # read .oe data
79                 return oe
80         except IOError, OSError:
81                 return None
82
83 # handle opts
84 optsonly = [ opt for (opt,val) in opts]
85 if '--version' in optsonly or '-v' in optsonly:
86         version()
87         sys.exit(0)
88
89 if '--help' in optsonly or '-h' in optsonly:
90         usage(1)
91
92 # variable initialization
93 oefile = None
94 cmd = None
95 oedata = None
96 cfg = data.init()
97 graph = digraph()
98
99 try:
100         cfg = parse.handle("conf/oe.conf", cfg) # Read configuration
101 except IOError:
102         (type, value, traceback) = sys.exc_info()
103         fatal("Unable to open oe.conf: %s" % value)
104
105 if len(args) == 0:
106         # user didnt specify command or .oe
107         # see if we can find a .oe file in the current dir
108         oefile = get_oefile()
109         cmd = get_cmd()
110 elif len(args) == 1:
111         # one of two cases:
112         #       1) oebuild COMMAND
113         #       2) oebuild OEFILE
114         # First, see if this is a valid task.
115         oedata = load_oefile(args[0], cfg)
116         if not oedata:
117                 # If so, assume its a command.
118                 #       If its a command, but we cant get a .oe file
119                 #       in the current dir, usage()
120                 cmd = args[0]
121         else:
122                 # If not, assume a .oe file.
123                 oefile = args[0]
124
125         if not cmd:
126                 cmd = get_cmd()
127
128         if not oefile:
129                 oefile = get_oefile()
130 elif len(args) == 2:
131         # user specified both
132         cmd = args[0]
133         oefile = args[1]
134 else:
135         # invalid
136         usage(1)
137
138 if not cmd:
139         usage(1)
140
141 if not oefile:
142         usage(1)
143
144 if not oedata:
145         oedata = load_oefile(oefile, cfg)
146
147 if not oedata:
148         fatal("Unable to open %s" % oefile)
149
150 for var in oedata.keys():
151         if data.getVarFlag(var, 'handler', oedata):
152                 event.register(data.getVar(var, oedata))
153                 continue
154
155         if not data.getVarFlag(var, 'task', oedata):
156                 continue
157
158         deps = data.getVarFlag(var, 'deps', oedata) or []
159         postdeps = data.getVarFlag(var, 'postdeps', oedata) or []
160         build.add_task(var, var, deps)
161         for p in postdeps:
162                 d = build.get_task_data()
163                 pcontent = data.getVar(p, d) or p
164                 pdeps = data.getVarFlag(pcontent, 'deps', oedata) or []
165                 pdeps.append(var)
166                 data.setVarFlag(pcontent, 'deps', pdeps, oedata)
167                 build.add_task(p, pcontent, pdeps)
168
169 try:
170         build.exec_task(cmd, oedata)
171 except build.FuncFailed:
172         fatal("task stack execution failed")
173 except build.EventException:
174         (type, value, traceback) = sys.exc_info()
175         e = value.event
176         fatal("%s event exception, aborting" % event.getName(e))