blob: 313c7c70eaf6ea493e452e7459c2035a1d56ba24 [file] [log] [blame]
Rob Landley28964802008-01-19 17:08:39 -06001#!/bin/bash
2
Rob Landley7c04f012008-01-20 19:00:16 -06003# This has to be a separate file from scripts/make.sh so it can be called
4# before menuconfig. (It's called again from scripts/make.sh just to be sure.)
5
Rob Landley28964802008-01-19 17:08:39 -06006mkdir -p generated
7
Rob Landley2bd3a5d2012-02-13 08:44:32 -06008source configure
9
Rob Landleya913d922015-05-09 17:07:22 -050010probecc()
11{
12 ${CROSS_COMPILE}${CC} $CFLAGS -xc -o /dev/null $1 -
13}
14
Rob Landley76e1cb32014-04-16 07:49:32 -050015# Probe for a single config symbol with a "compiles or not" test.
16# Symbol name is first argument, flags second, feed C file to stdin
17probesymbol()
18{
Rob Landleya913d922015-05-09 17:07:22 -050019 probecc $2 2>/dev/null && DEFAULT=y || DEFAULT=n
Rob Landley76e1cb32014-04-16 07:49:32 -050020 rm a.out 2>/dev/null
21 echo -e "config $1\n\tbool" || exit 1
22 echo -e "\tdefault $DEFAULT\n" || exit 1
23}
24
Rob Landley1b7ad012012-02-23 21:03:18 -060025probeconfig()
Rob Landley28964802008-01-19 17:08:39 -060026{
Rob Landleya913d922015-05-09 17:07:22 -050027 > generated/cflags
28 # llvm produces its own really stupid warnings about things that aren't wrong,
29 # and although you can turn the warning off, gcc reacts badly to command line
30 # arguments it doesn't understand. So probe.
31 [ -z "$(probecc -Wno-string-plus-int <<< \#warn warn 2>&1 | grep string-plus-int)" ] &&
32 echo -Wno-string-plus-int >> generated/cflags
33
Rob Landley27f57792012-02-03 23:16:28 -060034 # Probe for container support on target
Rob Landley76e1cb32014-04-16 07:49:32 -050035 probesymbol TOYBOX_CONTAINER << EOF
Georgi Chorbadzhiyski2c27fcf2012-03-04 01:24:06 -060036 #include <linux/sched.h>
Rob Landley27f57792012-02-03 23:16:28 -060037 int x=CLONE_NEWNS|CLONE_NEWUTS|CLONE_NEWIPC|CLONE_NEWNET;
Rob Landleyf9fdd3c2012-03-19 20:15:08 -050038
39 int main(int argc, char *argv[]) { return unshare(x); }
Rob Landley27f57792012-02-03 23:16:28 -060040EOF
Rob Landley76e1cb32014-04-16 07:49:32 -050041
42 probesymbol TOYBOX_FIFREEZE -c << EOF
43 #include <linux/fs.h>
44 #ifndef FIFREEZE
45 #error nope
46 #endif
47EOF
Rob Landley5fe77cf2014-04-23 08:38:29 -050048
Rob Landley434cefb2014-06-28 20:16:11 -050049 # Work around some uClibc limitations
Rob Landley5fe77cf2014-04-23 08:38:29 -050050 probesymbol TOYBOX_ICONV -c << EOF
51 #include "iconv.h"
52EOF
Rob Landley434cefb2014-06-28 20:16:11 -050053 probesymbol TOYBOX_FALLOCATE << EOF
54 #include <fcntl.h>
55
56 int main(int argc, char *argv[]) { return posix_fallocate(0,0,0); }
57EOF
Isaac Dunham46ddf0e2014-11-19 16:38:46 -060058
59 # Android and some other platforms miss utmpx
60 probesymbol TOYBOX_UTMPX -c << EOF
61 #include <utmpx.h>
62 #ifndef BOOT_TIME
63 #error nope
64 #endif
65 int main(int argc, char *argv[]) {
66 struct utmpx *a;
67 if (0 != (a = getutxent())) return 0;
68 return 1;
69 }
70EOF
71
Elliott Hughesc2415d12015-01-16 13:49:23 -060072 # Android is missing shadow.h
Isaac Dunham46ddf0e2014-11-19 16:38:46 -060073 probesymbol TOYBOX_SHADOW -c << EOF
74 #include <shadow.h>
75 int main(int argc, char *argv[]) {
76 struct spwd *a = getspnam("root"); return 0;
77 }
78EOF
Rob Landley5b493dc2015-04-19 21:50:51 -050079
80 # Some commands are android-specific
81 probesymbol TOYBOX_ON_ANDROID -c << EOF
82 #ifndef __ANDROID__
83 #error nope
84 #endif
85EOF
Rob Landley1b7ad012012-02-23 21:03:18 -060086}
Rob Landleyf9fdd3c2012-03-19 20:15:08 -050087
Rob Landley1b7ad012012-02-23 21:03:18 -060088genconfig()
89{
Rob Landleyf9070f32014-04-23 17:23:09 -050090 # Reverse sort puts posix first, examples last.
91 for j in $(ls toys/*/README | sort -r)
Rob Landley28964802008-01-19 17:08:39 -060092 do
Rob Landleyb1c002a2012-12-10 21:08:42 -060093 DIR="$(dirname "$j")"
94
95 [ $(ls "$DIR" | wc -l) -lt 2 ] && continue
96
Rob Landleyaa777fe2012-12-08 21:10:10 -060097 echo "menu \"$(head -n 1 $j)\""
Rob Landley28964802008-01-19 17:08:39 -060098 echo
Rob Landley3a9241a2012-08-25 14:25:22 -050099
Rob Landley3a9241a2012-08-25 14:25:22 -0500100 # extract config stanzas from each source file, in alphabetical order
Rob Landleyaa777fe2012-12-08 21:10:10 -0600101 for i in $(ls -1 $DIR/*.c)
Rob Landley3a9241a2012-08-25 14:25:22 -0500102 do
103 # Grab the config block for Config.in
104 echo "# $i"
105 sed -n '/^\*\//q;/^config [A-Z]/,$p' $i || return 1
106 echo
107 done
108
109 echo endmenu
Rob Landley28964802008-01-19 17:08:39 -0600110 done
111}
112
Rob Landley1b7ad012012-02-23 21:03:18 -0600113probeconfig > generated/Config.probed || rm generated/Config.probed
114genconfig > generated/Config.in || rm generated/Config.in