#!/usr/bin/env sh # simple and flexible configure script for people who don't like to waste time # licensed to the public domain set -e mkf=config.mk di='di' imports="$di" objs='esvapi.o util.o initial.o' srcs='esvapi.d util.d initial.d' # utility functions present () { command -v "$1" 1>/dev/null 2>/dev/null } throw () { >&2 printf "%s: %s\n" "$(basename "$0")" "$1" exit 1 } using () { >&2 printf "using %s\n" "$1" } # generators ## D compiler gen_DC () { if [ -n "$dc" ]; then using "$dc" return 0 fi if present ldc2; then dc=ldc2 dcname="$dc" elif present dmd; then dc=dmd dcname="$dc" else throw "D compiler not found; install LDC or DMD" fi using "$dc" } ## flags used in the compilation step gen_CFLAGS () { if [ -z "$debug" ]; then case "$dcname" in ldc2) cflags="-Oz";; dmd) cflags="-O";; esac else cflags="-g" case "$dcname" in ldc2) cflags="$cflags -O0 -d-debug";; dmd) cflags="$cflags -debug";; esac fi [ -n "$unittest" ] && cflags="$cflags -unittest -main" for flag in $cflags; do using "$flag" done } ## flags used in the linking step gen_LDFLAGS () { if [ "$dcname" = ldc2 ]; then if present ld.lld; then ldflags="-linker=lld" elif present ld.gold; then ldflags="-linker=gold" fi fi if [ -z "$debug" ]; then if [ -n "$ldflags" ]; then ldflags="$ldflags "; fi ldflags="$ldflags-L--gc-sections" fi for flag in $ldflags; do using "$flag" done } # command line interface while getopts c:dhrt ch; do case "$ch" in c) dcname="$(basename "$OPTARG")" case "$dcname" in ldc2) dc="$OPTARG" ;; dmd) dc="$OPTARG" ;; *) throw "unknown D compiler '$dcname' specified (valid options: ldc2, dmd)" ;; esac ;; d) debug=1 ;; r) unset debug ;; t) unittest=1; debug=1 ;; h) cat <&2 "$dc" -o- -op -H -Hd="$di" "$src" done rm -f "$mkf" { printf '# begin generated definitions _DC = %s _CFLAGS = %s _LDFLAGS = %s ' "$dc" "$(echo "$cflags $Iflags" | xargs)" "$ldflags" ## generate obj list printf '_OBJS =' for obj in $objs; do printf ' %s' "$obj" done printf '\n# end generated definitions\n' ## generate dependency list printf '\n# begin generated dependencies\n' i=1 for obj in $objs; do src="$(printf '%s' "$srcs" | awk '{print $'"$i"'}')" [ -t 2 ] && printf ' (MK) %s \r' "$src" 1>&2 "$dc" -o- -makedeps "$src" i="$((i + 1))" done unset i printf '# end generated dependencies\n' } >>"$mkf"