hush/make_single_applets.sh
Denys Vlasenko 28251dfa64 Make it possible to select "sh" and "bash" aliases without selecting ash or hush
The same can be done for msh, but we are probably better off just deleting it
in a next versio or two.

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2017-01-01 13:01:04 +01:00

74 lines
2.2 KiB
Bash
Executable File

#!/bin/sh
# This script expects that the tree was built with the desired .config:
# in particular, it expects that include/applets.h is generated already.
#
# The script will try to rebuild each enabled applet in isolation.
# All other options which chose general bbox config, applet features, etc,
# are not modified for the builds.
makeopts="-j9"
# The list of all applet config symbols
test -f include/applets.h || { echo "No include/applets.h file"; exit 1; }
apps="`
grep ^IF_ include/applets.h \
| grep -v ^IF_FEATURE_ \
| sed 's/IF_\([A-Z0-9._-]*\)(.*/\1/' \
| sort | uniq
`"
# Take existing config
test -f .config || { echo "No .config file"; exit 1; }
cfg="`cat .config`"
# Make a config with all applet symbols off
allno="$cfg"
for app in $apps; do
allno="`echo "$allno" | sed "s/^CONFIG_${app}=y\$/# CONFIG_${app} is not set/"`"
done
#echo "$allno" >.config_allno
# Turn on each applet individually and build single-applet executable
fail=0
for app in $apps; do
# Only if it was indeed originally enabled...
{ echo "$cfg" | grep -q "^CONFIG_${app}=y\$"; } || continue
echo "Making ${app}..."
mv .config .config.SV
echo "CONFIG_${app}=y" >.config
echo "$allno" | sed "/^# CONFIG_${app} is not set\$/d" >>.config
if test x"${app}" != x"SH_IS_ASH"; then
# $allno has all choices for "sh" aliasing at off.
# "sh" aliasing defaults to "ash", not none.
# without this fix, "make oldconfig" sets it wrong,
# resulting in NUM_APPLETS = 2
sed '/CONFIG_SH_IS_NONE/d' -i .config
echo "CONFIG_SH_IS_NONE=y" >>.config
fi
if ! yes '' | make oldconfig >busybox_make_${app}.log 2>&1; then
: $((fail++))
echo "Config error for ${app}"
mv .config busybox_config_${app}
elif ! make $makeopts >busybox_make_${app}.log 2>&1; then
: $((fail++))
echo "Build error for ${app}"
mv .config busybox_config_${app}
elif ! grep -q '^#define NUM_APPLETS 1$' include/NUM_APPLETS.h; then
mv busybox busybox_${app}
: $((fail++))
echo "NUM_APPLETS != 1 for ${app}: `cat include/NUM_APPLETS.h`"
mv .config busybox_config_${app}
else
mv busybox busybox_${app}
rm busybox_make_${app}.log
fi
mv .config.SV .config
#exit
done
touch .config # or else next "make" can be confused
echo "Failures: $fail"
test $fail = 0 # set exitcode