mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-02-12 17:27:56 +00:00
make all test CC=fatcosmocc AR='fatcosmoar rcu' This change introduces a program named mktemper.com which provides more reliable and secure temporary file name generation for scripts. It also makes our ar.com program more permissive in what commands it'll accept. The cosmocc command is improved by this change too.
133 lines
3.1 KiB
Bash
Executable file
133 lines
3.1 KiB
Bash
Executable file
#!/bin/sh
|
|
|
|
PROG=${0##*/}
|
|
MODE=${MODE:-$m}
|
|
COSMO=${COSMO:-/opt/cosmo}
|
|
|
|
fatal_error() {
|
|
echo "$PROG: $1" >&2
|
|
exit 1
|
|
}
|
|
|
|
if [ ! -x "$COSMO/o/$MODE/tool/build/ar.com" ]; then
|
|
fatal_error "you need to run: fatcosmocc --update"
|
|
fi
|
|
|
|
if [ x"$1" = x"rc" ] ||
|
|
[ x"$1" = x"rcD" ] ||
|
|
[ x"$1" = x"rcu" ] |
|
|
[ x"$1" = x"rcuD" ] ||
|
|
[ x"$1" = x"rcs" ] ||
|
|
[ x"$1" = x"rcsD" ] ||
|
|
[ x"$1" = x"--help" ] ||
|
|
[ x"$1" = x"--version" ]; then
|
|
# binutils ar is accidentally quadratic
|
|
# cosmopolitan ar is significantly faster
|
|
# it'll also use tricks like copy_file_range
|
|
AR_X86_64="$COSMO/o/$MODE/tool/build/ar.com"
|
|
AR_AARCH64="$COSMO/o/$MODE/tool/build/ar.com"
|
|
if [ "$1" = "--help" ] ||
|
|
[ "$1" = "--version" ]; then
|
|
exec "$AR_X86_64" "$1"
|
|
fi
|
|
else
|
|
AR_X86_64="$COSMO/o/third_party/gcc/bin/x86_64-linux-musl-ar"
|
|
AR_AARCH64="$COSMO/o/third_party/gcc/bin/aarch64-linux-musl-ar"
|
|
if [ "$1" = "--version" ]; then
|
|
# note: only the underlying gnu compiler binaries are gpl
|
|
# our shell script is released with the isc license
|
|
cat <<EOF
|
|
$PROG (GNU Binutils) 2.38
|
|
Copyright (C) 2022 Free Software Foundation, Inc.
|
|
This program is free software; you may redistribute it under the terms of
|
|
the GNU General Public License version 3 or (at your option) any later version.
|
|
This program has absolutely no warranty.
|
|
EOF
|
|
exit 0
|
|
elif [ "$1" = "--help" ]; then
|
|
"$AR_X86_64" --help |
|
|
sed "s!$AR_X86_64!$PROG!g" 2>/dev/null ||
|
|
"$AR_X86_64" --help
|
|
exit
|
|
fi
|
|
fi
|
|
|
|
FIRST=1
|
|
STATE=0
|
|
OUTPUT_X86_64=
|
|
OUTPUT_AARCH64=
|
|
INPUTS=
|
|
for x; do
|
|
if [ $FIRST -eq 1 ]; then
|
|
set --
|
|
FIRST=0
|
|
fi
|
|
if [ $STATE -eq 0 ]; then
|
|
if [ x"$x" != x"${x#--*}" ]; then # startswith(x, "--")
|
|
set -- "$@" "$x" # this is a flag
|
|
else
|
|
set -- "$@" "$x" # command argument, e.g. rcu, rcsD
|
|
STATE=1
|
|
fi
|
|
elif [ $STATE -eq 1 ]; then
|
|
OUTPUT_X86_64=$x
|
|
STATE=2
|
|
elif [ x"$x" != x"${x#* }" ]; then
|
|
fatal_error "input arguments containing spaces unsupported"
|
|
elif [ x"$x" != x"${x#@}" ]; then
|
|
fatal_error "input argument @file not supported yet"
|
|
elif [ -z "$INPUTS" ]; then
|
|
INPUTS=$x
|
|
else
|
|
INPUTS="$INPUTS $x"
|
|
fi
|
|
done
|
|
if [ -z "$OUTPUT_X86_64" ]; then
|
|
fatal_error "missing output path"
|
|
fi
|
|
|
|
mangle_object_path() {
|
|
path=$1
|
|
arch=$2
|
|
outdir=${path%/*}
|
|
outbas=${path##*/}
|
|
if [ x"$outdir" = x"$path" ]; then
|
|
outdir=
|
|
elif [ -n "$outdir" ]; then
|
|
outdir="$outdir/"
|
|
fi
|
|
if [ ! -d "$outdir.$arch" ]; then
|
|
mkdir -p "$outdir.$arch" || Exit
|
|
fi
|
|
mangled_path="${outdir}.$arch/$outbas"
|
|
}
|
|
|
|
OBJECTS_X86_64=
|
|
OBJECTS_AARCH64=
|
|
for x in $INPUTS; do
|
|
if [ ! -f "$x" ]; then
|
|
fatal_error "$x: no such file"
|
|
fi
|
|
mangle_object_path "$x" aarch64
|
|
if [ ! -f "$mangled_path" ]; then
|
|
fatal_error "$x: missing concomitant $mangled_path file"
|
|
fi
|
|
OBJECTS_X86_64="${OBJECTS_X86_64} $x"
|
|
OBJECTS_AARCH64="${OBJECTS_AARCH64} $mangled_path"
|
|
done
|
|
|
|
mangle_object_path "$OUTPUT_X86_64" aarch64
|
|
OUTPUT_AARCH64="$mangled_path"
|
|
|
|
"$AR_X86_64" "$@" "$OUTPUT_X86_64" $OBJECTS_X86_64 &
|
|
pid1=$!
|
|
|
|
"$AR_AARCH64" "$@" "$OUTPUT_AARCH64" $OBJECTS_AARCH64 &
|
|
pid2=$!
|
|
|
|
if ! wait $pid1; then
|
|
kill $pid2 2>/dev/null
|
|
wait
|
|
exit 1
|
|
fi
|
|
wait $pid2 || exit
|