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