#!/bin/sh #-*-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