1*cf5a6c84SAndroid Build Coastguard Worker#!/bin/bash 2*cf5a6c84SAndroid Build Coastguard Worker 3*cf5a6c84SAndroid Build Coastguard Worker# This has to be a separate file from scripts/make.sh so it can be called 4*cf5a6c84SAndroid Build Coastguard Worker# before menuconfig. (It's called again from scripts/make.sh just to be sure.) 5*cf5a6c84SAndroid Build Coastguard Worker 6*cf5a6c84SAndroid Build Coastguard Workersource scripts/portability.sh 7*cf5a6c84SAndroid Build Coastguard Worker 8*cf5a6c84SAndroid Build Coastguard Workermkdir -p "$GENDIR" 9*cf5a6c84SAndroid Build Coastguard Worker 10*cf5a6c84SAndroid Build Coastguard Workerprobecc() 11*cf5a6c84SAndroid Build Coastguard Worker{ 12*cf5a6c84SAndroid Build Coastguard Worker ${CROSS_COMPILE}${CC} $CFLAGS $LDFLAGS -xc -o /dev/null - "$@" 13*cf5a6c84SAndroid Build Coastguard Worker} 14*cf5a6c84SAndroid Build Coastguard Worker 15*cf5a6c84SAndroid Build Coastguard Worker# Probe for a single config symbol with a "compiles or not" test. 16*cf5a6c84SAndroid Build Coastguard Worker# Symbol name is first argument, flags second, feed C file to stdin 17*cf5a6c84SAndroid Build Coastguard Workerprobesymbol() 18*cf5a6c84SAndroid Build Coastguard Worker{ 19*cf5a6c84SAndroid Build Coastguard Worker probecc "${@:2}" 2>/dev/null && DEFAULT=y || DEFAULT=n 20*cf5a6c84SAndroid Build Coastguard Worker rm a.out 2>/dev/null 21*cf5a6c84SAndroid Build Coastguard Worker echo -e "config $1\n\tbool\n\tdefault $DEFAULT\n" || exit 1 22*cf5a6c84SAndroid Build Coastguard Worker} 23*cf5a6c84SAndroid Build Coastguard Worker 24*cf5a6c84SAndroid Build Coastguard Workerprobeconfig() 25*cf5a6c84SAndroid Build Coastguard Worker{ 26*cf5a6c84SAndroid Build Coastguard Worker # Some commands are android-specific 27*cf5a6c84SAndroid Build Coastguard Worker probesymbol TOYBOX_ON_ANDROID -c << EOF 28*cf5a6c84SAndroid Build Coastguard Worker #ifndef __ANDROID__ 29*cf5a6c84SAndroid Build Coastguard Worker #error nope 30*cf5a6c84SAndroid Build Coastguard Worker #endif 31*cf5a6c84SAndroid Build Coastguard WorkerEOF 32*cf5a6c84SAndroid Build Coastguard Worker 33*cf5a6c84SAndroid Build Coastguard Worker # nommu support 34*cf5a6c84SAndroid Build Coastguard Worker probesymbol TOYBOX_FORK << EOF 35*cf5a6c84SAndroid Build Coastguard Worker #include <unistd.h> 36*cf5a6c84SAndroid Build Coastguard Worker int main(int argc, char *argv[]) { return fork(); } 37*cf5a6c84SAndroid Build Coastguard WorkerEOF 38*cf5a6c84SAndroid Build Coastguard Worker echo -e '\tdepends on !TOYBOX_FORCE_NOMMU' 39*cf5a6c84SAndroid Build Coastguard Worker} 40*cf5a6c84SAndroid Build Coastguard Worker 41*cf5a6c84SAndroid Build Coastguard Workergenconfig() 42*cf5a6c84SAndroid Build Coastguard Worker{ 43*cf5a6c84SAndroid Build Coastguard Worker # Reverse sort puts posix first, examples last. 44*cf5a6c84SAndroid Build Coastguard Worker for j in $(ls toys/*/README | sort -s -r) 45*cf5a6c84SAndroid Build Coastguard Worker do 46*cf5a6c84SAndroid Build Coastguard Worker DIR="$(dirname "$j")" 47*cf5a6c84SAndroid Build Coastguard Worker 48*cf5a6c84SAndroid Build Coastguard Worker [ $(ls "$DIR" | wc -l) -lt 2 ] && continue 49*cf5a6c84SAndroid Build Coastguard Worker 50*cf5a6c84SAndroid Build Coastguard Worker echo "menu \"$(head -n 1 $j)\"" 51*cf5a6c84SAndroid Build Coastguard Worker echo 52*cf5a6c84SAndroid Build Coastguard Worker 53*cf5a6c84SAndroid Build Coastguard Worker # extract config stanzas from each source file, in alphabetical order 54*cf5a6c84SAndroid Build Coastguard Worker for i in $(ls -1 $DIR/*.c) 55*cf5a6c84SAndroid Build Coastguard Worker do 56*cf5a6c84SAndroid Build Coastguard Worker # Grab the config block for Config.in 57*cf5a6c84SAndroid Build Coastguard Worker echo "# $i" 58*cf5a6c84SAndroid Build Coastguard Worker $SED -n '/^\*\//q;/^config [A-Z]/,$p' $i || return 1 59*cf5a6c84SAndroid Build Coastguard Worker echo 60*cf5a6c84SAndroid Build Coastguard Worker done 61*cf5a6c84SAndroid Build Coastguard Worker 62*cf5a6c84SAndroid Build Coastguard Worker echo endmenu 63*cf5a6c84SAndroid Build Coastguard Worker done 64*cf5a6c84SAndroid Build Coastguard Worker} 65*cf5a6c84SAndroid Build Coastguard Worker 66*cf5a6c84SAndroid Build Coastguard Workerprobeconfig > "$GENDIR"/Config.probed || rm "$GENDIR"/Config.probed 67*cf5a6c84SAndroid Build Coastguard Workergenconfig > "$GENDIR"/Config.in || rm "$GENDIR"/Config.in 68*cf5a6c84SAndroid Build Coastguard Worker 69*cf5a6c84SAndroid Build Coastguard Worker# Find names of commands that can be built standalone in these C files 70*cf5a6c84SAndroid Build Coastguard Workertoys() 71*cf5a6c84SAndroid Build Coastguard Worker{ 72*cf5a6c84SAndroid Build Coastguard Worker grep 'TOY(.*)' "$@" | grep -v TOYFLAG_NOFORK | grep -v "0))" | \ 73*cf5a6c84SAndroid Build Coastguard Worker $SED -En 's/([^:]*):.*(OLD|NEW)TOY\( *([a-zA-Z][^,]*) *,.*/\1:\3/p' 74*cf5a6c84SAndroid Build Coastguard Worker} 75*cf5a6c84SAndroid Build Coastguard Worker 76*cf5a6c84SAndroid Build Coastguard WorkerWORKING= PENDING= EXAMPLE= 77*cf5a6c84SAndroid Build Coastguard Workertoys toys/*/*.c | ( 78*cf5a6c84SAndroid Build Coastguard Workerwhile IFS=":" read FILE NAME 79*cf5a6c84SAndroid Build Coastguard Workerdo 80*cf5a6c84SAndroid Build Coastguard Worker echo -e "test_$NAME:\n\tscripts/test.sh $NAME\n" 81*cf5a6c84SAndroid Build Coastguard Worker [ "$NAME" == help ] && continue 82*cf5a6c84SAndroid Build Coastguard Worker [ "$NAME" == install ] && continue 83*cf5a6c84SAndroid Build Coastguard Worker [ "$NAME" == sh ] && FILE="toys/*/*.c" 84*cf5a6c84SAndroid Build Coastguard Worker echo -e "$NAME: $FILE *.[ch] lib/*.[ch]\n\tscripts/single.sh $NAME\n" 85*cf5a6c84SAndroid Build Coastguard Worker [ "${FILE/example//}" != "$FILE" ] && EXAMPLE="$EXAMPLE $NAME" || 86*cf5a6c84SAndroid Build Coastguard Worker [ "${FILE/pending//}" != "$FILE" ] && PENDING="$PENDING $NAME" || 87*cf5a6c84SAndroid Build Coastguard Worker WORKING="$WORKING $NAME" 88*cf5a6c84SAndroid Build Coastguard Workerdone && 89*cf5a6c84SAndroid Build Coastguard Workerecho -e "clean::\n\t@rm -f $WORKING $PENDING" && 90*cf5a6c84SAndroid Build Coastguard Workerecho -e "list:\n\t@echo $(echo $WORKING | tr ' ' '\n' | sort | xargs)" && 91*cf5a6c84SAndroid Build Coastguard Workerecho -e "list_example:\n\t@echo $(echo $EXAMPLE | tr ' ' '\n' | sort | xargs)"&& 92*cf5a6c84SAndroid Build Coastguard Workerecho -e "list_pending:\n\t@echo $(echo $PENDING | tr ' ' '\n' | sort | xargs)"&& 93*cf5a6c84SAndroid Build Coastguard Workerecho -e ".PHONY: $WORKING $PENDING" | $SED 's/ \([^ ]\)/ test_\1/g' 94*cf5a6c84SAndroid Build Coastguard Worker) > .singlemake 95