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| grep -v '^BUSYBOX$' \ 18| sort | uniq 19`" 20 21# Take existing config 22test -f .config || { echo "No .config file"; exit 1; } 23cfg="`cat .config`" 24 25# Make a config with all applet symbols off 26allno="$cfg" 27for app in $apps; do 28 allno="`echo "$allno" | sed "s/^CONFIG_${app}=y\$/# CONFIG_${app} is not set/"`" 29done 30# remove "busybox" as well 31allno="`echo "$allno" | sed "s/^CONFIG_BUSYBOX=y\$/# CONFIG_BUSYBOX is not set/"`" 32# disable any CONFIG_script_DEPENDENCIES as well 33allno="`echo "$allno" | sed "s/^\(CONFIG_.*_DEPENDENCIES\)=y\$/# \1 is not set/"`" 34#echo "$allno" >.config_allno 35 36trap 'test -f .config.SV && mv .config.SV .config && touch .config' EXIT 37 38 39# Turn on each applet individually and build single-applet executable 40# (give config names on command line to build only those) 41test $# = 0 && set -- $apps 42fail=0 43for app; do 44 # Only if it was indeed originally enabled... 45 { echo "$cfg" | grep -q "^CONFIG_${app}=y\$"; } || continue 46 47 echo "Making ${app}..." 48 mv .config .config.SV 49 echo "CONFIG_${app}=y" >.config 50 echo "$allno" | sed "/^# CONFIG_${app} is not set\$/d" >>.config 51 52 if test x"${app}" != x"SH_IS_ASH" && test x"${app}" != x"SH_IS_HUSH"; then 53 # $allno has all choices for "sh" aliasing set to off. 54 # "sh" aliasing defaults to "ash", not none. 55 # without this fix, "make oldconfig" sets it wrong, 56 # resulting in NUM_APPLETS = 2 (the second applet is "sh") 57 sed '/CONFIG_SH_IS_NONE/d' -i .config 58 echo "CONFIG_SH_IS_NONE=y" >>.config 59 fi 60 61 if ! yes '' | make oldconfig >busybox_make_${app}.log 2>&1; then 62 fail=$((fail+1)) 63 echo "Config error for ${app}" 64 mv .config busybox_config_${app} 65 elif ! make $makeopts >>busybox_make_${app}.log 2>&1; then 66 fail=$((fail+1)) 67 grep -i -e error: -e warning: busybox_make_${app}.log 68 echo "Build error for ${app}" 69 mv .config busybox_config_${app} 70 elif ! grep -q '^#define NUM_APPLETS 1$' include/NUM_APPLETS.h; then 71 grep -i -e error: -e warning: busybox_make_${app}.log 72 mv busybox busybox_${app} 73 fail=$((fail+1)) 74 echo "NUM_APPLETS != 1 for ${app}: `cat include/NUM_APPLETS.h`" 75 mv .config busybox_config_${app} 76 else 77 if grep -q 'use larger COMMON_BUFSIZE' busybox_make_${app}.log; then 78 # FEATURE_USE_BSS_TAIL=y is selected, and build system 79 # recommends rebuilding. Do so, and print some 80 # debug info to see whether it works right: 81 tail -n1 busybox_make_${app}.log 82 nm busybox_unstripped | grep ' _end' 83 make >/dev/null 2>&1 84 nm busybox_unstripped | grep ' _end' 85 grep ^bb_common_bufsiz1 busybox_unstripped.map 86 fi 87 grep -i -e error: -e warning: busybox_make_${app}.log \ 88 || rm busybox_make_${app}.log 89 mv busybox busybox_${app} 90 #mv .config busybox_config_${app} 91 fi 92 mv .config.SV .config 93 #exit 94done 95touch .config # or else next "make" can be confused 96echo "Failures: $fail" 97test $fail = 0 # set exitcode 98