busybox/scripts/randomtest
<<
>>
Prefs
   1#!/bin/sh
   2
   3# If not specified in environment...
   4if ! test "$LIBC"; then
   5        # Select which libc to build against
   6        LIBC="glibc"
   7        LIBC="uclibc"
   8fi
   9# x86 32-bit:
  10#CROSS_COMPILER_PREFIX="i486-linux-uclibc-"
  11# My system has strange prefix for x86 64-bit uclibc:
  12#CROSS_COMPILER_PREFIX="x86_64-pc-linux-gnu-"
  13
  14if test $# -lt 2 || ! test -d "$1" || test -e "$2"; then
  15        echo "Usage: $0 SRC_DIR TMP_DIR"
  16        echo
  17        echo "SRC_DIR will be copied to TMP_DIR directory."
  18        echo "Then a random build will be performed."
  19        echo
  20        echo "Useful variables:"
  21        echo "\$LIBC, \$CROSS_COMPILER_PREFIX, \$MAKEOPTS"
  22        exit 1
  23fi
  24
  25cp -dpr -- "$1" "$2" || { echo "copy error"; exit 1; }
  26cd -- "$2" || { echo "cd $dir error"; exit 1; }
  27
  28# Generate random config
  29make randconfig >/dev/null || { echo "randconfig error"; exit 1; }
  30
  31# Tweak resulting config
  32cat .config \
  33| grep -v CONFIG_DEBUG_PESSIMIZE \
  34| grep -v CONFIG_WERROR \
  35| grep -v CONFIG_CROSS_COMPILER_PREFIX \
  36| grep -v CONFIG_SELINUX \
  37| grep -v CONFIG_EFENCE \
  38| grep -v CONFIG_DMALLOC \
  39\
  40| grep -v CONFIG_RFKILL \
  41>.config.new
  42mv .config.new .config
  43echo '# CONFIG_DEBUG_PESSIMIZE is not set' >>.config
  44echo '# CONFIG_WERROR is not set' >>.config
  45echo "CONFIG_CROSS_COMPILER_PREFIX=\"${CROSS_COMPILER_PREFIX}\"" >>.config
  46echo '# CONFIG_SELINUX is not set' >>.config
  47echo '# CONFIG_EFENCE is not set' >>.config
  48echo '# CONFIG_DMALLOC is not set' >>.config
  49echo '# CONFIG_RFKILL is not set' >>.config
  50
  51# If glibc, don't build static
  52if test x"$LIBC" = x"glibc"; then
  53        cat .config \
  54        | grep -v CONFIG_STATIC \
  55        | grep -v CONFIG_FEATURE_LIBBUSYBOX_STATIC \
  56        \
  57        | grep -v CONFIG_FEATURE_2_4_MODULES \
  58        | grep -v CONFIG_FEATURE_USE_BSS_TAIL \
  59        | grep -v CONFIG_DEBUG_SANITIZE \
  60        | grep -v CONFIG_FEATURE_MOUNT_NFS \
  61        | grep -v CONFIG_FEATURE_INETD_RPC \
  62        >.config.new
  63        mv .config.new .config
  64        echo '# CONFIG_STATIC is not set' >>.config
  65        echo '# CONFIG_FEATURE_LIBBUSYBOX_STATIC is not set' >>.config
  66        # newer glibc (at least 2.23) no longer supply query_module() ABI.
  67        # People who target 2.4 kernels would likely use older glibc (and older bbox).
  68        echo '# CONFIG_FEATURE_2_4_MODULES is not set' >>.config
  69        echo '# CONFIG_FEATURE_USE_BSS_TAIL is not set' >>.config
  70        echo '# CONFIG_DEBUG_SANITIZE is not set' >>.config
  71        # 2018: current glibc versions no longer include rpc/rpc.h
  72        echo '# CONFIG_FEATURE_MOUNT_NFS is not set' >>.config
  73        echo '# CONFIG_FEATURE_INETD_RPC is not set' >>.config
  74fi
  75
  76# If uclibc, build static, and remove some things
  77# likely to not work on uclibc.
  78if test x"$LIBC" = x"uclibc"; then
  79        cat .config \
  80        | grep -v CONFIG_STATIC \
  81        | grep -v CONFIG_BUILD_LIBBUSYBOX \
  82        | grep -v CONFIG_PIE \
  83        \
  84        | grep -v CONFIG_FEATURE_2_4_MODULES \
  85        | grep -v CONFIG_FEATURE_SYNC_FANCY \
  86        | grep -v CONFIG_FEATURE_TOUCH_NODEREF \
  87        | grep -v CONFIG_NANDWRITE \
  88        | grep -v CONFIG_NANDDUMP \
  89        | grep -v CONFIG_BLKDISCARD \
  90        | grep -v CONFIG_NSENTER \
  91        | grep -v CONFIG_UNSHARE \
  92        | grep -v CONFIG_FALLOCATE \
  93        | grep -v CONFIG_UDHCPC6 \
  94        | grep -v CONFIG_NSLOOKUP \
  95        | grep -v CONFIG_ASH_INTERNAL_GLOB \
  96        >.config.new
  97        mv .config.new .config
  98        echo 'CONFIG_STATIC=y' >>.config
  99        echo '# CONFIG_BUILD_LIBBUSYBOX is not set' >>.config
 100        echo '# CONFIG_PIE is not set' >>.config
 101        echo '# CONFIG_FEATURE_2_4_MODULES is not set' >>.config
 102        echo '# CONFIG_FEATURE_SYNC_FANCY is not set' >>.config
 103        echo '# CONFIG_FEATURE_TOUCH_NODEREF is not set' >>.config
 104        # My uclibc installation does not support some needed APIs...
 105        echo '# CONFIG_NANDWRITE is not set' >>.config
 106        echo '# CONFIG_NANDDUMP is not set' >>.config
 107        echo '# CONFIG_BLKDISCARD is not set' >>.config
 108        echo '# CONFIG_NSENTER is not set' >>.config
 109        echo '# CONFIG_UNSHARE is not set' >>.config
 110        echo '# CONFIG_FALLOCATE is not set' >>.config
 111        echo '# CONFIG_UDHCPC6 is not set' >>.config
 112        echo '# CONFIG_NSLOOKUP is not set' >>.config
 113        echo 'CONFIG_ASH_INTERNAL_GLOB=y' >>.config
 114fi
 115
 116# If STATIC, remove some things.
 117# PAM with static linking is probably pointless
 118# (but I need to try - now I don't have libpam.a on my system, only libpam.so)
 119if grep -q "^CONFIG_STATIC=y" .config; then
 120        cat .config \
 121        | grep -v CONFIG_PAM \
 122        >.config.new
 123        mv .config.new .config
 124        echo '# CONFIG_PAM is not set' >>.config
 125fi
 126
 127# Regenerate .config with default answers for yanked-off options
 128# (most of default answers are "no").
 129{ yes "" | make oldconfig >/dev/null; } || { echo "oldconfig error"; exit 1; }
 130
 131# Build!
 132nice -n 10 make $MAKEOPTS 2>&1 | tee make.log
 133grep 'Rerun make' make.log \
 134&& nice -n 10 make $MAKEOPTS 2>&1 | tee -a make.log
 135
 136# Return exitcode 1 if busybox executable does not exist
 137test -x busybox
 138