inlist determines whether an item is in a list removefrom returns a list with an element removed trim strips whitespace from a string, using xargs
166 lines
2.6 KiB
Bash
Executable file
166 lines
2.6 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
|
|
}
|
|
|
|
#
|
|
## 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 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"
|