Correct the output path for bunzipped/gunziped files.
[bitbake.git] / bin / classes / base.oeclass
1 PATCHES_DIR="${S}"
2 DEPENDS_prepend="patcher "
3
4 die () {
5         exit 1
6 }
7
8 oenote () {
9         echo "NOTE:" $*
10         return 0
11 }
12
13 oefatal () {
14         echo "FATAL:" $*
15         exit 1
16 }
17
18 oedebug () {
19         test $# -ge 2 || {
20                 echo "Usage: oedebug level \"message\""
21                 exit 1
22         }
23         
24         test ${OEDEBUG:-0} -ge $1 && {
25                 shift
26                 echo "DEBUG:" $*
27         }
28         return 0
29 }
30
31 oeset () {
32         test $# -eq 2 || {
33                 echo "Usage: oeset var value"
34                 exit 1
35         }
36         
37         echo "TODO: setting $1 to '$2'"
38 }
39
40 oe_runmake () {
41         if [ -f ./[mM]akefile -o -f ./GNUmakefile ] ; then
42                 if [ x"$MAKE" = x ]; then MAKE=make; fi
43                 oenote ${MAKE} ${EXTRA_OEMAKE} "$@"
44                 ${MAKE} ${EXTRA_OEMAKE} "$@" || die "oemake failed"
45         else
46                 die "no Makefile found"
47         fi
48 }
49
50 python do_showdata() {
51         import oe
52         import sys
53         # emit variables and shell functions
54         oe.data.emit_env(sys.__stdout__, d)
55         # emit the metadata which isnt valid shell
56         for e in d.keys():
57                 if oe.data.getVarFlag(e, 'python', d):
58                         sys.__stdout__.write("\npython %s() {\n%s}\n" % (e, oe.data.getVar(e, d)))
59 }
60
61 python base_do_clean() {
62         """clear the build and temp directories"""
63         from oe import note, data
64         import os
65
66         note("Executing task 'clean'")
67
68         dir = data.expand("${TMPDIR}/${CATEGORY}/${PF}", d)
69         if dir == '//': fatal("wrong DATADIR")
70         note("removing " + dir)
71         os.system('rm -rf ' + dir)
72
73         dir = "%s.*" % data.expand(data.getVar('STAMP', d), d)
74         note("removing " + dir)
75         os.system('rm -f '+ dir)
76 }
77
78 python base_do_mrproper() {
79         """clear downloaded sources, build and temp directories"""
80         from oe import note, debug, build
81         import os
82
83         note("Executing task 'mrproper'")
84
85         dir = data.expand("${DL_DIR}", d)
86         if dir == '/': fatal("wrong DATADIR")
87         debug(2, "removing " + dir)
88         os.system('rm -rf ' + dir)
89         build.exec_task('do_clean', d)
90 }
91
92 python base_do_patch () {
93         import re, string
94         from oe import decodeurl, encodeurl, note
95
96         src_uri = data.getVar('SRC_URI', d)
97         if not src_uri:
98                 note("no SRC_URI variable, nothing to be done")
99                 return
100         src_uri = data.expand(src_uri, d)
101         for url in src_uri.split():
102 #               note('url is %s' % url)
103                 (type, host, path, user, pswd, parm) = decodeurl(url)
104                 if not parm.has_key("patch"):
105                         continue
106                 from oe.fetch import init, localpath
107                 init([url])
108                 url = encodeurl((type, host, path, user, pswd, []))
109                 local = '/' + localpath(url)
110                 # patch!
111                 dots = local.split(".")
112                 if dots[-1] in ['gz', 'bz2', 'Z']:
113                         efile = os.path.join(data.getVar('WORKDIR', d),os.path.basename(string.join(dots[0:-1],".")))
114                 else:
115                         efile = local
116                 efile = data.expand(efile, d)
117                 patches_dir = data.expand(data.getVar('PATCHES_DIR', d), d)
118                 mkdirhier(patches_dir)
119                 os.chdir(patches_dir)
120                 path = data.getVar('PATH', d)
121                 if path:
122                         path = path.split(":")
123                         path[0:0] = [ os.path.join("${OEDIR}", "bin/build") ]
124                         path[0:0] = [ "${STAGING_BINDIR}" ]
125                         data.setVar('PATH', data.expand(string.join(path, ":"), d), d)
126                 cmd = "PATH=\"$PATH:%s\" patcher" % data.getVar('PATH', d)
127                 if parm.has_key("pnum"):
128                         cmd += " -p %s" % parm["pnum"]
129                 cmd += " -i %s" % efile
130                 ret = os.system(cmd)
131                 if ret != 0:
132                         raise FuncFailed("'patcher' execution failed")
133 }
134
135 python base_do_fetch() {
136         import sys
137
138         src_uri = data.getVar('SRC_URI', d)
139         if not src_uri:
140                 note("no SRC_URI variable, nothing to be done")
141                 return 1
142         src_uri = data.expand(src_uri, d)
143
144         try:
145                 fetch.init(src_uri.split())
146         except fetch.NoMethodError:
147                 (type, value, traceback) = sys.exc_info()
148                 error("No method: %s" % value)
149                 raise FuncFailed()
150
151         try:
152                 fetch.go(d)
153         except fetch.MissingParameterError:
154                 (type, value, traceback) = sys.exc_info()
155                 error("Missing parameters: %s" % value)
156                 raise FuncFailed()
157         except fetch.FetchError:
158                 (type, value, traceback) = sys.exc_info()
159                 error("Fetch failed: %s" % value)
160                 raise FuncFailed()
161 }
162
163 python base_do_unpack() {
164         import os, re
165         src_uri = data.getVar('SRC_URI', d)
166         if not src_uri:
167                 note("no SRC_URI variable, nothing to be done")
168                 return
169         src_uri = data.expand(src_uri, d)
170         for url in src_uri.split():
171                 local = oe.data.expand(oe.fetch.localpath(url), d)
172                 # dont need any parameters for extraction, strip them off
173                 local = re.sub(';.*$', '', local)
174                 dots = local.split(".")
175                 if dots[-1] in ['gz', 'bz2', 'Z']:
176                         efile = os.path.join(data.getVar('WORKDIR', d),os.path.basename(string.join(dots[0:-1],".")))
177                 else:
178                         efile = local
179                 cmd = None
180                 if local.endswith('.tar'):
181                         cmd = 'tar x --no-same-owner -f %s' % local
182                 elif local.endswith('.tgz') or local.endswith('.tar.gz'):
183                         cmd = 'tar xz --no-same-owner -f %s' % local
184                 elif local.endswith('.tbz') or local.endswith('.tar.bz2'):
185                         cmd = 'tar xj --no-same-owner -f %s' % local
186                 elif local.endswith('.gz') or local.endswith('.Z') or local.endswith('.z'):
187                         loc = local.rfind('.')
188                         cmd = 'gzip -dc %s > %s' % (local, efile) 
189                 elif local.endswith('.bz2'):
190                         loc = local.rfind('.')
191                         cmd = 'bzip2 -dc %s > %s' % (local, efile) 
192                 elif os.path.isdir(local):
193                         cmd = 'cp -a %s %s/' % (local, os.getcwd())
194                 if not cmd:
195                         continue
196                 note("Unpacking %s to %s/" % (local, os.getcwd()))
197                 ret = os.system(cmd)
198                 if ret != 0:
199                         raise FuncFailed()
200 }
201
202 base_do_configure() {
203         oenote "nothing to configure"
204 }
205
206 base_do_compile() {
207         if [ -e Makefile -o -e makefile ]; then
208                 oe_runmake || die "make failed"
209         else
210                 oenote "nothing to compile"
211         fi
212 }
213
214 base_do_stage() {
215         oenote "nothing to install into stage area"
216 }
217
218
219 base_do_install() {
220         oenote "nothing to install"
221 }
222
223 base_do_package() {
224         oenote "nothing to package"
225 }
226
227 base_do_build() {
228         oenote "nothing to do"
229 }
230
231 python base_eventhandler() {
232         from oe import note, error, data
233         from oe.event import Handled, NotHandled, getName
234         import os, string
235
236         name = getName(e)
237         if name in ["PkgSucceeded", "PkgStarted"]:
238                 note("package %s: build %s" % (e.pkg, string.lower(name[3:])))
239         elif name in ["PkgFailed"]:
240                 error("package %s: build %s" % (e.pkg, string.lower(name[3:])))
241         elif name in ["TaskSucceeded", "TaskStarted"]:
242                 note("package %s: task %s %s" % (data.expand(data.getVar("PF", e.data), e.data), e.task, string.lower(name[4:])))
243         elif name in ["TaskFailed"]:
244                 error("package %s: task %s %s" % (data.expand(data.getVar("PF", e.data), e.data), e.task, string.lower(name[4:])))
245         elif name in ["UnsatisfiedDep"]:
246                 note("package %s: dependency %s %s" % (e.pkg, e.dep, string.lower(name[:-3])))
247         elif name in ["BuildStarted", "BuildCompleted"]:
248                 note("build %s %s" % (e.name,string.lower(name[5:])))
249         return NotHandled
250 }
251 addhandler base_eventhandler
252
253 # setup the initial task stack
254 EXPORT_FUNCTIONS do_clean do_mrproper do_fetch do_unpack do_configure do_compile do_stage do_install do_package do_patch do_build
255
256 addtask showdata
257 addtask clean
258 addtask mrproper
259 addtask fetch
260 addtask unpack after do_fetch
261 addtask patch after do_unpack
262 addtask configure after do_unpack do_patch
263 addtask compile after do_configure
264 addtask stage after do_compile
265 addtask install after do_stage
266 addtask build after do_install