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