#!/bin/sh # Based on the configure script from musl libc, MIT licensed usage () { cat </dev/null 2>&1 && { echo "$1" ; return 0 ; } $1 EOF printf %s\\n "$1" | sed -e "s/'/'\\\\''/g" -e "1s/^/'/" -e "\$s/\$/'/" -e "s#^'\([-[:alnum:]_,./:]*\)=\(.*\)\$#\1='\2#" } echo () { printf "%s\n" "$*" ; } fail () { echo "$*" ; exit 1 ; } fnmatch () { eval "case \"\$2\" in $1) return 0 ;; *) return 1 ;; esac" ; } cmdexists () { type "$1" >/dev/null 2>&1 ; } trycc () { test -z "$CC" && cmdexists "$1" && CC=$1 ; } stripdir () { while eval "fnmatch '*/' \"\${$1}\"" ; do eval "$1=\${$1%/}" ; done } trycppif () { printf "checking preprocessor condition %s... " "$1" echo "typedef int x;" > "$tmpc" echo "#if $1" >> "$tmpc" echo "#error yes" >> "$tmpc" echo "#endif" >> "$tmpc" if $CC $2 -c -o "$tmpo" "$tmpc" >/dev/null 2>&1 ; then printf "false\n" return 1 else printf "true\n" return 0 fi } tryflag () { printf "checking whether compiler accepts %s... " "$2" echo "typedef int x;" > "$tmpc" if $CC $CFLAGS_TRY $2 -c -o "$tmpo" "$tmpc" >/dev/null 2>&1 ; then printf "yes\n" eval "$1=\"\${$1} \$2\"" eval "$1=\${$1# }" return 0 else printf "no\n" return 1 fi } tryldflag () { printf "checking whether linker accepts %s... " "$2" echo "typedef int x;" > "$tmpc" if $CC $LDFLAGS_TRY -nostdlib -shared "$2" -o "$tmpo" "$tmpc" >/dev/null 2>&1 ; then printf "yes\n" eval "$1=\"\${$1} \$2\"" eval "$1=\${$1# }" return 0 else printf "no\n" return 1 fi } # Beginning of actual script CFLAGS_AUTO= CFLAGS_TRY= LDFLAGS_AUTO= LDFLAGS_TRY= SRCDIR= PREFIX=/usr/local EXEC_PREFIX='$(PREFIX)' BINDIR='$(EXEC_PREFIX)/bin' MANDIR='$(PREFIX)/share/man' for arg ; do case "$arg" in --help|-h) usage ;; --srcdir=*) SRCDIR=${arg#*=} ;; --prefix=*) PREFIX=${arg#*=} ;; --exec-prefix=*) EXEC_PREFIX=${arg#*=} ;; --bindir=*) BINDIR=${arg#*=} ;; --sharedir=*) SHAREDIR=${arg#*=} ;; --docdir=*) DOCDIR=${arg#*=} ;; --mandir=*) MANDIR=${arg#*=} ;; --enable-*|--disable-*|--with-*|--without-*|--*dir=*|--build=*) ;; -* ) echo "$0: unknown option $arg" ;; CC=*) CC=${arg#*=} ;; CFLAGS=*) CFLAGS=${arg#*=} ;; CPPFLAGS=*) CPPFLAGS=${arg#*=} ;; LDFLAGS=*) LDFLAGS=${arg#*=} ;; *=*) ;; *) ;; esac done for i in SRCDIR PREFIX EXEC_PREFIX BINDIR MANDIR ; do stripdir $i done # # Get the source dir for out-of-tree builds # if test -z "$SRCDIR" ; then SRCDIR="${0%/configure}" stripdir SRCDIR fi abs_builddir="$(pwd)" || fail "$0: cannot determine working directory" abs_srcdir="$(cd $SRCDIR && pwd)" || fail "$0: invalid source directory $SRCDIR" test "$abs_srcdir" = "$abs_builddir" && SRCDIR=. test "$SRCDIR" != "." -a -f Makefile -a ! -h Makefile && fail "$0: Makefile already exists in the working directory" # # Get a temp filename we can use # i=0 set -C while : ; do i=$(($i+1)) tmpc="./conf$$-$PPID-$i.c" tmpo="./conf$$-$PPID-$i.o" 2>|/dev/null > "$tmpc" && break test "$i" -gt 50 && fail "$0: cannot create temporary file $tmpc" done set +C trap 'rm -f "$tmpc" "$tmpo"' EXIT INT QUIT TERM HUP # # Find a C compiler to use # printf "checking for C compiler... " trycc cc trycc gcc trycc clang printf "%s\n" "$CC" test -n "$CC" || { echo "$0: cannot find a C compiler" ; exit 1 ; } printf "checking whether C compiler works... " echo "typedef int x;" > "$tmpc" if output=$($CC $CPPFLAGS $CFLAGS -c -o "$tmpo" "$tmpc" 2>&1) ; then printf "yes\n" else printf "no; compiler output follows:\n%s\n" "$output" exit 1 fi # # Figure out options to force errors on unknown flags. # tryflag CFLAGS_TRY -Werror=unknown-warning-option tryflag CFLAGS_TRY -Werror=unused-command-line-argument tryldflag LDFLAGS_TRY -Werror=unknown-warning-option tryldflag LDFLAGS_TRY -Werror=unused-command-line-argument CFLAGS_STD="-std=c99 -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700 -DNDEBUG -D_FORTIFY_SOURCE=2" LDFLAGS_STD="-lc -lutil" OS=$(uname) case "$OS" in FreeBSD) CFLAGS_STD="$CFLAGS_STD -D_BSD_SOURCE -D__BSD_VISIBLE=1" ;; *BSD) CFLAGS_STD="$CFLAGS_STD -D_BSD_SOURCE" ;; Darwin) CFLAGS_STD="$CFLAGS_STD -D_DARWIN_C_SOURCE" ;; AIX) CFLAGS_STD="$CFLAGS_STD -D_ALL_SOURCE" ;; esac tryflag CFLAGS -pipe # Try flags to optimize binary size tryflag CFLAGS -Os tryflag CFLAGS -ffunction-sections tryflag CFLAGS -fdata-sections tryldflag LDFLAGS_AUTO -Wl,--gc-sections # Try hardening flags tryflag CFLAGS -fPIE tryflag CFLAGS_AUTO -fstack-protector-all tryldflag LDFLAGS -Wl,-z,now tryldflag LDFLAGS -Wl,-z,relro tryldflag LDFLAGS_AUTO -pie printf "creating config.mk... " cmdline=$(quote "$0") for i ; do cmdline="$cmdline $(quote "$i")" ; done exec 3>&1 1>config.mk cat << EOF # This version of config.mk was generated by: # $cmdline # Any changes made here will be lost if configure is re-run SRCDIR = $SRCDIR PREFIX = $PREFIX EXEC_PREFIX = $EXEC_PREFIX BINDIR = $BINDIR MANPREFIX = $MANDIR CC = $CC CFLAGS = $CFLAGS LDFLAGS = $LDFLAGS CFLAGS_STD = $CFLAGS_STD LDFLAGS_STD = $LDFLAGS_STD CFLAGS_AUTO = $CFLAGS_AUTO LDFLAGS_AUTO = $LDFLAGS_AUTO CFLAGS_DEBUG = -U_FORTIFY_SOURCE -UNDEBUG -O0 -g -ggdb -Wall -Wextra -pedantic -Wno-unused-parameter -Wno-sign-compare EOF exec 1>&3 3>&- printf "done\n" test "$SRCDIR" = "." || ln -sf $SRCDIR/Makefile .