#! /bin/sh
# Public Domain
# version 0.5d
LC_ALL=C
LANG=POSIX
export LC_ALL LANG

src=${1-"./"}
shift
cd ${src?} || exit 1
TROOT="svn://busybox.net/trunk"
what=busybox
[ "x${arch}" = "x" ] && arch=$(arch)
#echo "${*-0}" | grep -q -i \-v && VERBOSE=1 && set -x

ignorelist="(HAVE_DOT_CONFIG|PREFIX|CONFIG_(SHOW_USAGE|SELINUX|STATIC|BUILD.*|INSTALL_.*|LFS|NITPICK|DEBUG|NO_DEBUG_LIB|DMALLOC|EFENCE|STRIP_BINARIES|LOCALE_SUPPORT|MD5_SIZE_VS_SPEED|BUSYBOX_EXEC_PATH|GETOPT_LONG|PASSWORD_MINLEN|FEATURE_(INSTALLER|DEVFS|VERBOSE_USAGE))|CROSS_COMPILER_PREFIX|EXTRA_CFLAGS_OPTIONS)"
buff_list="CONFIG_FEATURE_BUFFERS_USE_MALLOC=y CONFIG_FEATURE_BUFFERS_GO_ON_STACK=y CONFIG_FEATURE_BUFFERS_GO_IN_BSS=y"
cleanup_list="'' CONFIG_FEATURE_CLEAN_UP=y"

dolist1="'' CONFIG_FEATURE_DEVPTS=y"
#dolist2="'' etc "
#dolist9="'' CONFIG_FEATURE_VERBOSE_USAGE=y"

rm -rf ${src}/${what?}
svn co ${TROOT}/${what} ${what}


rm -rf ${src}/${what?}.obj.${arch}
cp -a ${what} ${src}/${what}.obj.${arch}

cd ${src}/${what}.obj.${arch}

make HOSTCC=${HOSTCC-gcc} CC=${CC-gcc} allyesconfig > /dev/null
all_cfgs=$(egrep -v "(^#|^$|$ignorelist)" .config)
base_cfgs=$(egrep -v "(^#|^$|_FEATURE_|$ignorelist)" .config)
feature_cfgs=$(egrep -v "(^#|^$|$ignorelist)" .config | grep _FEATURE_)
i=1
date
time while true
do
  curr_cfg=$(echo ${base_cfgs} | cut -d' ' -f$i)

  [ "x${curr_cfg}" = "x" ] && break
  c=${curr_cfg##CONFIG}
  c=${c%%=?}
  for buff in $buff_list
  do
    for cleanup in $cleanup_list
    do
      for feat in '' $(echo $feature_cfgs | tr " " "\n" | grep CONFIG_FEATURE${c}_)
      do
        buff=${buff%%\'\'}
        cleanup=${cleanup%%\'\'}
        feature=${feature%%\'\'}
        make HOSTCC=${HOSTCC-gcc} CC=${CC-gcc} clean > /dev/null
        echo "# $curr_cfg: $buff $cleanup $feat"
        make HOSTCC=${HOSTCC-gcc} CC=${CC-gcc} distclean allnoconfig > /dev/null || exit 1
        x="${curr_cfg//=?/}|${buff//=?/}|${cleanup//=?/}|${feat//=?/}"
        x="${x//||/|}"
        x="${x%%|}"

        sed -r -i -e "/($x) is not set/d" .config
        echo ${curr_cfg} >> .config
        echo ${feat} >> .config
        echo ${buff} >> .config
        echo ${cleanup} >> .config
        make HOSTCC=${HOSTCC-gcc} CC=${CC-gcc} oldconfig > /dev/null

        make HOSTCC=${HOSTCC-gcc} CC=${CC-gcc} CFLAGS_EXTRA=${CFLAGS_EXTRA-"-Wall -Wstrict-prototypes"} -j 32 busybox > /dev/null
        du -b busybox
        size busybox
      done
    done
  done
  i=$(($i + 1))
done
date
