esv/configure

159 lines
2.9 KiB
Bash
Executable file

#!/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
elif present dmd; then
dc=dmd
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 "$dc" in
ldc2) cflags="-Oz";;
dmd) cflags="-O";;
esac
else
cflags="-g"
case "$dc" in
ldc2) cflags="$cflags -O0 -d-debug";;
dmd) cflags="$cflags -debug";;
esac
fi
for flag in $cflags; do
using "$flag"
done
}
## flags used in the linking step
gen_LDFLAGS () {
if [ "$dc" = 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:dhr ch; do
case "$ch" in
c)
case "$OPTARG" in
ldc2) dc="ldc2" ;;
dmd) dc="dmd" ;;
*) throw "unknown D compiler '$OPTARG' specified (valid options: ldc2, dmd)" ;;
esac
;;
d) debug=1 ;;
r) unset debug ;;
h)
cat <<EOF
configure: create an optimised makefile for the current environment
options:
-c: force use of a particular compiler (dmd or ldc2)
-d: build in debug mode, with debug symbols and statements enabled
-r: build in release mode with optimisation flags enabled (default)
-h: show this help message
EOF
exit 0
;;
'?') exit 1 ;;
:) exit 1 ;;
esac
done
# creating the makefile
gen_DC
gen_CFLAGS
gen_LDFLAGS
for directory in $imports; do
mkdir -p "$directory"
Iflags="$(printf '%s -I%s' "$Iflags" "$directory" | xargs)"
done
for src in $srcs; do
! (echo "$src" | grep -Eq '\.d$') \
&& throw "$src: invalid source file extension"
[ -t 2 ] && printf ' (DI) %s \r' "$src" 1>&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"