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