callisto/configure

128 lines
2 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
# these also apply to all libraries in external/
cflags='-std=c99'
cppflags='-DLUA_USE_POSIX'
ldflags='-lm'
#
## utility functions
#
present () {
command -v "$1" 1>/dev/null 2>/dev/null
}
using () {
printf "using $1\n"
}
throw () {
>&2 printf "$(basename $0): $1\n"
exit 1
}
#
## flag generators
#
## C compiler
gen_CC () {
if ! [ -z "$cc" ]; then
using "$cc"
return 0
fi
if present clang; then
cc=clang
elif present cc; then
cc=cc
elif present gcc; then
cc=gcc
else
throw "C compiler not found, please acquire a copy of LLVM Clang or the GNU C compiler"
fi
using "$cc"
}
## flags used in the compilation step
gen_CFLAGS () {
if [ -z "$debug" ]; then
cflags="$cflags -O3"
else
cflags="$cflags -O0 -g"
fi
for flag in $cflags; do
using "$flag"
done
}
## flags used in the linking step
gen_LDFLAGS () {
if pkg-config readline; then
ldflags="$ldflags $(pkg-config --libs readline)"
fi
if present ld.lld; then
ldflags="$ldflags -fuse-ld=lld"
elif present ld.gold; then
ldflags="$ldflags -fuse-ld=gold"
fi
[ -z "$debug" ] && ldflags="$ldflags -Wl,--gc-sections"
for flag in $ldflags; do
using "$flag"
done
}
#
## command line interface
#
while getopts c:dhr ch; do
case "$ch" in
c) cc="$OPTARG" ;;
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
-d: build in debug mode, with debug symbols 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
#
## create the makefile
#
cd $(dirname $0)
gen_CC
gen_CFLAGS
gen_LDFLAGS
printf '# generated by configure
_CC = %s
_CFLAGS = %s
_CPPFLAGS = %s
_LDFLAGS =%s
' \
"$cc" \
"$cflags" \
"$cppflags"\
"$ldflags" \
>"$mkf"