2020-09-01 02:31:11 +00:00
|
|
|
#!/bin/sh
|
2020-06-15 14:18:57 +00:00
|
|
|
#-*-mode:sh;indent-tabs-mode:nil;tab-width:2;coding:utf-8-*-┐
|
|
|
|
#───vi: set net ft=sh ts=2 sts=2 fenc=utf-8 :vi─────────────┘
|
|
|
|
#
|
|
|
|
# OVERVIEW
|
|
|
|
#
|
|
|
|
# GNU Linker Veneer
|
|
|
|
#
|
|
|
|
# DESCRIPTION
|
|
|
|
#
|
|
|
|
# This script wraps normal linker commands that're transparently
|
|
|
|
# passed-through. It adds ephemeral logging and directory creation.
|
|
|
|
#
|
|
|
|
# EXAMPLE
|
|
|
|
#
|
|
|
|
# build/linker ld -o program program.o
|
|
|
|
|
|
|
|
if [ ! -d o/third_party/gcc ]; then
|
|
|
|
third_party/gcc/unbundle.sh
|
|
|
|
fi
|
|
|
|
|
|
|
|
export LC_ALL=C # very important for ld
|
|
|
|
MKDIR=${MKDIR:-$(command -v mkdir) -p} || exit
|
|
|
|
|
|
|
|
OUT=
|
|
|
|
FIRST=1
|
|
|
|
OUTARG=0
|
|
|
|
for x; do
|
|
|
|
if [ $FIRST -eq 1 ]; then
|
|
|
|
set --
|
|
|
|
FIRST=0
|
|
|
|
elif [ $OUTARG -eq 1 ]; then
|
|
|
|
OUTARG=0
|
|
|
|
OUT="$x"
|
|
|
|
fi
|
|
|
|
case "$x" in
|
|
|
|
-o)
|
|
|
|
OUTARG=1
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
set -- "$@" "$x"
|
|
|
|
done
|
|
|
|
|
|
|
|
if [ "$SILENT" = "0" ]; then
|
|
|
|
printf "%s\n" "$*" >&2
|
|
|
|
else
|
|
|
|
printf "$LOGFMT" "${ACTION:-LINK.elf}" "$OUT" >&2
|
|
|
|
fi
|
|
|
|
|
|
|
|
OUTDIR="${OUT%/*}"
|
|
|
|
if [ "$OUTDIR" != "$OUT" ] && [ ! -d "$OUTDIR" ]; then
|
|
|
|
$MKDIR "$OUTDIR" || exit 2
|
|
|
|
fi
|
|
|
|
|
|
|
|
REASON=failed
|
|
|
|
trap REASON=interrupted INT
|
|
|
|
|
|
|
|
"$@" && exit
|
|
|
|
|
|
|
|
if [ "$TERM" = "dumb" ]; then
|
|
|
|
f='%s %s\r\n\r\n'
|
|
|
|
else
|
|
|
|
f='\033[91m%s\033[39m \033[94m%s\033[39m\r\n\r\n'
|
|
|
|
fi
|
|
|
|
printf "$f" "link $REASON:" "$*" >&2
|
|
|
|
exit 1
|