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_NANDWRITE \ 87 | grep -v CONFIG_NANDDUMP \ 88 | grep -v CONFIG_BLKDISCARD \ 89 | grep -v CONFIG_NSENTER \ 90 | grep -v CONFIG_UNSHARE \ 91 | grep -v CONFIG_FALLOCATE \ 92 | grep -v CONFIG_UDHCPC6 \ 93 | grep -v CONFIG_NSLOOKUP \ 94 | grep -v CONFIG_ASH_INTERNAL_GLOB \ 95 >.config.new 96 mv .config.new .config 97 echo 'CONFIG_STATIC=y' >>.config 98 echo '# CONFIG_BUILD_LIBBUSYBOX is not set' >>.config 99 echo '# CONFIG_PIE is not set' >>.config 100 echo '# CONFIG_FEATURE_2_4_MODULES is not set' >>.config 101 echo '# CONFIG_FEATURE_SYNC_FANCY is not set' >>.config 102 # My uclibc installation does not support some needed APIs... 103 echo '# CONFIG_NANDWRITE is not set' >>.config 104 echo '# CONFIG_NANDDUMP is not set' >>.config 105 echo '# CONFIG_BLKDISCARD is not set' >>.config 106 echo '# CONFIG_NSENTER is not set' >>.config 107 echo '# CONFIG_UNSHARE is not set' >>.config 108 echo '# CONFIG_FALLOCATE is not set' >>.config 109 echo '# CONFIG_UDHCPC6 is not set' >>.config 110 echo '# CONFIG_NSLOOKUP is not set' >>.config 111 echo 'CONFIG_ASH_INTERNAL_GLOB=y' >>.config 112fi 113 114# If musl 115if test x"$LIBC" = x"musl"; then 116 cat .config \ 117 | grep -v CONFIG_STATIC \ 118 | grep -v CONFIG_DEBUG_SANITIZE \ 119 | grep -v CONFIG_LFS \ 120 | grep -v CONFIG_EXTRA_COMPAT \ 121 | grep -v CONFIG_FEATURE_2_4_MODULES \ 122 | grep -v CONFIG_FEATURE_VI_REGEX_SEARCH \ 123 | grep -v CONFIG_FEATURE_MOUNT_NFS \ 124 | grep -v CONFIG_FEATURE_INETD_RPC \ 125 >.config.new 126 mv .config.new .config 127 echo 'CONFIG_STATIC=y' >>.config 128 # "error: cannot specify -static with -fsanitize=address": 129 echo '# CONFIG_DEBUG_SANITIZE is not set' >>.config 130 # with LFS off, uoff_t will have wrong width: 131 echo 'CONFIG_LFS=y' >>.config 132 echo '# CONFIG_EXTRA_COMPAT is not set' >>.config 133 echo '# CONFIG_FEATURE_2_4_MODULES is not set' >>.config 134 echo '# CONFIG_FEATURE_VI_REGEX_SEARCH is not set' >>.config 135 echo '# CONFIG_FEATURE_MOUNT_NFS is not set' >>.config 136 echo '# CONFIG_FEATURE_INETD_RPC is not set' >>.config 137fi 138 139# If STATIC, remove some things. 140# PAM with static linking is probably pointless 141# (but I need to try - now I don't have libpam.a on my system, only libpam.so) 142if grep -q "^CONFIG_STATIC=y" .config; then 143 cat .config \ 144 | grep -v CONFIG_PAM \ 145 >.config.new 146 mv .config.new .config 147 echo '# CONFIG_PAM is not set' >>.config 148fi 149 150# Regenerate .config with default answers for yanked-off options 151# (most of default answers are "no"). 152{ yes "" | make oldconfig >/dev/null; } || { echo "oldconfig error"; exit 1; } 153 154# Build! 155nice -n 10 make $MAKEOPTS 2>&1 | tee make.log 156grep 'Rerun make' make.log \ 157&& nice -n 10 make $MAKEOPTS 2>&1 | tee -a make.log 158 159# Return exitcode 1 if busybox executable does not exist 160test -x busybox 161