callisto/configure
Jeremy Baxter ef3da25fb5 configure: use gcc over cc
We don't know what the system cc supports in terms of command line
flags, it could be tcc for all we know. Aiming for gcc over cc allows
the build to succeed when cc is not gcc or clang, but the user can
always override it themselves with the -c configure switch.
2024-02-27 18:44:43 +13:00

215 lines
3.7 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=''
ext_cppflags='-DLUA_USE_POSIX'
ldflags='-lm'
# optional libraries to build with support for; a dynamically
# linked Lua 5.4 library may be supported here later
optlibs='readline'
withlibs=''
#
## 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
}
#
## list utilities
#
# Returns 0 if the given item is in the given list, otherwise returns 1.
inlist () {
local item="$1"
local list="$2"
for elem in $list; do
if [ "$elem" = "$item" ]; then
return 0
fi
done
return 1
}
# Removes the given item from the given list and returns the new list.
removefrom () {
local item="$1"
local list="$2"
local newlist=""
for elem in $list; do
if ! [ "$elem" = "$item" ]; then
newlist="$newlist $elem"
fi
done
printf '%s' "$newlist"
}
# Trims the given string of leading and trailing whitespace.
trim () {
printf '%s' "$1" | xargs
}
#
## flag generators
#
## C compiler
gen_CC () {
if ! [ -z "$cc" ]; then
using "$cc"
return 0
fi
if present clang; then
cc=clang
elif present gcc; then
cc=gcc
elif present cc; then
cc=cc
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
if inlist readline "$withlibs"; then
cppflags="$cppflags -DLUA_USE_READLINE"
fi
for flag in $cflags $cppflags; do
using "$flag"
done
cflags="$(trim "$cflags")"
cppflags="$(trim "$cppflags")"
}
## flags used in the linking step
gen_LDFLAGS () {
if inlist readline "$withlibs"; 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
ldflags="$(trim "$ldflags")"
}
#
## misc. functions
#
assertvalidlib () {
if ! inlist "$OPTARG" "$optlibs"; then
throw "invalid library '$OPTARG'; supported libraries are:
$optlibs"
fi
}
#
## command line interface
#
while getopts c:dhrw:W: 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
-wname: build with support for the given library; see the list below
-Wname: build without support for the given library
If a -w or -W option is supplied on the command line, then the
argument is checked against the following list of libraries:
EOF
for lib in $optlibs; do
printf ' - %s\n' "$lib"
done
exit 0
;;
w)
assertvalidlib
if ! inlist "$OPTARG" "$withlibs"; then
withlibs="$withlibs $OPTARG"
fi
;;
W)
assertvalidlib
if inlist "$OPTARG" "$withlibs"; then
withlibs="$(removefrom "$OPTARG" "$withlibs")"
fi
;;
?) 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
_EXT_CPPFLAGS = %s
' \
"$cc" \
"$cflags" \
"$cppflags"\
"$ldflags" \
"$ext_cppflags"\
>"$mkf"