diff options
Diffstat (limited to 'meta/recipes-core/busybox/busybox.inc')
-rw-r--r-- | meta/recipes-core/busybox/busybox.inc | 404 |
1 files changed, 236 insertions, 168 deletions
diff --git a/meta/recipes-core/busybox/busybox.inc b/meta/recipes-core/busybox/busybox.inc index 4012f921c6..f5d7c3f9c8 100644 --- a/meta/recipes-core/busybox/busybox.inc +++ b/meta/recipes-core/busybox/busybox.inc @@ -1,14 +1,15 @@ SUMMARY = "Tiny versions of many common UNIX utilities in a single small executable" DESCRIPTION = "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." -HOMEPAGE = "http://www.busybox.net" +HOMEPAGE = "https://www.busybox.net" BUGTRACKER = "https://bugs.busybox.net/" -DEPENDS += "kern-tools-native" +DEPENDS += "kern-tools-native virtual/crypt" -# bzip2 applet in busybox is based on lightly-modified bzip2 source +# bzip2 applet in busybox is based on lightly-modified bzip2-1.0.4 source # the GPL is version 2 only -LICENSE = "GPLv2 & bzip2" -LIC_FILES_CHKSUM = "file://LICENSE;md5=de10de48642ab74318e893a61105afbb" +LICENSE = "GPL-2.0-only & bzip2-1.0.4" +LIC_FILES_CHKSUM = "file://LICENSE;md5=de10de48642ab74318e893a61105afbb \ + file://archival/libarchive/bz/LICENSE;md5=28e3301eae987e8cfe19988e98383dae" SECTION = "base" @@ -22,65 +23,71 @@ EXTRA_OEMAKE = "CC='${CC}' LD='${CCLD}' V=1 ARCH=${TARGET_ARCH} CROSS_COMPILE=${ PACKAGES =+ "${PN}-httpd ${PN}-udhcpd ${PN}-udhcpc ${PN}-syslog ${PN}-mdev ${PN}-hwclock" -FILES_${PN}-httpd = "${sysconfdir}/init.d/busybox-httpd /srv/www" -FILES_${PN}-syslog = "${sysconfdir}/init.d/syslog* ${sysconfdir}/syslog-startup.conf* ${sysconfdir}/syslog.conf* ${systemd_unitdir}/system/syslog.service ${sysconfdir}/default/busybox-syslog" -FILES_${PN}-mdev = "${sysconfdir}/init.d/mdev ${sysconfdir}/mdev.conf ${sysconfdir}/mdev/*" -FILES_${PN}-udhcpd = "${sysconfdir}/init.d/busybox-udhcpd" -FILES_${PN}-udhcpc = "${sysconfdir}/udhcpc.d ${datadir}/udhcpc" -FILES_${PN}-hwclock = "${sysconfdir}/init.d/hwclock.sh" +FILES:${PN}-httpd = "${sysconfdir}/init.d/busybox-httpd /srv/www" +FILES:${PN}-syslog = "${sysconfdir}/init.d/syslog* ${sysconfdir}/syslog-startup.conf* ${sysconfdir}/syslog.conf* ${systemd_system_unitdir}/syslog.service ${sysconfdir}/default/busybox-syslog" +FILES:${PN}-mdev = "${sysconfdir}/init.d/mdev ${sysconfdir}/mdev.conf ${sysconfdir}/mdev/*" +FILES:${PN}-udhcpd = "${sysconfdir}/init.d/busybox-udhcpd" +FILES:${PN}-udhcpc = "${sysconfdir}/udhcpc.d ${datadir}/udhcpc" +FILES:${PN}-hwclock = "${sysconfdir}/init.d/hwclock.sh" INITSCRIPT_PACKAGES = "${PN}-httpd ${PN}-syslog ${PN}-udhcpd ${PN}-mdev ${PN}-hwclock" -INITSCRIPT_NAME_${PN}-httpd = "busybox-httpd" -INITSCRIPT_NAME_${PN}-hwclock = "hwclock.sh" -INITSCRIPT_NAME_${PN}-mdev = "mdev" -INITSCRIPT_PARAMS_${PN}-mdev = "start 04 S ." -INITSCRIPT_NAME_${PN}-syslog = "syslog" -INITSCRIPT_NAME_${PN}-udhcpd = "busybox-udhcpd" +INITSCRIPT_NAME:${PN}-httpd = "busybox-httpd" +INITSCRIPT_NAME:${PN}-hwclock = "hwclock.sh" +INITSCRIPT_PARAMS:${PN}-hwclock = "start 40 S . stop 20 0 1 6 ." +INITSCRIPT_NAME:${PN}-mdev = "mdev" +INITSCRIPT_PARAMS:${PN}-mdev = "start 04 S ." +INITSCRIPT_NAME:${PN}-syslog = "syslog" +INITSCRIPT_NAME:${PN}-udhcpd = "busybox-udhcpd" SYSTEMD_PACKAGES = "${PN}-syslog" -SYSTEMD_SERVICE_${PN}-syslog = "${@bb.utils.contains('SRC_URI', 'file://syslog.cfg', 'busybox-syslog.service', '', d)}" +SYSTEMD_SERVICE:${PN}-syslog = "${@bb.utils.contains('SRC_URI', 'file://syslog.cfg', 'busybox-syslog.service', '', d)}" -CONFFILES_${PN}-syslog = "${sysconfdir}/syslog-startup.conf" -RCONFLICTS_${PN}-syslog = "rsyslog sysklogd syslog-ng" +RDEPENDS:${PN}-syslog = "busybox" +CONFFILES:${PN}-syslog = "${sysconfdir}/syslog-startup.conf" +RCONFLICTS:${PN}-syslog = "rsyslog sysklogd syslog-ng" -CONFFILES_${PN}-mdev = "${sysconfdir}/mdev.conf" +CONFFILES:${PN}-mdev = "${sysconfdir}/mdev.conf" -RRECOMMENDS_${PN} = "${PN}-syslog ${PN}-udhcpc" +RRECOMMENDS:${PN} = "${PN}-udhcpc" + +RDEPENDS:${PN} = "${@["", "busybox-inittab"][(d.getVar('VIRTUAL-RUNTIME_init_manager') == 'busybox')]}" inherit cml1 systemd update-rc.d ptest +# busybox's unzip test case needs zip command, which busybox itself does not provide +RDEPENDS:${PN}-ptest = "zip" + # internal helper def busybox_cfg(feature, tokens, cnf, rem): - if type(tokens) == type(""): - tokens = [tokens] - rem.extend(['/^[# ]*' + token + '[ =]/d' for token in tokens]) - if feature: - cnf.extend([token + '=y' for token in tokens]) - else: - cnf.extend(['# ' + token + ' is not set' for token in tokens]) + if type(tokens) == type(""): + tokens = [tokens] + rem.extend(['/^[# ]*' + token + '[ =]/d' for token in tokens]) + if feature: + cnf.extend([token + '=y' for token in tokens]) + else: + cnf.extend(['# ' + token + ' is not set' for token in tokens]) # Map distro features to config settings def features_to_busybox_settings(d): - cnf, rem = ([], []) - busybox_cfg(bb.utils.contains('DISTRO_FEATURES', 'ipv6', True, False, d), 'CONFIG_FEATURE_IPV6', cnf, rem) - busybox_cfg(True, 'CONFIG_LFS', cnf, rem) - busybox_cfg(True, 'CONFIG_FDISK_SUPPORT_LARGE_DISKS', cnf, rem) - busybox_cfg(bb.utils.contains('DISTRO_FEATURES', 'nls', True, False, d), 'CONFIG_LOCALE_SUPPORT', cnf, rem) - busybox_cfg(bb.utils.contains('DISTRO_FEATURES', 'ipv4', True, False, d), 'CONFIG_FEATURE_IFUPDOWN_IPV4', cnf, rem) - busybox_cfg(bb.utils.contains('DISTRO_FEATURES', 'ipv6', True, False, d), 'CONFIG_FEATURE_IFUPDOWN_IPV6', cnf, rem) - busybox_cfg(bb.utils.contains('DISTRO_FEATURES', 'wifi', True, False, d), 'CONFIG_RFKILL', cnf, rem) - busybox_cfg(bb.utils.contains('DISTRO_FEATURES', 'bluetooth', True, False, d), 'CONFIG_RFKILL', cnf, rem) - return "\n".join(cnf), "\n".join(rem) + cnf, rem = ([], []) + busybox_cfg(bb.utils.contains('DISTRO_FEATURES', 'ipv6', True, False, d), 'CONFIG_FEATURE_IPV6', cnf, rem) + busybox_cfg(True, 'CONFIG_LFS', cnf, rem) + busybox_cfg(True, 'CONFIG_FDISK_SUPPORT_LARGE_DISKS', cnf, rem) + busybox_cfg(bb.utils.contains('DISTRO_FEATURES', 'nls', True, False, d), 'CONFIG_LOCALE_SUPPORT', cnf, rem) + busybox_cfg(bb.utils.contains('DISTRO_FEATURES', 'ipv4', True, False, d), 'CONFIG_FEATURE_IFUPDOWN_IPV4', cnf, rem) + busybox_cfg(bb.utils.contains('DISTRO_FEATURES', 'ipv6', True, False, d), 'CONFIG_FEATURE_IFUPDOWN_IPV6', cnf, rem) + busybox_cfg(bb.utils.contains_any('DISTRO_FEATURES', 'bluetooth wifi', True, False, d), 'CONFIG_RFKILL', cnf, rem) + return "\n".join(cnf), "\n".join(rem) # X, Y = ${@features_to_busybox_settings(d)} # unfortunately doesn't seem to work with bitbake, workaround: def features_to_busybox_conf(d): - cnf, rem = features_to_busybox_settings(d) - return cnf + cnf, rem = features_to_busybox_settings(d) + return cnf def features_to_busybox_del(d): - cnf, rem = features_to_busybox_settings(d) - return rem + cnf, rem = features_to_busybox_settings(d) + return rem configmangle = '/CONFIG_EXTRA_CFLAGS/d; \ ' @@ -91,12 +98,12 @@ DO_IPv6 := "${@bb.utils.contains('DISTRO_FEATURES', 'ipv6', 1, 0, d)}" python () { if "${OE_DEL}": - d.setVar('configmangle_append', "${OE_DEL}" + "\n") + d.setVar('configmangle:append', "${OE_DEL}" + "\n") if "${OE_FEATURES}": - d.setVar('configmangle_append', + d.setVar('configmangle:append', "/^### DISTRO FEATURES$/a\\\n%s\n\n" % ("\\n".join((d.expand("${OE_FEATURES}").split("\n"))))) - d.setVar('configmangle_append', + d.setVar('configmangle:append', "/^### CROSS$/a\\\n%s\n" % ("\\n".join(["CONFIG_EXTRA_CFLAGS=\"${CFLAGS} ${HOST_CC_ARCH}\"" ]) @@ -104,9 +111,8 @@ python () { } do_prepare_config () { - if [ "$BUILD_REPRODUCIBLE_BINARIES" = "1" ]; then - export KCONFIG_NOTIMESTAMP=1 - fi + export KCONFIG_NOTIMESTAMP=1 + sed -e '/CONFIG_STATIC/d' \ < ${WORKDIR}/defconfig > ${S}/.config echo "# CONFIG_STATIC is not set" >> .config @@ -114,46 +120,45 @@ do_prepare_config () { ${S}/.config sed -i -e '${configmangle}' ${S}/.config if test ${DO_IPv4} -eq 0 && test ${DO_IPv6} -eq 0; then - # disable networking applets - mv ${S}/.config ${S}/.config.oe-tmp - awk 'BEGIN{net=0} - /^# Networking Utilities/{net=1} - /^#$/{if(net){net=net+1}} - {if(net==2&&$0 !~ /^#/&&$1){print("# "$1" is not set")}else{print}}' \ - ${S}/.config.oe-tmp > ${S}/.config + # disable networking applets + mv ${S}/.config ${S}/.config.oe-tmp + awk 'BEGIN{net=0} + /^# Networking Utilities/{net=1} + /^#$/{if(net){net=net+1}} + {if(net==2&&$0 !~ /^#/&&$1){print("# "$1" is not set")}else{print}}' \ + ${S}/.config.oe-tmp > ${S}/.config fi sed -i 's/CONFIG_IFUPDOWN_UDHCPC_CMD_OPTIONS="-R -n"/CONFIG_IFUPDOWN_UDHCPC_CMD_OPTIONS="-R -b"/' ${S}/.config - sed -i 's|${DEBUG_PREFIX_MAP}||g' ${S}/.config + if [ -n "${DEBUG_PREFIX_MAP}" ]; then + sed -i 's|${DEBUG_PREFIX_MAP}||g' ${S}/.config + fi } -# returns all the elements from the src uri that are .cfg files -def find_cfgs(d): - sources=src_patches(d, True) - sources_list=[] - for s in sources: - if s.endswith('.cfg'): - sources_list.append(s) - - return sources_list - do_configure () { + set -x do_prepare_config merge_config.sh -m .config ${@" ".join(find_cfgs(d))} cml1_do_configure + + # Save a copy of .config and autoconf.h. + cp .config .config.orig + cp include/autoconf.h include/autoconf.h.orig } do_compile() { unset CFLAGS CPPFLAGS CXXFLAGS LDFLAGS - if [ "$BUILD_REPRODUCIBLE_BINARIES" = "1" ]; then - export KCONFIG_NOTIMESTAMP=1 - fi + export KCONFIG_NOTIMESTAMP=1 + + # Ensure we start do_compile with the original .config and autoconf.h. + # These files should always have matching timestamps. + cp .config.orig .config + cp include/autoconf.h.orig include/autoconf.h + if [ "${BUSYBOX_SPLIT_SUID}" = "1" -a x`grep "CONFIG_FEATURE_INDIVIDUAL=y" .config` = x ]; then - # split the .config into two parts, and make two busybox binaries - if [ -e .config.orig ]; then - # Need to guard again an interrupted do_compile - restore any backup - cp .config.orig .config - fi - cp .config .config.orig + # Guard againt interrupted do_compile: clean temporary files. + rm -f .config.app.suid .config.app.nosuid .config.disable.apps .config.nonapps + + # split the .config into two parts, and make two busybox binaries oe_runmake busybox.cfg.suid oe_runmake busybox.cfg.nosuid @@ -181,17 +186,27 @@ do_compile() { oe_runmake busybox_unstripped mv busybox_unstripped busybox.$s oe_runmake busybox.links - mv busybox.links busybox.links.$s + sort busybox.links > busybox.links.$s + rm busybox.links done - # copy .config.orig back to .config, because the install process may check this file - cp .config.orig .config + + # hard fail if sh is being linked to the suid busybox (detects bug 10346) + if grep -q -x "/bin/sh" busybox.links.suid; then + bbfatal "busybox suid binary incorrectly provides /bin/sh" + fi + # cleanup - rm .config.orig .config.app.suid .config.app.nosuid .config.disable.apps .config.nonapps + rm .config.app.suid .config.app.nosuid .config.disable.apps .config.nonapps else oe_runmake busybox_unstripped cp busybox_unstripped busybox oe_runmake busybox.links fi + + # restore original .config and autoconf.h, because the install process + # may check these files + cp .config.orig .config + cp include/autoconf.h.orig include/autoconf.h } do_install () { @@ -200,6 +215,10 @@ do_install () { sed -i "s:^/usr/bin/:BINDIR/:" busybox.links* sed -i "s:^/usr/sbin/:SBINDIR/:" busybox.links* + # Move arch/link to BINDIR to match coreutils + sed -i "s:^BASE_BINDIR/arch:BINDIR/arch:" busybox.links* + sed -i "s:^BASE_BINDIR/link:BINDIR/link:" busybox.links* + sed -i "s:^BASE_BINDIR/:${base_bindir}/:" busybox.links* sed -i "s:^BASE_SBINDIR/:${base_sbindir}/:" busybox.links* sed -i "s:^BINDIR/:${bindir}/:" busybox.links* @@ -241,8 +260,7 @@ do_install () { ln -sf busybox ${D}${base_bindir}/busybox.nosuid fi else - install -d ${D}${base_bindir} ${D}${base_sbindir} - install -d ${D}${libdir} ${D}${bindir} ${D}${sbindir} + install -d ${D}${base_bindir} ${D}${bindir} ${D}${libdir} cat busybox.links | while read FILE; do NAME=`basename "$FILE"` install -m 0755 "0_lib/$NAME" "${D}$FILE.${BPN}" @@ -266,90 +284,88 @@ do_install () { install -m 644 ${WORKDIR}/syslog-startup.conf ${D}${sysconfdir}/syslog-startup.conf install -m 644 ${WORKDIR}/syslog.conf ${D}${sysconfdir}/syslog.conf fi - if grep "CONFIG_CROND=y" ${B}/.config; then + if grep -q "CONFIG_CROND=y" ${B}/.config; then install -m 0755 ${WORKDIR}/busybox-cron ${D}${sysconfdir}/init.d/ fi - if grep "CONFIG_HTTPD=y" ${B}/.config; then + if grep -q "CONFIG_HTTPD=y" ${B}/.config; then install -m 0755 ${WORKDIR}/busybox-httpd ${D}${sysconfdir}/init.d/ install -d ${D}/srv/www fi - if grep "CONFIG_UDHCPD=y" ${B}/.config; then + if grep -q "CONFIG_UDHCPD=y" ${B}/.config; then install -m 0755 ${WORKDIR}/busybox-udhcpd ${D}${sysconfdir}/init.d/ fi - if grep "CONFIG_HWCLOCK=y" ${B}/.config; then + if grep -q "CONFIG_HWCLOCK=y" ${B}/.config; then install -m 0755 ${WORKDIR}/hwclock.sh ${D}${sysconfdir}/init.d/ fi - if grep "CONFIG_UDHCPC=y" ${B}/.config; then + if grep -q "CONFIG_UDHCPC=y" ${B}/.config; then install -d ${D}${sysconfdir}/udhcpc.d install -d ${D}${datadir}/udhcpc install -m 0755 ${WORKDIR}/simple.script ${D}${sysconfdir}/udhcpc.d/50default sed -i "s:/SBIN_DIR/:${base_sbindir}/:" ${D}${sysconfdir}/udhcpc.d/50default install -m 0755 ${WORKDIR}/default.script ${D}${datadir}/udhcpc/default.script fi - if grep "CONFIG_INETD=y" ${B}/.config; then + if grep -q "CONFIG_INETD=y" ${B}/.config; then install -m 0755 ${WORKDIR}/inetd ${D}${sysconfdir}/init.d/inetd.${BPN} sed -i "s:/usr/sbin/:${sbindir}/:" ${D}${sysconfdir}/init.d/inetd.${BPN} install -m 0644 ${WORKDIR}/inetd.conf ${D}${sysconfdir}/ fi - if grep "CONFIG_MDEV=y" ${B}/.config; then - install -m 0755 ${WORKDIR}/mdev ${D}${sysconfdir}/init.d/mdev - if grep "CONFIG_FEATURE_MDEV_CONF=y" ${B}/.config; then - install -m 644 ${WORKDIR}/mdev.conf ${D}${sysconfdir}/mdev.conf - install -d ${D}${sysconfdir}/mdev - install -m 0755 ${WORKDIR}/find-touchscreen.sh ${D}${sysconfdir}/mdev - install -m 0755 ${WORKDIR}/mdev-mount.sh ${D}${sysconfdir}/mdev - fi + if grep -q "CONFIG_MDEV=y" ${B}/.config; then + install -m 0755 ${WORKDIR}/mdev ${D}${sysconfdir}/init.d/mdev + if grep "CONFIG_FEATURE_MDEV_CONF=y" ${B}/.config; then + install -m 644 ${WORKDIR}/mdev.conf ${D}${sysconfdir}/mdev.conf + install -d ${D}${sysconfdir}/mdev + install -m 0755 ${WORKDIR}/find-touchscreen.sh ${D}${sysconfdir}/mdev + install -m 0755 ${WORKDIR}/mdev-mount.sh ${D}${sysconfdir}/mdev + fi + fi + if grep -q "CONFIG_INIT=y" ${B}/.config && ${@bb.utils.contains('VIRTUAL-RUNTIME_init_manager','busybox','true','false',d)}; then + install -D -m 0755 ${WORKDIR}/rcS ${D}${sysconfdir}/init.d/rcS + install -D -m 0755 ${WORKDIR}/rcK ${D}${sysconfdir}/init.d/rcK + install -D -m 0755 ${WORKDIR}/rcS.default ${D}${sysconfdir}/default/rcS fi - if grep "CONFIG_INIT=y" ${B}/.config; then - install -D -m 0777 ${WORKDIR}/rcS ${D}${sysconfdir}/init.d/rcS - install -D -m 0777 ${WORKDIR}/rcK ${D}${sysconfdir}/init.d/rcK - install -D -m 0755 ${WORKDIR}/runlevel ${D}${base_sbindir}/runlevel - if grep "CONFIG_FEATURE_USE_INITTAB=y" ${B}/.config; then - install -D -m 0777 ${WORKDIR}/inittab ${D}${sysconfdir}/inittab - tmp="${SERIAL_CONSOLES}" - for i in $tmp - do - j=`echo ${i} | sed s/\;/\ /g` - id=`echo ${i} | sed -e 's/^.*;//' -e 's/;.*//'` - echo "$id::respawn:${base_sbindir}/getty ${j}" >> ${D}${sysconfdir}/inittab - done - fi - fi - if ${@bb.utils.contains('DISTRO_FEATURES','systemd','true','false',d)}; then - if grep -q "CONFIG_SYSLOGD=y" ${B}/.config; then - install -d ${D}${systemd_unitdir}/system - sed 's,@base_sbindir@,${base_sbindir},g' < ${WORKDIR}/busybox-syslog.service.in \ - > ${D}${systemd_unitdir}/system/busybox-syslog.service - if [ -f ${WORKDIR}/busybox-syslog.default ] ; then - install -d ${D}${sysconfdir}/default - install -m 0644 ${WORKDIR}/busybox-syslog.default ${D}${sysconfdir}/default/busybox-syslog - fi - fi - if grep -q "CONFIG_KLOGD=y" ${B}/.config; then - install -d ${D}${systemd_unitdir}/system - sed 's,@base_sbindir@,${base_sbindir},g' < ${WORKDIR}/busybox-klogd.service.in \ - > ${D}${systemd_unitdir}/system/busybox-klogd.service - fi - fi + if ${@bb.utils.contains('DISTRO_FEATURES','systemd','true','false',d)}; then + if grep -q "CONFIG_KLOGD=y" ${B}/.config; then + install -d ${D}${systemd_system_unitdir} + sed 's,@base_sbindir@,${base_sbindir},g' < ${WORKDIR}/busybox-klogd.service.in \ + > ${D}${systemd_system_unitdir}/busybox-klogd.service + fi - # Remove the sysvinit specific configuration file for systemd systems to avoid confusion - if ${@bb.utils.contains('DISTRO_FEATURES', 'sysvinit', 'false', 'true', d)}; then - rm -f ${D}${sysconfdir}/syslog-startup.conf - fi + if grep -q "CONFIG_SYSLOGD=y" ${B}/.config; then + install -d ${D}${systemd_system_unitdir} + sed 's,@base_sbindir@,${base_sbindir},g' < ${WORKDIR}/busybox-syslog.service.in \ + > ${D}${systemd_system_unitdir}/busybox-syslog.service + if [ ! -e ${D}${systemd_system_unitdir}/busybox-klogd.service ] ; then + sed -i '/klog/d' ${D}${systemd_system_unitdir}/busybox-syslog.service + fi + if [ -f ${WORKDIR}/busybox-syslog.default ] ; then + install -d ${D}${sysconfdir}/default + install -m 0644 ${WORKDIR}/busybox-syslog.default ${D}${sysconfdir}/default/busybox-syslog + fi + fi + fi + + # Remove the sysvinit specific configuration file for systemd systems to avoid confusion + if ${@bb.utils.contains('DISTRO_FEATURES', 'sysvinit', 'false', 'true', d)}; then + rm -f ${D}${sysconfdir}/syslog-startup.conf + fi } +PTEST_BINDIR = "1" + do_install_ptest () { - cp -r ${B}/testsuite ${D}${PTEST_PATH}/ - cp ${B}/.config ${D}${PTEST_PATH}/ - ln -s /bin/busybox ${D}${PTEST_PATH}/busybox + cp -r ${B}/testsuite ${D}${PTEST_PATH}/ + # These access the internet which is not guaranteed to work on machines running the tests + rm -rf ${D}${PTEST_PATH}/testsuite/wget + sort ${B}/.config > ${D}${PTEST_PATH}/.config + ln -s ${base_bindir}/busybox ${D}${PTEST_PATH}/busybox } inherit update-alternatives ALTERNATIVE_PRIORITY = "50" -python do_package_prepend () { +python do_package:prepend () { # We need to load the full set of busybox provides from the /etc/busybox.links # Use this to see the update-alternatives with the right information @@ -365,7 +381,10 @@ python do_package_prepend () { # Match coreutils if alt_name == '[': alt_name = 'lbracket' - d.appendVar('ALTERNATIVE_%s' % (pn), ' ' + alt_name) + if alt_name == 'klogd' or alt_name == 'syslogd': + d.appendVar('ALTERNATIVE:%s-syslog' % (pn), ' ' + alt_name) + else: + d.appendVar('ALTERNATIVE:%s' % (pn), ' ' + alt_name) d.setVarFlag('ALTERNATIVE_LINK_NAME', alt_name, alt_link_name) if os.path.exists('%s%s' % (dvar, target)): d.setVarFlag('ALTERNATIVE_TARGET', alt_name, target) @@ -379,37 +398,69 @@ python do_package_prepend () { set_alternative_vars("${sysconfdir}/busybox.links.suid", "${base_bindir}/busybox.suid") } -pkg_postinst_${PN} () { - # This part of code is dedicated to the on target upgrade problem. - # It's known that if we don't make appropriate symlinks before update-alternatives calls, - # there will be errors indicating missing commands such as 'sed'. - # These symlinks will later be updated by update-alternatives calls. - test -n 2 > /dev/null || alias test='busybox test' - if test "x$D" = "x"; then - # Remove busybox.nosuid if it's a symlink, because this situation indicates - # that we're installing or upgrading to a one-binary busybox. - if test -h ${base_bindir}/busybox.nosuid; then - rm -f ${base_bindir}/busybox.nosuid - fi - for suffix in "" ".nosuid" ".suid"; do - if test -e ${sysconfdir}/busybox.links$suffix; then - while read link; do - if test ! -e "$link"; then - # we can use busybox here because even if we are using splitted busybox - # we've made a symlink from /bin/busybox to /bin/busybox.nosuid. - busybox rm -f $link - busybox ln -s "${base_bindir}/busybox$suffix" $link - fi - done < ${sysconfdir}/busybox.links$suffix - fi - done - fi - if grep -q "^${base_bindir}/bash$" $D${sysconfdir}/busybox.links*; then - grep -q "^${base_bindir}/bash$" $D${sysconfdir}/shells || echo ${base_bindir}/bash >> $D${sysconfdir}/shells - fi +# This part of code is dedicated to the on target upgrade problem. It's known +# that if we don't make appropriate symlinks before update-alternatives calls, +# there will be errors indicating missing commands such as 'sed'. +# These symlinks will later be updated by update-alternatives calls. +# The update-alternatives.bbclass' postinst script runs firstly before other +# postinst, but this part of code needs run firstly, so add this funtion. +python populate_packages_updatealternatives:append() { + postinst = """ +test -n 2 > /dev/null || alias test='busybox test' +if test "x$D" = "x"; then + # Remove busybox.nosuid if it's a symlink, because this situation indicates + # that we're installing or upgrading to a one-binary busybox. + if test -h ${base_bindir}/busybox.nosuid; then + rm -f ${base_bindir}/busybox.nosuid + fi + for suffix in "" ".nosuid" ".suid"; do + if test -e ${sysconfdir}/busybox.links$suffix; then + while read link; do + if test ! -e "$link"; then + # we can use busybox here because even if we are using splitted busybox + # we've made a symlink from /bin/busybox to /bin/busybox.nosuid. + busybox rm -f $link + busybox ln -s "${base_bindir}/busybox$suffix" $link + fi + done < ${sysconfdir}/busybox.links$suffix + fi + done +fi +if grep -q "^${base_bindir}/bash$" $D${sysconfdir}/busybox.links*; then + grep -q "^${base_bindir}/bash$" $D${sysconfdir}/shells || echo ${base_bindir}/bash >> $D${sysconfdir}/shells +fi + +""" + d.prependVar('pkg_postinst:%s' % pkg, postinst) +} + +pkg_postinst:${PN}:prepend () { + # Need path to saved utils, but they may have be removed on upgrade of busybox + # Only use shell to get paths. Also capture if busybox was saved. + BUSYBOX="" + if [ "x$D" = "x" ] ; then + for busybox_rmdir in /tmp/busyboxrm-*; do + if [ "$busybox_rmdir" != '/tmp/busyboxrm-*' ] ; then + export PATH=$busybox_rmdir:$PATH + if [ -e $busybox_rmdir/busybox* ] ; then + BUSYBOX="$busybox_rmdir/busybox*" + fi + fi + done + fi } -pkg_prerm_${PN} () { +pkg_postinst:${PN}:append () { + # If busybox exists in the remove directory it is because it was the only shell left. + if [ "x$D" = "x" ] ; then + if [ "x$BUSYBOX" != "x" ] ; then + update-alternatives --remove sh $BUSYBOX + rm -f $BUSYBOX + fi + fi +} + +pkg_prerm:${PN} () { # This is so you can make busybox commit suicide - removing busybox with no other packages # providing its files, this will make update-alternatives work, but the update-rc.d part # for syslog, httpd and/or udhcpd will fail if there is no other package providing sh @@ -429,15 +480,32 @@ pkg_prerm_${PN} () { ln -s ${base_bindir}/busybox $tmpdir/grep ln -s ${base_bindir}/busybox $tmpdir/tail export PATH=$PATH:$tmpdir + + # If busybox is the shell, we need to save it since its the lowest priority shell + # Register saved bitbake as the lowest priority shell possible as back up. + if [ -n "$(readlink -f /bin/sh | grep busybox)" ] ; then + BUSYBOX=$(readlink -f /bin/sh) + cp $BUSYBOX $tmpdir/$(basename $BUSYBOX) + update-alternatives --install /bin/sh sh $tmpdir/$(basename $BUSYBOX) 1 + fi } -pkg_postrm_${PN} () { +pkg_postrm:${PN} () { + # Add path to remove dir in case we removed our only grep + if [ "x$D" = "x" ] ; then + for busybox_rmdir in /tmp/busyboxrm-*; do + if [ "$busybox_rmdir" != '/tmp/busyboxrm-*' ] ; then + export PATH=$busybox_rmdir:$PATH + fi + done + fi + if grep -q "^${base_bindir}/bash$" $D${sysconfdir}/busybox.links* && [ ! -e $D${base_bindir}/bash ]; then printf "$(grep -v "^${base_bindir}/bash$" $D${sysconfdir}/shells)\n" > $D${sysconfdir}/shells fi } -pkg_prerm_${PN}-syslog () { +pkg_prerm:${PN}-syslog () { # remove syslog if test "x$D" = "x"; then if test "$1" = "upgrade" -o "$1" = "remove"; then @@ -446,4 +514,4 @@ pkg_prerm_${PN}-syslog () { fi } -RPROVIDES_${PN} += "${@bb.utils.contains('DISTRO_FEATURES', 'usrmerge', '/bin/sh', '', d)}" +RPROVIDES:${PN} += "${@bb.utils.contains('DISTRO_FEATURES', 'usrmerge', '/bin/sh /bin/ash', '', d)}" |