#!/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 <"$mkf"