summaryrefslogtreecommitdiffstats
path: root/meta/recipes-core/busybox/busybox.inc
diff options
context:
space:
mode:
Diffstat (limited to 'meta/recipes-core/busybox/busybox.inc')
-rw-r--r--meta/recipes-core/busybox/busybox.inc412
1 files changed, 412 insertions, 0 deletions
diff --git a/meta/recipes-core/busybox/busybox.inc b/meta/recipes-core/busybox/busybox.inc
new file mode 100644
index 0000000000..deb2ee4606
--- /dev/null
+++ b/meta/recipes-core/busybox/busybox.inc
@@ -0,0 +1,412 @@
1SUMMARY = "Tiny versions of many common UNIX utilities in a single small executable"
2DESCRIPTION = "BusyBox combines tiny versions of many common UNIX utilities into a single small executable. It provides minimalist replacements for most of the utilities you usually find in GNU fileutils, shellutils, etc. The utilities in BusyBox generally have fewer options than their full-featured GNU cousins; however, the options that are included provide the expected functionality and behave very much like their GNU counterparts. BusyBox provides a fairly complete POSIX environment for any small or embedded system."
3HOMEPAGE = "http://www.busybox.net"
4BUGTRACKER = "https://bugs.busybox.net/"
5
6DEPENDS += "kern-tools-native"
7
8# bzip2 applet in busybox is based on lightly-modified bzip2 source
9# the GPL is version 2 only
10LICENSE = "GPLv2 & bzip2"
11LIC_FILES_CHKSUM = "file://LICENSE;md5=de10de48642ab74318e893a61105afbb"
12
13SECTION = "base"
14
15# Whether to split the suid apps into a seperate binary
16BUSYBOX_SPLIT_SUID ?= "1"
17
18export EXTRA_CFLAGS = "${CFLAGS}"
19export EXTRA_LDFLAGS = "${LDFLAGS}"
20export EXTRA_OEMAKE += "'LD=${CCLD}'"
21
22PACKAGES =+ "${PN}-httpd ${PN}-udhcpd ${PN}-udhcpc ${PN}-syslog ${PN}-mdev ${PN}-hwclock"
23
24FILES_${PN}-httpd = "${sysconfdir}/init.d/busybox-httpd /srv/www"
25FILES_${PN}-syslog = "${sysconfdir}/init.d/syslog* ${sysconfdir}/syslog-startup.conf* ${sysconfdir}/syslog.conf* ${systemd_unitdir}/system/syslog.service ${sysconfdir}/default/busybox-syslog"
26FILES_${PN}-mdev = "${sysconfdir}/init.d/mdev ${sysconfdir}/mdev.conf ${sysconfdir}/mdev/*"
27FILES_${PN}-udhcpd = "${sysconfdir}/init.d/busybox-udhcpd"
28FILES_${PN}-udhcpc = "${sysconfdir}/udhcpc.d ${datadir}/udhcpc"
29FILES_${PN}-hwclock = "${sysconfdir}/init.d/hwclock.sh"
30
31INITSCRIPT_PACKAGES = "${PN}-httpd ${PN}-syslog ${PN}-udhcpd ${PN}-mdev ${PN}-hwclock"
32
33INITSCRIPT_NAME_${PN}-httpd = "busybox-httpd"
34INITSCRIPT_NAME_${PN}-hwclock = "hwclock.sh"
35INITSCRIPT_NAME_${PN}-mdev = "mdev"
36INITSCRIPT_PARAMS_${PN}-mdev = "start 03 S ."
37INITSCRIPT_NAME_${PN}-syslog = "syslog"
38INITSCRIPT_NAME_${PN}-udhcpd = "busybox-udhcpd"
39
40SYSTEMD_PACKAGES = "${PN}-syslog"
41SYSTEMD_SERVICE_${PN}-syslog = "busybox-syslog.service"
42
43CONFFILES_${PN}-syslog = "${sysconfdir}/syslog-startup.conf.${BPN}"
44CONFFILES_${PN}-mdev = "${sysconfdir}/mdev.conf"
45
46RRECOMMENDS_${PN} = "${PN}-syslog ${PN}-udhcpc"
47
48inherit cml1 systemd update-rc.d ptest
49
50# internal helper
51def busybox_cfg(feature, tokens, cnf, rem):
52 if type(tokens) == type(""):
53 tokens = [tokens]
54 rem.extend(['/^[# ]*' + token + '[ =]/d' for token in tokens])
55 if feature:
56 cnf.extend([token + '=y' for token in tokens])
57 else:
58 cnf.extend(['# ' + token + ' is not set' for token in tokens])
59
60# Map distro features to config settings
61def features_to_busybox_settings(d):
62 cnf, rem = ([], [])
63 busybox_cfg(bb.utils.contains('DISTRO_FEATURES', 'ipv6', True, False, d), 'CONFIG_FEATURE_IPV6', cnf, rem)
64 busybox_cfg(bb.utils.contains('DISTRO_FEATURES', 'largefile', True, False, d), 'CONFIG_LFS', cnf, rem)
65 busybox_cfg(bb.utils.contains('DISTRO_FEATURES', 'largefile', True, False, d), 'CONFIG_FDISK_SUPPORT_LARGE_DISKS', cnf, rem)
66 busybox_cfg(bb.utils.contains('DISTRO_FEATURES', 'nls', True, False, d), 'CONFIG_LOCALE_SUPPORT', cnf, rem)
67 busybox_cfg(bb.utils.contains('DISTRO_FEATURES', 'ipv4', True, False, d), 'CONFIG_FEATURE_IFUPDOWN_IPV4', cnf, rem)
68 busybox_cfg(bb.utils.contains('DISTRO_FEATURES', 'ipv6', True, False, d), 'CONFIG_FEATURE_IFUPDOWN_IPV6', cnf, rem)
69 busybox_cfg(bb.utils.contains('DISTRO_FEATURES', 'wifi', True, False, d), 'CONFIG_RFKILL', cnf, rem)
70 busybox_cfg(bb.utils.contains('DISTRO_FEATURES', 'bluetooth', True, False, d), 'CONFIG_RFKILL', cnf, rem)
71 return "\n".join(cnf), "\n".join(rem)
72
73# X, Y = ${@features_to_uclibc_settings(d)}
74# unfortunately doesn't seem to work with bitbake, workaround:
75def features_to_busybox_conf(d):
76 cnf, rem = features_to_busybox_settings(d)
77 return cnf
78def features_to_busybox_del(d):
79 cnf, rem = features_to_busybox_settings(d)
80 return rem
81
82configmangle = '/CROSS_COMPILER_PREFIX/d; \
83 /CONFIG_EXTRA_CFLAGS/d; \
84 '
85OE_FEATURES := "${@features_to_busybox_conf(d)}"
86OE_DEL := "${@features_to_busybox_del(d)}"
87DO_IPv4 := "${@bb.utils.contains('DISTRO_FEATURES', 'ipv4', 1, 0, d)}"
88DO_IPv6 := "${@bb.utils.contains('DISTRO_FEATURES', 'ipv6', 1, 0, d)}"
89
90python () {
91 if "${OE_DEL}":
92 d.setVar('configmangle_append', "${OE_DEL}" + "\n")
93 if "${OE_FEATURES}":
94 d.setVar('configmangle_append',
95 "/^### DISTRO FEATURES$/a\\\n%s\n\n" %
96 ("\\n".join((d.expand("${OE_FEATURES}").split("\n")))))
97 d.setVar('configmangle_append',
98 "/^### CROSS$/a\\\n%s\n" %
99 ("\\n".join(["CONFIG_CROSS_COMPILER_PREFIX=\"${TARGET_PREFIX}\"",
100 "CONFIG_EXTRA_CFLAGS=\"${CFLAGS}\" \"${HOST_CC_ARCH}\""
101 ])
102 ))
103}
104
105do_prepare_config () {
106 sed -e 's#@DATADIR@#${datadir}#g' \
107 < ${WORKDIR}/defconfig > ${S}/.config
108 sed -i -e '/CONFIG_STATIC/d' .config
109 echo "# CONFIG_STATIC is not set" >> .config
110 for i in 'CROSS' 'DISTRO FEATURES'; do echo "### $i"; done >> \
111 ${S}/.config
112 sed -i -e '${configmangle}' ${S}/.config
113 if test ${DO_IPv4} -eq 0 && test ${DO_IPv6} -eq 0; then
114 # disable networking applets
115 mv ${S}/.config ${S}/.config.oe-tmp
116 awk 'BEGIN{net=0}
117 /^# Networking Utilities/{net=1}
118 /^#$/{if(net){net=net+1}}
119 {if(net==2&&$0 !~ /^#/&&$1){print("# "$1" is not set")}else{print}}' \
120 ${S}/.config.oe-tmp > ${S}/.config
121 fi
122 sed -i 's/CONFIG_IFUPDOWN_UDHCPC_CMD_OPTIONS="-R -n"/CONFIG_IFUPDOWN_UDHCPC_CMD_OPTIONS="-R -b"/' ${S}/.config
123}
124
125# returns all the elements from the src uri that are .cfg files
126def find_cfgs(d):
127 sources=src_patches(d, True)
128 sources_list=[]
129 for s in sources:
130 if s.endswith('.cfg'):
131 sources_list.append(s)
132
133 return sources_list
134
135do_configure () {
136 do_prepare_config
137 merge_config.sh -m .config ${@" ".join(find_cfgs(d))}
138 cml1_do_configure
139}
140
141do_compile() {
142 unset CFLAGS CPPFLAGS CXXFLAGS LDFLAGS
143 if [ "${BUSYBOX_SPLIT_SUID}" = "1" -a x`grep "CONFIG_FEATURE_INDIVIDUAL=y" .config` = x ]; then
144 # split the .config into two parts, and make two busybox binaries
145 cp .config .config.orig
146 oe_runmake busybox.cfg.suid
147 oe_runmake busybox.cfg.nosuid
148 for i in `cat busybox.cfg.suid busybox.cfg.nosuid`; do
149 echo "# $i is not set" >> .config.disable.apps
150 done
151 merge_config.sh -m .config.orig .config.disable.apps
152 cp .config .config.nonapps
153 for s in suid nosuid; do
154 cat busybox.cfg.$s | while read item; do
155 grep -w "$item" .config.orig
156 done > .config.app.$s
157 merge_config.sh -m .config.nonapps .config.app.$s
158 oe_runmake busybox_unstripped
159 mv busybox_unstripped busybox.$s
160 oe_runmake busybox.links
161 mv busybox.links busybox.links.$s
162 done
163 # copy .config.orig back to .config, because the install process may check this file
164 cp .config.orig .config
165 # cleanup
166 rm .config.orig .config.app.suid .config.app.nosuid .config.disable.apps .config.nonapps
167 else
168 oe_runmake busybox_unstripped
169 cp busybox_unstripped busybox
170 oe_runmake busybox.links
171 fi
172}
173
174do_install () {
175 if [ "${prefix}" != "/usr" ]; then
176 sed -i "s:^/usr/:${prefix}/:" busybox.links*
177 fi
178 if [ "${base_sbindir}" != "/sbin" ]; then
179 sed -i "s:^/sbin/:${base_sbindir}/:" busybox.links*
180 fi
181
182 install -d ${D}${sysconfdir}/init.d
183
184 if ! grep -q "CONFIG_FEATURE_INDIVIDUAL=y" ${B}/.config; then
185 # Install /bin/busybox, and the /bin/sh link so the postinst script
186 # can run. Let update-alternatives handle the rest.
187 install -d ${D}${base_bindir}
188 if [ "${BUSYBOX_SPLIT_SUID}" = "1" ]; then
189 install -m 4755 ${B}/busybox.suid ${D}${base_bindir}
190 install -m 0755 ${B}/busybox.nosuid ${D}${base_bindir}
191 install -m 0644 ${S}/busybox.links.suid ${D}${sysconfdir}
192 install -m 0644 ${S}/busybox.links.nosuid ${D}${sysconfdir}
193 if grep -q "CONFIG_FEATURE_SH_IS_ASH=y" ${B}/.config; then
194 ln -sf busybox.nosuid ${D}${base_bindir}/sh
195 fi
196 # Keep a default busybox for people who want to invoke busybox directly.
197 # This is also useful for the on device upgrade. Because we want
198 # to use the busybox command in postinst.
199 ln -sf busybox.nosuid ${D}${base_bindir}/busybox
200 else
201 if grep -q "CONFIG_FEATURE_SUID=y" ${B}/.config; then
202 install -m 4755 ${B}/busybox ${D}${base_bindir}
203 else
204 install -m 0755 ${B}/busybox ${D}${base_bindir}
205 fi
206 install -m 0644 ${S}/busybox.links ${D}${sysconfdir}
207 if grep -q "CONFIG_FEATURE_SH_IS_ASH=y" ${B}/.config; then
208 ln -sf busybox ${D}${base_bindir}/sh
209 fi
210 # We make this symlink here to eliminate the error when upgrading together
211 # with busybox-syslog. Without this symlink, the opkg may think of the
212 # busybox.nosuid as obsolete and remove it, resulting in dead links like
213 # /bin/sed -> /bin/busybox.nosuid. This will make upgrading busybox-syslog fail.
214 # This symlink will be safely deleted in postinst, thus no negative effect.
215 ln -sf busybox ${D}${base_bindir}/busybox.nosuid
216 fi
217 else
218 install -d ${D}${base_bindir} ${D}${base_sbindir}
219 install -d ${D}${libdir} ${D}${bindir} ${D}${sbindir}
220 cat busybox.links | while read FILE; do
221 NAME=`basename "$FILE"`
222 install -m 0755 "0_lib/$NAME" "${D}$FILE.${BPN}"
223 done
224 # add suid bit where needed
225 for i in `grep -E "APPLET.*BB_SUID_((MAYBE|REQUIRE))" include/applets.h | grep -v _BB_SUID_DROP | cut -f 3 -d '(' | cut -f 1 -d ','`; do
226 find ${D} -name $i.${BPN} -exec chmod a+s {} \;
227 done
228 install -m 0755 0_lib/libbusybox.so.${PV} ${D}${libdir}/libbusybox.so.${PV}
229 ln -sf sh.${BPN} ${D}${base_bindir}/sh
230 ln -sf ln.${BPN} ${D}${base_bindir}/ln
231 ln -sf test.${BPN} ${D}${bindir}/test
232 if [ -f ${D}/linuxrc.${BPN} ]; then
233 mv ${D}/linuxrc.${BPN} ${D}/linuxrc
234 fi
235 install -m 0644 ${S}/busybox.links ${D}${sysconfdir}
236 fi
237
238 if grep -q "CONFIG_SYSLOGD=y" ${B}/.config; then
239 install -m 0755 ${WORKDIR}/syslog ${D}${sysconfdir}/init.d/syslog.${BPN}
240 install -m 644 ${WORKDIR}/syslog-startup.conf ${D}${sysconfdir}/syslog-startup.conf.${BPN}
241 install -m 644 ${WORKDIR}/syslog.conf ${D}${sysconfdir}/syslog.conf.${BPN}
242 fi
243 if grep "CONFIG_CROND=y" ${B}/.config; then
244 install -m 0755 ${WORKDIR}/busybox-cron ${D}${sysconfdir}/init.d/
245 fi
246 if grep "CONFIG_HTTPD=y" ${B}/.config; then
247 install -m 0755 ${WORKDIR}/busybox-httpd ${D}${sysconfdir}/init.d/
248 install -d ${D}/srv/www
249 fi
250 if grep "CONFIG_UDHCPD=y" ${B}/.config; then
251 install -m 0755 ${WORKDIR}/busybox-udhcpd ${D}${sysconfdir}/init.d/
252 fi
253 if grep "CONFIG_HWCLOCK=y" ${B}/.config; then
254 install -m 0755 ${WORKDIR}/hwclock.sh ${D}${sysconfdir}/init.d/
255 fi
256 if grep "CONFIG_UDHCPC=y" ${B}/.config; then
257 install -d ${D}${sysconfdir}/udhcpc.d
258 install -d ${D}${datadir}/udhcpc
259 install -m 0755 ${WORKDIR}/simple.script ${D}${sysconfdir}/udhcpc.d/50default
260 install -m 0755 ${WORKDIR}/default.script ${D}${datadir}/udhcpc/default.script
261 fi
262 if grep "CONFIG_INETD=y" ${B}/.config; then
263 install -m 0755 ${WORKDIR}/inetd ${D}${sysconfdir}/init.d/inetd.${BPN}
264 sed -i "s:/usr/sbin/:${sbindir}/:" ${D}${sysconfdir}/init.d/inetd.${BPN}
265 install -m 0644 ${WORKDIR}/inetd.conf ${D}${sysconfdir}/
266 fi
267 if grep "CONFIG_MDEV=y" ${B}/.config; then
268 install -m 0755 ${WORKDIR}/mdev ${D}${sysconfdir}/init.d/mdev
269 if grep "CONFIG_FEATURE_MDEV_CONF=y" ${B}/.config; then
270 install -m 644 ${WORKDIR}/mdev.conf ${D}${sysconfdir}/mdev.conf
271 install -d ${D}${sysconfdir}/mdev
272 install -m 0755 ${WORKDIR}/find-touchscreen.sh ${D}${sysconfdir}/mdev
273 fi
274 fi
275
276 if ${@bb.utils.contains('DISTRO_FEATURES','systemd','true','false',d)}; then
277 if grep -q "CONFIG_SYSLOGD=y" ${B}/.config; then
278 install -d ${D}${systemd_unitdir}/system
279 sed 's,@base_sbindir@,${base_sbindir},g' < ${WORKDIR}/busybox-syslog.service.in \
280 > ${D}${systemd_unitdir}/system/busybox-syslog.service
281 if [ -f ${WORKDIR}/busybox-syslog.default ] ; then
282 install -d ${D}${sysconfdir}/default
283 install -m 0644 ${WORKDIR}/busybox-syslog.default ${D}${sysconfdir}/default/busybox-syslog
284 fi
285 ln -sf /dev/null ${D}${systemd_unitdir}/system/syslog.service
286 fi
287 if grep -q "CONFIG_KLOGD=y" ${B}/.config; then
288 install -d ${D}${systemd_unitdir}/system
289 sed 's,@base_sbindir@,${base_sbindir},g' < ${WORKDIR}/busybox-klogd.service.in \
290 > ${D}${systemd_unitdir}/system/busybox-klogd.service
291 fi
292 fi
293
294 # Remove the sysvinit specific configuration file for systemd systems to avoid confusion
295 if ${@bb.utils.contains('DISTRO_FEATURES', 'sysvinit', 'false', 'true', d)}; then
296 rm -f ${D}${sysconfdir}/syslog-startup.conf.${BPN}
297 fi
298}
299
300inherit update-alternatives
301
302ALTERNATIVE_PRIORITY = "50"
303
304ALTERNATIVE_${PN}-syslog += "syslog-conf"
305ALTERNATIVE_LINK_NAME[syslog-conf] = "${sysconfdir}/syslog.conf"
306
307python () {
308 if bb.utils.contains('DISTRO_FEATURES', 'sysvinit', True, False, d):
309 pn = d.getVar('PN', True)
310 d.appendVar('ALTERNATIVE_%s-syslog' % (pn), ' syslog-init')
311 d.setVarFlag('ALTERNATIVE_LINK_NAME', 'syslog-init', '%s/init.d/syslog' % (d.getVar('sysconfdir', True)))
312 d.setVarFlag('ALTERNATIVE_TARGET', 'syslog-init', '%s/init.d/syslog.%s' % (d.getVar('sysconfdir', True), d.getVar('BPN', True)))
313 d.appendVar('ALTERNATIVE_%s-syslog' % (pn), ' syslog-startup-conf')
314 d.setVarFlag('ALTERNATIVE_LINK_NAME', 'syslog-startup-conf', '%s/syslog-startup.conf' % (d.getVar('sysconfdir', True)))
315 d.setVarFlag('ALTERNATIVE_TARGET', 'syslog-startup-conf', '%s/syslog-startup.conf.%s' % (d.getVar('sysconfdir', True), d.getVar('BPN', True)))
316}
317
318python do_package_prepend () {
319 # We need to load the full set of busybox provides from the /etc/busybox.links
320 # Use this to see the update-alternatives with the right information
321
322 dvar = d.getVar('D', True)
323 pn = d.getVar('PN', True)
324 def set_alternative_vars(links, target):
325 f = open('%s%s' % (dvar, links), 'r')
326 for alt_link_name in f:
327 alt_link_name = alt_link_name.strip()
328 alt_name = os.path.basename(alt_link_name)
329 # Match coreutils
330 if alt_name == '[':
331 alt_name = 'lbracket'
332 d.appendVar('ALTERNATIVE_%s' % (pn), ' ' + alt_name)
333 d.setVarFlag('ALTERNATIVE_LINK_NAME', alt_name, alt_link_name)
334 if os.path.exists('%s%s' % (dvar, target)):
335 d.setVarFlag('ALTERNATIVE_TARGET', alt_name, target)
336 f.close()
337 return
338
339 if os.path.exists('%s/etc/busybox.links' % (dvar)):
340 set_alternative_vars("/etc/busybox.links", "/bin/busybox")
341 else:
342 set_alternative_vars("/etc/busybox.links.nosuid", "/bin/busybox.nosuid")
343 set_alternative_vars("/etc/busybox.links.suid", "/bin/busybox.suid")
344}
345
346pkg_postinst_${PN} () {
347 # This part of code is dedicated to the on target upgrade problem.
348 # It's known that if we don't make appropriate symlinks before update-alternatives calls,
349 # there will be errors indicating missing commands such as 'sed'.
350 # These symlinks will later be updated by update-alternatives calls.
351 test -n 2 > /dev/null || alias test='busybox test'
352 if test "x$D" = "x"; then
353 # Remove busybox.nosuid if it's a symlink, because this situation indicates
354 # that we're installing or upgrading to a one-binary busybox.
355 if test -h /bin/busybox.nosuid; then
356 rm -f /bin/busybox.nosuid
357 fi
358 for suffix in "" ".nosuid" ".suid"; do
359 if test -e /etc/busybox.links$suffix; then
360 while read link; do
361 if test ! -e "$link"; then
362 case "$link" in
363 /*/*/*)
364 to="../../bin/busybox$suffix"
365 ;;
366 /bin/*)
367 to="busybox$suffix"
368 ;;
369 /*/*)
370 to="../bin/busybox$suffix"
371 ;;
372 esac
373 # we can use busybox here because even if we are using splitted busybox
374 # we've made a symlink from /bin/busybox to /bin/busybox.nosuid.
375 busybox rm -f $link
376 busybox ln -s $to $link
377 fi
378 done < /etc/busybox.links$suffix
379 fi
380 done
381 fi
382}
383
384pkg_prerm_${PN} () {
385 # This is so you can make busybox commit suicide - removing busybox with no other packages
386 # providing its files, this will make update-alternatives work, but the update-rc.d part
387 # for syslog, httpd and/or udhcpd will fail if there is no other package providing sh
388 tmpdir=`mktemp -d /tmp/busyboxrm-XXXXXX`
389 ln -s /bin/busybox $tmpdir/[
390 ln -s /bin/busybox $tmpdir/test
391 ln -s /bin/busybox $tmpdir/head
392 ln -s /bin/busybox $tmpdir/sh
393 ln -s /bin/busybox $tmpdir/basename
394 ln -s /bin/busybox $tmpdir/echo
395 ln -s /bin/busybox $tmpdir/mv
396 ln -s /bin/busybox $tmpdir/ln
397 ln -s /bin/busybox $tmpdir/dirname
398 ln -s /bin/busybox $tmpdir/rm
399 ln -s /bin/busybox $tmpdir/sed
400 ln -s /bin/busybox $tmpdir/sort
401 ln -s /bin/busybox $tmpdir/grep
402 export PATH=$PATH:$tmpdir
403}
404
405pkg_prerm_${PN}-syslog () {
406 # remove syslog
407 if test "x$D" = "x"; then
408 if test "$1" = "upgrade" -o "$1" = "remove"; then
409 /etc/init.d/syslog stop
410 fi
411 fi
412}