xref: /aosp_15_r20/external/toybox/scripts/genconfig.sh (revision cf5a6c84e2b8763fc1a7db14496fd4742913b199)
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