144 lines
2.5 KiB
Bash
Executable file
144 lines
2.5 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
|
|
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
|
|
}
|
|
using () {
|
|
>&2 printf "using %s\n" "$1"
|
|
}
|
|
throw () {
|
|
>&2 printf "%s: %s\n" "$(basename "$0")" "$1"
|
|
exit 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
|
|
|
|
rm -f "$mkf"
|
|
|
|
{
|
|
printf '# begin generated definitions
|
|
_DC = %s
|
|
_CFLAGS = %s
|
|
_LDFLAGS = %s
|
|
' "$dc" "$cflags" "$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
|
|
"$dc" -o- -makedeps \
|
|
"$(printf '%s' "$srcs" | awk '{print $'"$i"'}')"
|
|
i="$((i + 1))"
|
|
done
|
|
unset i
|
|
printf '# end generated dependencies\n'
|
|
} >>"$mkf"
|