Rob Landley | 2896480 | 2008-01-19 17:08:39 -0600 | [diff] [blame] | 1 | #!/bin/bash |
| 2 | |
| 3 | # Grab default values for $CFLAGS and such. |
| 4 | |
Rob Landley | b3d4f0b | 2013-04-29 16:00:40 -0500 | [diff] [blame] | 5 | export LANG=c |
Rob Landley | 082a9a7 | 2014-08-30 16:34:46 -0500 | [diff] [blame] | 6 | export LC_ALL=C |
Rob Landley | 7a07c6b | 2014-09-09 20:13:03 -0500 | [diff] [blame] | 7 | set -o pipefail |
Rob Landley | 2896480 | 2008-01-19 17:08:39 -0600 | [diff] [blame] | 8 | source ./configure |
| 9 | |
Rob Landley | a8d0d13 | 2016-03-23 03:25:37 -0500 | [diff] [blame] | 10 | [ -z "$KCONFIG_CONFIG" ] && KCONFIG_CONFIG=.config |
| 11 | [ -z "$OUTNAME" ] && OUTNAME=toybox |
| 12 | UNSTRIPPED="generated/unstripped/$(basename "$OUTNAME")" |
Rob Landley | d04dc1f | 2013-08-30 01:53:31 -0500 | [diff] [blame] | 13 | |
Rob Landley | d3df423 | 2014-09-20 13:07:53 -0500 | [diff] [blame] | 14 | # Since each cc invocation is short, launch half again as many processes |
| 15 | # as we have processors so they don't exit faster than we can start them. |
Rob Landley | cf6a235 | 2017-05-14 15:10:29 -0500 | [diff] [blame] | 16 | [ -z "$CPUS" ] && CPUS=$(($(nproc)+1)) |
Rob Landley | d3df423 | 2014-09-20 13:07:53 -0500 | [diff] [blame] | 17 | |
Rob Landley | 72e2591 | 2016-12-07 22:22:38 -0600 | [diff] [blame] | 18 | if [ -z "$SED" ] |
| 19 | then |
Rob Landley | 3701b51 | 2016-12-08 21:44:22 -0600 | [diff] [blame] | 20 | [ ! -z "$(which gsed 2>/dev/null)" ] && SED=gsed || SED=sed |
Rob Landley | 72e2591 | 2016-12-07 22:22:38 -0600 | [diff] [blame] | 21 | fi |
| 22 | |
Rob Landley | 86cafe1 | 2014-01-03 18:23:09 -0600 | [diff] [blame] | 23 | # Respond to V= by echoing command lines as well as running them |
Rob Landley | 62390fd | 2014-11-28 16:49:46 -0600 | [diff] [blame] | 24 | DOTPROG= |
Rob Landley | 86cafe1 | 2014-01-03 18:23:09 -0600 | [diff] [blame] | 25 | do_loudly() |
| 26 | { |
Rob Landley | 62390fd | 2014-11-28 16:49:46 -0600 | [diff] [blame] | 27 | [ ! -z "$V" ] && echo "$@" || echo -n "$DOTPROG" |
Rob Landley | 86cafe1 | 2014-01-03 18:23:09 -0600 | [diff] [blame] | 28 | "$@" |
| 29 | } |
| 30 | |
Rob Landley | 62390fd | 2014-11-28 16:49:46 -0600 | [diff] [blame] | 31 | # Is anything under directory $2 newer than file $1 |
| 32 | isnewer() |
| 33 | { |
Rob Landley | 9cfdb48 | 2016-05-20 07:32:51 -0500 | [diff] [blame] | 34 | CHECK="$1" |
| 35 | shift |
| 36 | [ ! -z "$(find "$@" -newer "$CHECK" 2>/dev/null || echo yes)" ] |
Rob Landley | 62390fd | 2014-11-28 16:49:46 -0600 | [diff] [blame] | 37 | } |
| 38 | |
| 39 | echo "Generate headers from toys/*/*.c..." |
| 40 | |
Rob Landley | a8d0d13 | 2016-03-23 03:25:37 -0500 | [diff] [blame] | 41 | mkdir -p generated/unstripped |
Rob Landley | 62390fd | 2014-11-28 16:49:46 -0600 | [diff] [blame] | 42 | |
| 43 | if isnewer generated/Config.in toys |
| 44 | then |
| 45 | echo "Extract configuration information from toys/*.c files..." |
| 46 | scripts/genconfig.sh |
| 47 | fi |
| 48 | |
| 49 | # Create a list of all the commands toybox can provide. Note that the first |
| 50 | # entry is out of order on purpose (the toybox multiplexer command must be the |
| 51 | # first element of the array). The rest must be sorted in alphabetical order |
| 52 | # for fast binary search. |
| 53 | |
| 54 | if isnewer generated/newtoys.h toys |
| 55 | then |
| 56 | echo -n "generated/newtoys.h " |
| 57 | |
| 58 | echo "USE_TOYBOX(NEWTOY(toybox, NULL, TOYFLAG_STAYROOT))" > generated/newtoys.h |
Rob Landley | 72e2591 | 2016-12-07 22:22:38 -0600 | [diff] [blame] | 59 | $SED -n -e 's/^USE_[A-Z0-9_]*(/&/p' toys/*/*.c \ |
| 60 | | $SED 's/\(.*TOY(\)\([^,]*\),\(.*\)/\2 \1\2,\3/' | sort -s -k 1,1 \ |
Rob Landley | 3dd0d0d | 2016-12-07 22:57:12 -0600 | [diff] [blame] | 61 | | $SED 's/[^ ]* //' >> generated/newtoys.h |
| 62 | [ $? -ne 0 ] && exit 1 |
Rob Landley | 62390fd | 2014-11-28 16:49:46 -0600 | [diff] [blame] | 63 | fi |
| 64 | |
| 65 | [ ! -z "$V" ] && echo "Which C files to build..." |
| 66 | |
| 67 | # Extract a list of toys/*/*.c files to compile from the data in $KCONFIG_CONFIG |
Rob Landley | 912b2be | 2015-02-07 17:20:23 -0600 | [diff] [blame] | 68 | # (First command names, then filenames with relevant {NEW,OLD}TOY() macro.) |
| 69 | |
Rob Landley | 90afbad | 2015-04-17 02:46:11 -0500 | [diff] [blame] | 70 | GITHASH="$(git describe --tags --abbrev=12 2>/dev/null)" |
| 71 | [ ! -z "$GITHASH" ] && GITHASH="-DTOYBOX_VERSION=\"$GITHASH\"" |
Rob Landley | 72e2591 | 2016-12-07 22:22:38 -0600 | [diff] [blame] | 72 | TOYFILES="$($SED -n 's/^CONFIG_\([^=]*\)=.*/\1/p' "$KCONFIG_CONFIG" | xargs | tr ' [A-Z]' '|[a-z]')" |
Rob Landley | 912b2be | 2015-02-07 17:20:23 -0600 | [diff] [blame] | 73 | TOYFILES="$(egrep -l "TOY[(]($TOYFILES)[ ,]" toys/*/*.c)" |
Rob Landley | a913d92 | 2015-05-09 17:07:22 -0500 | [diff] [blame] | 74 | CFLAGS="$CFLAGS $(cat generated/cflags)" |
Rob Landley | 90afbad | 2015-04-17 02:46:11 -0500 | [diff] [blame] | 75 | BUILD="$(echo ${CROSS_COMPILE}${CC} $CFLAGS -I . $OPTIMIZE $GITHASH)" |
Rob Landley | 9cfdb48 | 2016-05-20 07:32:51 -0500 | [diff] [blame] | 76 | LIBFILES="$(ls lib/*.c | grep -v lib/help.c)" |
| 77 | TOYFILES="lib/help.c main.c $TOYFILES" |
Rob Landley | 62390fd | 2014-11-28 16:49:46 -0600 | [diff] [blame] | 78 | |
Rob Landley | 712e43e | 2016-02-07 18:15:53 -0600 | [diff] [blame] | 79 | if [ "${TOYFILES/pending//}" != "$TOYFILES" ] |
Rob Landley | 3679024 | 2016-02-07 12:27:40 -0600 | [diff] [blame] | 80 | then |
| 81 | echo -e "\n\033[1;31mwarning: using unfinished code from toys/pending\033[0m" |
| 82 | fi |
| 83 | |
Rob Landley | 62390fd | 2014-11-28 16:49:46 -0600 | [diff] [blame] | 84 | genbuildsh() |
| 85 | { |
| 86 | # Write a canned build line for use on crippled build machines. |
| 87 | |
| 88 | echo "#!/bin/sh" |
| 89 | echo |
Rob Landley | d620f77 | 2016-07-05 19:36:00 -0500 | [diff] [blame] | 90 | echo "BUILD='$BUILD'" |
Rob Landley | 62390fd | 2014-11-28 16:49:46 -0600 | [diff] [blame] | 91 | echo |
Rob Landley | d620f77 | 2016-07-05 19:36:00 -0500 | [diff] [blame] | 92 | echo "FILES='$LIBFILES $TOYFILES'" |
Rob Landley | 62390fd | 2014-11-28 16:49:46 -0600 | [diff] [blame] | 93 | echo |
Rob Landley | d620f77 | 2016-07-05 19:36:00 -0500 | [diff] [blame] | 94 | echo "LINK='$LINK'" |
Rob Landley | 62390fd | 2014-11-28 16:49:46 -0600 | [diff] [blame] | 95 | echo |
| 96 | echo |
| 97 | echo '$BUILD $FILES $LINK' |
| 98 | } |
| 99 | |
| 100 | if ! cmp -s <(genbuildsh | head -n 3) \ |
| 101 | <(head -n 3 generated/build.sh 2>/dev/null) |
| 102 | then |
| 103 | echo -n "Library probe" |
| 104 | |
| 105 | # We trust --as-needed to remove each library if we don't use any symbols |
| 106 | # out of it, this loop is because the compiler has no way to ignore a library |
| 107 | # that doesn't exist, so we have to detect and skip nonexistent libraries |
| 108 | # for it. |
| 109 | |
| 110 | > generated/optlibs.dat |
Elliott Hughes | 333b4d3 | 2017-04-28 15:25:56 -0700 | [diff] [blame] | 111 | for i in util crypt m resolv selinux smack attr rt crypto z log |
Rob Landley | 62390fd | 2014-11-28 16:49:46 -0600 | [diff] [blame] | 112 | do |
| 113 | echo "int main(int argc, char *argv[]) {return 0;}" | \ |
Rob Landley | 712e163 | 2015-09-23 22:10:23 -0500 | [diff] [blame] | 114 | ${CROSS_COMPILE}${CC} $CFLAGS -xc - -o generated/libprobe -Wl,--as-needed -l$i > /dev/null 2>/dev/null && |
Rob Landley | 62390fd | 2014-11-28 16:49:46 -0600 | [diff] [blame] | 115 | echo -l$i >> generated/optlibs.dat |
| 116 | echo -n . |
| 117 | done |
Rob Landley | 712e163 | 2015-09-23 22:10:23 -0500 | [diff] [blame] | 118 | rm -f generated/libprobe |
Rob Landley | 62390fd | 2014-11-28 16:49:46 -0600 | [diff] [blame] | 119 | echo |
| 120 | fi |
| 121 | |
| 122 | # LINK needs optlibs.dat, above |
| 123 | |
Rob Landley | a8d0d13 | 2016-03-23 03:25:37 -0500 | [diff] [blame] | 124 | LINK="$(echo $LDOPTIMIZE $LDFLAGS -o "$UNSTRIPPED" -Wl,--as-needed $(cat generated/optlibs.dat))" |
Rob Landley | 62390fd | 2014-11-28 16:49:46 -0600 | [diff] [blame] | 125 | genbuildsh > generated/build.sh && chmod +x generated/build.sh || exit 1 |
| 126 | |
Rob Landley | 72e2591 | 2016-12-07 22:22:38 -0600 | [diff] [blame] | 127 | #TODO: "make $SED && make" doesn't regenerate config.h because diff .config |
Rob Landley | 3214c87 | 2016-10-20 15:26:38 -0500 | [diff] [blame] | 128 | if true #isnewer generated/config.h "$KCONFIG_CONFIG" |
Rob Landley | 9cfdb48 | 2016-05-20 07:32:51 -0500 | [diff] [blame] | 129 | then |
| 130 | echo "Make generated/config.h from $KCONFIG_CONFIG." |
Rob Landley | 2896480 | 2008-01-19 17:08:39 -0600 | [diff] [blame] | 131 | |
Rob Landley | 9cfdb48 | 2016-05-20 07:32:51 -0500 | [diff] [blame] | 132 | # This long and roundabout sed invocation is to make old versions of sed |
| 133 | # happy. New ones have '\n' so can replace one line with two without all |
| 134 | # the branches and tedious mucking about with hold space. |
Rob Landley | 2896480 | 2008-01-19 17:08:39 -0600 | [diff] [blame] | 135 | |
Rob Landley | 72e2591 | 2016-12-07 22:22:38 -0600 | [diff] [blame] | 136 | $SED -n \ |
Rob Landley | 9cfdb48 | 2016-05-20 07:32:51 -0500 | [diff] [blame] | 137 | -e 's/^# CONFIG_\(.*\) is not set.*/\1/' \ |
| 138 | -e 't notset' \ |
| 139 | -e 's/^CONFIG_\(.*\)=y.*/\1/' \ |
| 140 | -e 't isset' \ |
| 141 | -e 's/^CONFIG_\([^=]*\)=\(.*\)/#define CFG_\1 \2/p' \ |
| 142 | -e 'd' \ |
| 143 | -e ':notset' \ |
| 144 | -e 'h' \ |
| 145 | -e 's/.*/#define CFG_& 0/p' \ |
| 146 | -e 'g' \ |
| 147 | -e 's/.*/#define USE_&(...)/p' \ |
| 148 | -e 'd' \ |
| 149 | -e ':isset' \ |
| 150 | -e 'h' \ |
| 151 | -e 's/.*/#define CFG_& 1/p' \ |
| 152 | -e 'g' \ |
| 153 | -e 's/.*/#define USE_&(...) __VA_ARGS__/p' \ |
| 154 | $KCONFIG_CONFIG > generated/config.h || exit 1 |
| 155 | fi |
Rob Landley | 2896480 | 2008-01-19 17:08:39 -0600 | [diff] [blame] | 156 | |
Rob Landley | 62390fd | 2014-11-28 16:49:46 -0600 | [diff] [blame] | 157 | if [ generated/mkflags -ot scripts/mkflags.c ] |
| 158 | then |
| 159 | do_loudly $HOSTCC scripts/mkflags.c -o generated/mkflags || exit 1 |
| 160 | fi |
Rob Landley | 6cf0a11 | 2012-11-26 14:14:29 -0600 | [diff] [blame] | 161 | |
Rob Landley | e36a9dd | 2014-02-23 20:11:06 -0600 | [diff] [blame] | 162 | # Process config.h and newtoys.h to generate FLAG_x macros. Note we must |
| 163 | # always #define the relevant macro, even when it's disabled, because we |
| 164 | # allow multiple NEWTOY() in the same C file. (When disabled the FLAG is 0, |
| 165 | # so flags&0 becomes a constant 0 allowing dead code elimination.) |
| 166 | |
Rob Landley | 9cfdb48 | 2016-05-20 07:32:51 -0500 | [diff] [blame] | 167 | make_flagsh() |
| 168 | { |
| 169 | # Parse files through C preprocessor twice, once to get flags for current |
| 170 | # .config and once to get flags for allyesconfig |
| 171 | for I in A B |
| 172 | do |
| 173 | ( |
| 174 | # define macros and select header files with option string data |
Rob Landley | 207cada | 2013-10-03 03:18:00 -0500 | [diff] [blame] | 175 | |
Rob Landley | 9cfdb48 | 2016-05-20 07:32:51 -0500 | [diff] [blame] | 176 | echo "#define NEWTOY(aa,bb,cc) aa $I bb" |
| 177 | echo '#define OLDTOY(...)' |
| 178 | if [ "$I" == A ] |
| 179 | then |
| 180 | cat generated/config.h |
| 181 | else |
Rob Landley | 72e2591 | 2016-12-07 22:22:38 -0600 | [diff] [blame] | 182 | $SED '/USE_.*([^)]*)$/s/$/ __VA_ARGS__/' generated/config.h |
Rob Landley | 9cfdb48 | 2016-05-20 07:32:51 -0500 | [diff] [blame] | 183 | fi |
Rob Landley | cb8e5ad | 2017-03-20 12:41:22 -0500 | [diff] [blame] | 184 | echo '#include "lib/toyflags.h"' |
Rob Landley | 9cfdb48 | 2016-05-20 07:32:51 -0500 | [diff] [blame] | 185 | cat generated/newtoys.h |
Rob Landley | 207cada | 2013-10-03 03:18:00 -0500 | [diff] [blame] | 186 | |
Rob Landley | 9cfdb48 | 2016-05-20 07:32:51 -0500 | [diff] [blame] | 187 | # Run result through preprocessor, glue together " " gaps leftover from USE |
| 188 | # macros, delete comment lines, print any line with a quoted optstring, |
| 189 | # turn any non-quoted opstring (NULL or 0) into " " (because fscanf can't |
| 190 | # handle "" with nothing in it, and mkflags uses that). |
Rob Landley | 207cada | 2013-10-03 03:18:00 -0500 | [diff] [blame] | 191 | |
Rob Landley | 9cfdb48 | 2016-05-20 07:32:51 -0500 | [diff] [blame] | 192 | ) | ${CROSS_COMPILE}${CC} -E - | \ |
Rob Landley | 72e2591 | 2016-12-07 22:22:38 -0600 | [diff] [blame] | 193 | $SED -n -e 's/" *"//g;/^#/d;t clear;:clear;s/"/"/p;t;s/\( [AB] \).*/\1 " "/p' |
Rob Landley | 207cada | 2013-10-03 03:18:00 -0500 | [diff] [blame] | 194 | |
Rob Landley | 9cfdb48 | 2016-05-20 07:32:51 -0500 | [diff] [blame] | 195 | # Sort resulting line pairs and glue them together into triplets of |
| 196 | # command "flags" "allflags" |
| 197 | # to feed into mkflags C program that outputs actual flag macros |
| 198 | # If no pair (because command's disabled in config), use " " for flags |
| 199 | # so allflags can define the appropriate zero macros. |
Rob Landley | 207cada | 2013-10-03 03:18:00 -0500 | [diff] [blame] | 200 | |
Rob Landley | 72e2591 | 2016-12-07 22:22:38 -0600 | [diff] [blame] | 201 | done | sort -s | $SED -n -e 's/ A / /;t pair;h;s/\([^ ]*\).*/\1 " "/;x' \ |
Rob Landley | 9cfdb48 | 2016-05-20 07:32:51 -0500 | [diff] [blame] | 202 | -e 'b single;:pair;h;n;:single;s/[^ ]* B //;H;g;s/\n/ /;p' | \ |
| 203 | tee generated/flags.raw | generated/mkflags > generated/flags.h || exit 1 |
| 204 | } |
| 205 | |
| 206 | if isnewer generated/flags.h toys "$KCONFIG_CONFIG" |
| 207 | then |
| 208 | echo -n "generated/flags.h " |
| 209 | make_flagsh |
| 210 | fi |
Rob Landley | 6cf0a11 | 2012-11-26 14:14:29 -0600 | [diff] [blame] | 211 | |
Rob Landley | c0e56ed | 2012-10-08 00:02:30 -0500 | [diff] [blame] | 212 | # Extract global structure definitions and flag definitions from toys/*/*.c |
| 213 | |
| 214 | function getglobals() |
| 215 | { |
Rob Landley | c0e56ed | 2012-10-08 00:02:30 -0500 | [diff] [blame] | 216 | for i in toys/*/*.c |
| 217 | do |
Rob Landley | 72e2591 | 2016-12-07 22:22:38 -0600 | [diff] [blame] | 218 | NAME="$(echo $i | $SED 's@.*/\(.*\)\.c@\1@')" |
| 219 | DATA="$($SED -n -e '/^GLOBALS(/,/^)/b got;b;:got' \ |
Rob Landley | 207cada | 2013-10-03 03:18:00 -0500 | [diff] [blame] | 220 | -e 's/^GLOBALS(/struct '"$NAME"'_data {/' \ |
| 221 | -e 's/^)/};/' -e 'p' $i)" |
Rob Landley | c0e56ed | 2012-10-08 00:02:30 -0500 | [diff] [blame] | 222 | |
Rob Landley | 207cada | 2013-10-03 03:18:00 -0500 | [diff] [blame] | 223 | [ ! -z "$DATA" ] && echo -e "// $i\n\n$DATA\n" |
Rob Landley | c0e56ed | 2012-10-08 00:02:30 -0500 | [diff] [blame] | 224 | done |
| 225 | } |
| 226 | |
Rob Landley | 62390fd | 2014-11-28 16:49:46 -0600 | [diff] [blame] | 227 | if isnewer generated/globals.h toys |
| 228 | then |
| 229 | echo -n "generated/globals.h " |
| 230 | GLOBSTRUCT="$(getglobals)" |
| 231 | ( |
| 232 | echo "$GLOBSTRUCT" |
| 233 | echo |
| 234 | echo "extern union global_union {" |
| 235 | echo "$GLOBSTRUCT" | \ |
Rob Landley | 72e2591 | 2016-12-07 22:22:38 -0600 | [diff] [blame] | 236 | $SED -n 's/struct \(.*\)_data {/ struct \1_data \1;/p' |
Rob Landley | 62390fd | 2014-11-28 16:49:46 -0600 | [diff] [blame] | 237 | echo "} this;" |
| 238 | ) > generated/globals.h |
| 239 | fi |
Rob Landley | c0e56ed | 2012-10-08 00:02:30 -0500 | [diff] [blame] | 240 | |
Rob Landley | f96bb3d | 2015-12-13 16:52:26 -0600 | [diff] [blame] | 241 | if [ generated/mktags -ot scripts/mktags.c ] |
| 242 | then |
| 243 | do_loudly $HOSTCC scripts/mktags.c -o generated/mktags || exit 1 |
| 244 | fi |
| 245 | |
| 246 | if isnewer generated/tags.h toys |
| 247 | then |
| 248 | echo -n "generated/tags.h " |
| 249 | |
Rob Landley | 72e2591 | 2016-12-07 22:22:38 -0600 | [diff] [blame] | 250 | $SED -n '/TAGGED_ARRAY(/,/^)/{s/.*TAGGED_ARRAY[(]\([^,]*\),/\1/;p}' \ |
Rob Landley | 4b4ab6a | 2015-12-27 14:41:30 -0600 | [diff] [blame] | 251 | toys/*/*.c lib/*.c | generated/mktags > generated/tags.h |
Rob Landley | f96bb3d | 2015-12-13 16:52:26 -0600 | [diff] [blame] | 252 | fi |
| 253 | |
Rob Landley | 62390fd | 2014-11-28 16:49:46 -0600 | [diff] [blame] | 254 | if [ generated/config2help -ot scripts/config2help.c ] |
| 255 | then |
Rob Landley | d20b9ff | 2015-11-02 08:32:21 -0600 | [diff] [blame] | 256 | do_loudly $HOSTCC scripts/config2help.c -I . lib/xwrap.c lib/llist.c \ |
Rob Landley | 79839a4 | 2014-12-13 12:09:25 -0600 | [diff] [blame] | 257 | lib/lib.c lib/portability.c -o generated/config2help || exit 1 |
Rob Landley | 62390fd | 2014-11-28 16:49:46 -0600 | [diff] [blame] | 258 | fi |
Rob Landley | 9cfdb48 | 2016-05-20 07:32:51 -0500 | [diff] [blame] | 259 | if isnewer generated/help.h generated/Config.in |
| 260 | then |
| 261 | echo "generated/help.h" |
| 262 | generated/config2help Config.in $KCONFIG_CONFIG > generated/help.h || exit 1 |
| 263 | fi |
Rob Landley | c0e56ed | 2012-10-08 00:02:30 -0500 | [diff] [blame] | 264 | |
Rob Landley | 62390fd | 2014-11-28 16:49:46 -0600 | [diff] [blame] | 265 | [ ! -z "$NOBUILD" ] && exit 0 |
Rob Landley | fb98c1e | 2012-05-23 21:54:16 -0500 | [diff] [blame] | 266 | |
Rob Landley | 91b360a | 2014-08-09 14:33:34 -0500 | [diff] [blame] | 267 | echo -n "Compile toybox" |
| 268 | [ ! -z "$V" ] && echo |
Rob Landley | 62390fd | 2014-11-28 16:49:46 -0600 | [diff] [blame] | 269 | DOTPROG=. |
Rob Landley | 91b360a | 2014-08-09 14:33:34 -0500 | [diff] [blame] | 270 | |
| 271 | # This is a parallel version of: do_loudly $BUILD $FILES $LINK || exit 1 |
| 272 | |
Rob Landley | 9cfdb48 | 2016-05-20 07:32:51 -0500 | [diff] [blame] | 273 | # Any headers newer than the oldest generated/obj file? |
Rob Landley | 62390fd | 2014-11-28 16:49:46 -0600 | [diff] [blame] | 274 | X="$(ls -1t generated/obj/* 2>/dev/null | tail -n 1)" |
Rob Landley | 9cfdb48 | 2016-05-20 07:32:51 -0500 | [diff] [blame] | 275 | # TODO: redo this |
Rob Landley | 62390fd | 2014-11-28 16:49:46 -0600 | [diff] [blame] | 276 | if [ ! -e "$X" ] || [ ! -z "$(find toys -name "*.h" -newer "$X")" ] |
| 277 | then |
| 278 | rm -rf generated/obj && mkdir -p generated/obj || exit 1 |
| 279 | else |
| 280 | rm -f generated/obj/{main,lib_help}.o || exit 1 |
| 281 | fi |
Rob Landley | 9cfdb48 | 2016-05-20 07:32:51 -0500 | [diff] [blame] | 282 | |
| 283 | # build each generated/obj/*.o file in parallel |
| 284 | |
Rob Landley | 5d16faa | 2014-08-24 22:42:47 -0500 | [diff] [blame] | 285 | PENDING= |
Rob Landley | 9cfdb48 | 2016-05-20 07:32:51 -0500 | [diff] [blame] | 286 | LNKFILES= |
Rob Landley | 42a36d6 | 2014-11-28 17:30:46 -0600 | [diff] [blame] | 287 | DONE=0 |
Rob Landley | 86f7c04 | 2016-03-01 23:39:27 -0600 | [diff] [blame] | 288 | COUNT=0 |
Rob Landley | 9cfdb48 | 2016-05-20 07:32:51 -0500 | [diff] [blame] | 289 | CLICK= |
| 290 | |
| 291 | for i in $LIBFILES click $TOYFILES |
Rob Landley | 91b360a | 2014-08-09 14:33:34 -0500 | [diff] [blame] | 292 | do |
Rob Landley | 9cfdb48 | 2016-05-20 07:32:51 -0500 | [diff] [blame] | 293 | [ "$i" == click ] && CLICK=1 && continue |
Rob Landley | 91b360a | 2014-08-09 14:33:34 -0500 | [diff] [blame] | 294 | |
| 295 | X=${i/lib\//lib_} |
| 296 | X=${X##*/} |
Rob Landley | 62390fd | 2014-11-28 16:49:46 -0600 | [diff] [blame] | 297 | OUT="generated/obj/${X%%.c}.o" |
Rob Landley | 9cfdb48 | 2016-05-20 07:32:51 -0500 | [diff] [blame] | 298 | LNKFILES="$LNKFILES $OUT" |
| 299 | |
| 300 | # $LIBFILES doesn't need to be rebuilt if newer than .config, $TOYFILES does |
| 301 | |
| 302 | [ "$OUT" -nt "$i" ] && [ -z "$CLICK" -o "$OUT" -nt "$KCONFIG_CONFIG" ] && |
| 303 | continue |
| 304 | |
Rob Landley | 62390fd | 2014-11-28 16:49:46 -0600 | [diff] [blame] | 305 | do_loudly $BUILD -c $i -o $OUT & |
Rob Landley | e17fbf1 | 2016-02-26 00:22:15 -0600 | [diff] [blame] | 306 | PENDING="$PENDING $!" |
Rob Landley | 86f7c04 | 2016-03-01 23:39:27 -0600 | [diff] [blame] | 307 | COUNT=$(($COUNT+1)) |
Rob Landley | 91b360a | 2014-08-09 14:33:34 -0500 | [diff] [blame] | 308 | |
| 309 | # ratelimit to $CPUS many parallel jobs, detecting errors |
| 310 | |
Rob Landley | 86f7c04 | 2016-03-01 23:39:27 -0600 | [diff] [blame] | 311 | for j in $PENDING |
Rob Landley | 91b360a | 2014-08-09 14:33:34 -0500 | [diff] [blame] | 312 | do |
Rob Landley | 86f7c04 | 2016-03-01 23:39:27 -0600 | [diff] [blame] | 313 | [ "$COUNT" -lt "$CPUS" ] && break; |
Rob Landley | 5d16faa | 2014-08-24 22:42:47 -0500 | [diff] [blame] | 314 | |
Rob Landley | 86f7c04 | 2016-03-01 23:39:27 -0600 | [diff] [blame] | 315 | wait $j |
Rob Landley | 42a36d6 | 2014-11-28 17:30:46 -0600 | [diff] [blame] | 316 | DONE=$(($DONE+$?)) |
Rob Landley | 86f7c04 | 2016-03-01 23:39:27 -0600 | [diff] [blame] | 317 | COUNT=$(($COUNT-1)) |
| 318 | PENDING="${PENDING## $j}" |
Rob Landley | 91b360a | 2014-08-09 14:33:34 -0500 | [diff] [blame] | 319 | done |
Rob Landley | 42a36d6 | 2014-11-28 17:30:46 -0600 | [diff] [blame] | 320 | [ $DONE -ne 0 ] && break |
Rob Landley | 91b360a | 2014-08-09 14:33:34 -0500 | [diff] [blame] | 321 | done |
| 322 | |
| 323 | # wait for all background jobs, detecting errors |
| 324 | |
Rob Landley | 5d16faa | 2014-08-24 22:42:47 -0500 | [diff] [blame] | 325 | for i in $PENDING |
Rob Landley | 91b360a | 2014-08-09 14:33:34 -0500 | [diff] [blame] | 326 | do |
Rob Landley | 42a36d6 | 2014-11-28 17:30:46 -0600 | [diff] [blame] | 327 | wait $i |
| 328 | DONE=$(($DONE+$?)) |
Rob Landley | 91b360a | 2014-08-09 14:33:34 -0500 | [diff] [blame] | 329 | done |
| 330 | |
Rob Landley | 42a36d6 | 2014-11-28 17:30:46 -0600 | [diff] [blame] | 331 | [ $DONE -ne 0 ] && exit 1 |
| 332 | |
Rob Landley | 9cfdb48 | 2016-05-20 07:32:51 -0500 | [diff] [blame] | 333 | do_loudly $BUILD $LNKFILES $LINK || exit 1 |
Rob Landley | a8d0d13 | 2016-03-23 03:25:37 -0500 | [diff] [blame] | 334 | if [ ! -z "$NOSTRIP" ] || |
| 335 | ! do_loudly ${CROSS_COMPILE}strip "$UNSTRIPPED" -o "$OUTNAME" |
Rob Landley | 57f93c8 | 2015-02-28 12:39:16 -0600 | [diff] [blame] | 336 | then |
Rob Landley | a8d0d13 | 2016-03-23 03:25:37 -0500 | [diff] [blame] | 337 | echo "strip failed, using unstripped" && cp "$UNSTRIPPED" "$OUTNAME" || |
Rob Landley | 1f44b5f | 2015-03-06 15:11:38 -0600 | [diff] [blame] | 338 | exit 1 |
Rob Landley | 57f93c8 | 2015-02-28 12:39:16 -0600 | [diff] [blame] | 339 | fi |
Rob Landley | b8f5eff | 2015-10-29 07:34:08 -0500 | [diff] [blame] | 340 | |
| 341 | # gcc 4.4's strip command is buggy, and doesn't set the executable bit on |
| 342 | # its output the way SUSv4 suggests it do so. While we're at it, make sure |
| 343 | # we don't have the "w" bit set so things like bzip2's "cp -f" install don't |
| 344 | # overwrite our binary through the symlink. |
Rob Landley | a8d0d13 | 2016-03-23 03:25:37 -0500 | [diff] [blame] | 345 | do_loudly chmod 555 "$OUTNAME" || exit 1 |
Rob Landley | b8f5eff | 2015-10-29 07:34:08 -0500 | [diff] [blame] | 346 | |
Rob Landley | 91b360a | 2014-08-09 14:33:34 -0500 | [diff] [blame] | 347 | echo |