2022-09-23 12:28:31 -07:00
|
|
|
#!/usr/bin/env sh
|
|
|
|
cosmo="${COSMO:-"/cosmopolitan"}"
|
2022-10-18 19:02:39 -07:00
|
|
|
unset flavor
|
|
|
|
[ ! -s "$cosmo/env" ] || . "$cosmo/env"
|
|
|
|
dist="${COSMO_DIST:-"$cosmo/dist/${flavor:-def}"}"
|
2022-09-23 12:28:31 -07:00
|
|
|
|
|
|
|
_CFLAGS="-fno-omit-frame-pointer -fdata-sections -ffunction-sections -fno-pie -pg -mnop-mcount -mno-tls-direct-seg-refs"
|
|
|
|
_CPPFLAGS="-DNDEBUG -nostdinc -iquote $cosmo -isystem $cosmo/libc/isystem -include $cosmo/libc/integral/normalize.inc"
|
|
|
|
_LDFLAGS="-static -no-pie -nostdlib -fuse-ld=bfd -Wl,-melf_x86_64 -Wl,--gc-sections -Wl,-z,max-page-size=0x1000"
|
|
|
|
_LDFLAGS="$_LDFLAGS -Wl,-T,$dist/public/ape.lds $dist/ape-no-modify-self.o $dist/crt.o"
|
|
|
|
_LDLIBS="$dist/cosmopolitan.a"
|
|
|
|
|
|
|
|
is_in() {
|
|
|
|
x="$1"
|
|
|
|
shift || exit
|
|
|
|
for y in "$@"; do
|
|
|
|
if [ "$x" = "$y" ]; then
|
|
|
|
return 0
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
return 1
|
|
|
|
}
|
|
|
|
|
|
|
|
any=0
|
|
|
|
flag_c=0
|
|
|
|
flag_E=0
|
|
|
|
flag_M=0
|
|
|
|
flag_o=0
|
|
|
|
flag_shared=0
|
|
|
|
is_conftest=0
|
|
|
|
|
|
|
|
for x in "$@"; do
|
|
|
|
[ $any = 1 ] || set --
|
|
|
|
any=1
|
2022-10-04 02:52:40 -07:00
|
|
|
if [ "$x" = --version ]; then
|
2022-09-23 12:28:31 -07:00
|
|
|
printf '%s\n' \
|
|
|
|
'x86_64-linux-musl-gcc (GCC) 9.2.0' \
|
|
|
|
'Copyright (C) 2019 Free Software Foundation, Inc.' \
|
|
|
|
'This is free software; see the source for copying conditions. There is NO' \
|
|
|
|
'warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.' \
|
|
|
|
''
|
|
|
|
exit 0
|
|
|
|
elif is_in "$x" \
|
2022-10-04 02:58:25 -07:00
|
|
|
-fomit-frame-pointer -fPIC -fpic -lc -lc_r -lcma -ldl \
|
|
|
|
-lgcc -lm -lpthread -lpthreads -lresolv -lrt -lunwind \
|
|
|
|
-lutil -Wl,-Bdynamic -Wl,-Bstatic
|
2022-09-23 12:28:31 -07:00
|
|
|
then continue
|
|
|
|
elif [ "$x" = -c ]; then
|
|
|
|
flag_c=1
|
|
|
|
elif [ "$x" = -E ]; then
|
|
|
|
flag_E=1
|
|
|
|
elif [ "$x" = -M ] || [ "$x" = -MM ]; then
|
|
|
|
flag_M=1
|
|
|
|
elif [ "$x" = -shared ]; then
|
|
|
|
flag_shared=1
|
|
|
|
elif [ "$x" = -o ] || [ "${x#-o}" != "$x" ]; then
|
|
|
|
flag_o=1
|
|
|
|
elif [ "$x" = conftest.c ]; then
|
|
|
|
is_conftest=1
|
|
|
|
fi
|
|
|
|
set -- "$@" "$x"
|
|
|
|
done
|
|
|
|
|
|
|
|
if [ $flag_E = 1 ] || [ $flag_M = 1 ]; then
|
|
|
|
# only preprocess.
|
|
|
|
set -- $_CPPFLAGS "$@"
|
|
|
|
elif [ $flag_c = 1 ]; then
|
|
|
|
# preprocess and compile.
|
|
|
|
set -- $_CFLAGS $_CPPFLAGS "$@"
|
|
|
|
else
|
|
|
|
# preprocess, compile, and link.
|
|
|
|
# TODO: but then where's $_CFLAGS?
|
|
|
|
set -- $_LDFLAGS $_CPPFLAGS "$@" $_LDLIBS
|
|
|
|
fi
|
|
|
|
|
|
|
|
if [ $any = 0 ]; then
|
|
|
|
printf '\033[1m%s\033[m\n' >&2 'warning: cosmocc called without flags'
|
|
|
|
x86_64-linux-musl-gcc
|
|
|
|
else
|
|
|
|
if [ -w / ]; then
|
|
|
|
# probably a container being built.
|
|
|
|
printf '%s\n' >>/cosmocc.log "$*"
|
|
|
|
fi
|
|
|
|
if [ $is_conftest = 1 ]; then
|
|
|
|
x86_64-linux-musl-gcc -fmax-errors=3 >/tmp/fudged "$@" || exit
|
|
|
|
sed -e '/^typedef struct {/,/}/d' -e '/^typedef/d' /tmp/fudged
|
|
|
|
else
|
|
|
|
x86_64-linux-musl-gcc "$@"
|
|
|
|
fi
|
|
|
|
fi
|