mirror of
https://github.com/jart/cosmopolitan.git
synced 2024-05-18 03:22:40 +00:00
d53c335a45
This new script is an alternative to the `cosmocc` command. It's still a work in progress. It abstracts all the gory details of building separate copies of your executable and then running the apelink.com program.
52 lines
1.5 KiB
Bash
Executable file
52 lines
1.5 KiB
Bash
Executable file
#!/bin/sh
|
|
# arm64 backend compiler for fatcosmocc
|
|
|
|
CC="$COSMO/o/third_party/gcc/bin/aarch64-linux-musl-gcc"
|
|
CCFLAGS="-ffixed-x18 -ffixed-x28 -mno-outline-atomics"
|
|
LDFLAGS="-static -nostdlib -no-pie -Wl,-z,norelro"
|
|
APEFLAGS="-L$COSMOS/lib/.aarch64 -Wl,--gc-sections -Wl,-T,$COSMO/o/$MODE/ape/aarch64.lds $COSMO/o/$MODE/libc/crt/crt.o"
|
|
LDLIBS="$COSMO/o/$MODE/cosmopolitan.a"
|
|
|
|
if [ x"$PROG" != x"${PROG%++}" ]; then
|
|
CC="$COSMO/o/third_party/gcc/bin/aarch64-linux-musl-g++"
|
|
CCFLAGS="$CCFLAGS -fno-rtti -fno-exceptions -fuse-cxa-atexit -fno-threadsafe-statics"
|
|
LDLIBS="$COSMO/o/$MODE/third_party/libcxx/libcxx.a $LDLIBS"
|
|
fi
|
|
|
|
OPT=
|
|
FIRST=1
|
|
OUTPUT=
|
|
INTENT=ld
|
|
for x; do
|
|
if [ $FIRST -eq 1 ]; then
|
|
set --
|
|
FIRST=0
|
|
fi
|
|
if [ x"$x" != x"${x#-O}" ]; then
|
|
OPT=$x
|
|
elif [ x"$x" = x"-c" ]; then
|
|
INTENT=cc
|
|
elif [ x"$x" != x"${x#-o}" ]; then
|
|
OUTPUT=${x#-o}
|
|
elif [ x"$x" = x"-march=native" ]; then
|
|
continue # doesn't make sense for a cross compiler
|
|
fi
|
|
set -- "$@" "$x"
|
|
done
|
|
|
|
if [ x"$OPT" != x"-Os" ] && [ x"${MODE#aarch64-tiny}" != x"${MODE}" ]; then
|
|
# support --ftrace unless optimizing for size
|
|
CCFLAGS="$CCFLAGS -fpatchable-function-entry=7,6"
|
|
fi
|
|
|
|
if [ $INTENT = cc ]; then
|
|
set -- "$CC" $CCFLAGS "$@"
|
|
else
|
|
set -- "$CC" $CCFLAGS $LDFLAGS $APEFLAGS $CPPFLAGS "$@" \
|
|
$LDLIBS -Wl,-z,common-page-size=16384 -Wl,-z,max-page-size=16384
|
|
fi
|
|
|
|
printf '# %s\n(cd %s; %s)\n' "$ORIGINAL" "$PWD" "$*" >>"${TMPDIR:-/tmp}/build.log"
|
|
"$@" || exit
|
|
"$FIXUPOBJ" "$OUTPUT" || exit
|