1#!/bin/sh 2# This script expects that the tree was built with the desired .config: 3# in particular, it expects that include/applets.h is generated already. 4# 5# The script will try to rebuild each enabled applet in isolation. 6# All other options which chose general bbox config, applet features, etc, 7# are not modified for the builds. 8 9makeopts="-j9" 10 11# The list of all applet config symbols 12test -f include/applets.h || { echo "No include/applets.h file"; exit 1; } 13apps="` 14grep ^IF_ include/applets.h \ 15| grep -v ^IF_FEATURE_ \ 16| sed 's/IF_\([A-Z0-9._-]*\)(.*/\1/' \ 17| sort | uniq 18`" 19 20# Take existing config 21test -f .config || { echo "No .config file"; exit 1; } 22cfg="`cat .config`" 23 24# Make a config with all applet symbols off 25allno="$cfg" 26for app in $apps; do 27 allno="`echo "$allno" | sed "s/^CONFIG_${app}=y\$/# CONFIG_${app} is not set/"`" 28done 29#echo "$allno" >.config_allno 30 31trap 'test -f .config.SV && mv .config.SV .config && touch .config' EXIT 32 33 34# Turn on each applet individually and build single-applet executable 35# (give config names on command line to build only those) 36test $# = 0 && set -- $apps 37fail=0 38for app; do 39 # Only if it was indeed originally enabled... 40 { echo "$cfg" | grep -q "^CONFIG_${app}=y\$"; } || continue 41 42 echo "Making ${app}..." 43 mv .config .config.SV 44 echo "CONFIG_${app}=y" >.config 45 echo "$allno" | sed "/^# CONFIG_${app} is not set\$/d" >>.config 46 47 if test x"${app}" != x"SH_IS_ASH" && test x"${app}" != x"SH_IS_HUSH"; then 48 # $allno has all choices for "sh" aliasing set to off. 49 # "sh" aliasing defaults to "ash", not none. 50 # without this fix, "make oldconfig" sets it wrong, 51 # resulting in NUM_APPLETS = 2 (the second applet is "sh") 52 sed '/CONFIG_SH_IS_NONE/d' -i .config 53 echo "CONFIG_SH_IS_NONE=y" >>.config 54 fi 55 56 if ! yes '' | make oldconfig >busybox_make_${app}.log 2>&1; then 57 : $((fail++)) 58 echo "Config error for ${app}" 59 mv .config busybox_config_${app} 60 elif ! make $makeopts >>busybox_make_${app}.log 2>&1; then 61 : $((fail++)) 62 grep -i -e error: -e warning: busybox_make_${app}.log 63 echo "Build error for ${app}" 64 mv .config busybox_config_${app} 65 elif ! grep -q '^#define NUM_APPLETS 1$' include/NUM_APPLETS.h; then 66 grep -i -e error: -e warning: busybox_make_${app}.log 67 mv busybox busybox_${app} 68 : $((fail++)) 69 echo "NUM_APPLETS != 1 for ${app}: `cat include/NUM_APPLETS.h`" 70 mv .config busybox_config_${app} 71 else 72 grep -i -e error: -e warning: busybox_make_${app}.log \ 73 || rm busybox_make_${app}.log 74 mv busybox busybox_${app} 75 #mv .config busybox_config_${app} 76 fi 77 mv .config.SV .config 78 #exit 79done 80touch .config # or else next "make" can be confused 81echo "Failures: $fail" 82test $fail = 0 # set exitcode 83