mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-03-04 16:06:23 +00:00
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.
51 lines
1.5 KiB
Bash
Executable file
51 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
|