diff --git a/configure b/configure new file mode 100755 index 00000000..df1d3011 --- /dev/null +++ b/configure @@ -0,0 +1,275 @@ +#!/bin/sh + +usage () { +cat </dev/null 2>&1 ; } +trycc () { test -z "$CC" && cmdexists "$1" && CC=$1 ; } + +setdir () { +if eval "test -z \"\${$1}\"" ; then eval "$1=\$2" +else eval "fnmatch '*/' \"\${$1}\"" && eval "$1=\${$1%/}" ; fi +} + +tryflag () { +printf "checking whether compiler accepts %s... " "$2" +echo "typedef int x;" > "$tmpc" +if "$CC" "$2" -c -o /dev/null "$tmpc" 2>/dev/null ; then +printf "yes\n" +eval "$1=\"\${$1} \$2\"" +eval "$1=\${$1# }" +return 0 +else +printf "no\n" +return 1 +fi +} + + + +# Beginning of actual script + +prefix= +exec_prefix= +bindir= +libdir= +includedir= +syslibdir= +build= +debug=no +warnings= +shared=yes +static=yes + +for arg ; do +case "$arg" in +--help) usage ;; +--prefix=*) prefix=${arg#*=} ;; +--exec-prefix=*) exec_prefix=${arg#*=} ;; +--bindir=*) bindir=${arg#*=} ;; +--libdir=*) libdir=${arg#*=} ;; +--includedir=*) includedir=${arg#*=} ;; +--syslibdir=*) syslibdir=${arg#*=} ;; +--enable-shared|--enable-shared=yes) shared=yes ;; +--disable-shared|--enable-shared=no) shared=no ;; +--enable-static|--enable-static=yes) static=yes ;; +--disable-static|--enable-static=no) static=no ;; +--enable-debug|--enable-debug=yes) debug=yes ;; +--disable-debug|--enable-debug=no) debug=no ;; +--enable-warnings|--enable-warnings=yes) warnings=yes ;; +--disable-warnings|--enable-warnings=no) warnings=no ;; +--enable-gcc-wrapper|--enable-gcc-wrapper=yes) wrapper=yes ;; +--disable-gcc-wrapper|--enable-gcc-wrapper=no) wrapper=no ;; +--enable-*|--disable-*|--with-*|--without-*|--*dir=*|--host=*) ;; +--build=*|--target=*) build=${arg#*=} ;; +-* ) echo "$0: unknown option $arg" ;; +CC=*) CC=${arg#*=} ;; +CFLAGS=*) CFLAGS=${arg#*=} ;; +CPPFLAGS=*) CPPFLAGS=${arg#*=} ;; +LDFLAGS=*) LDFLAGS=${arg#*=} ;; +*) build=$arg ;; +esac +done + +setdir prefix /usr/local/musl +setdir exec_prefix '$(prefix)' +setdir bindir '$(exec_prefix)/bin' +setdir libdir '$(prefix)/lib' +setdir includedir '$(prefix)/include' +setdir syslibdir '/lib' + +# +# Get a temp filename we can use +# +i=0 +set -C +while : ; do i=$(($i+1)) +tmpc="./conf$$-$PPID-$i.c" +2>/dev/null > "$tmpc" && break +test "$i" -gt 50 && fail "$0: cannot create temporary file $tmpc" +done +set +C +trap 'rm "$tmpc"' EXIT INT QUIT TERM HUP + +# +# Find a C compiler to use +# +printf "checking for C compiler... " +trycc gcc +trycc c99 +trycc cc +printf "%s\n" "$CC" +test -n "$CC" || { echo "$0: cannot find a C compiler" ; exit 1 ; } + +# +# Only build musl-gcc wrapper if toolchain does not already target musl +# +if test -z "$wrapper" ; then +printf "checking whether compiler is gcc... " +if fnmatch 'gcc*|GCC*' "$("$CC" --version 2>/dev/null)" ; then +echo yes +printf "checking whether to build musl-gcc wrapper... " +wrapper=yes +while read line ; do +case "$line" in */ld-musl-*) wrapper=no ;; esac +done </dev/null) || build=unknown +printf "%s\n" "$build" + +# +# Convert to just ARCH +# +case "$build" in +arm*) ARCH=arm ;; +i?86*) ARCH=i386 ;; +x86_64*) ARCH=x86_64 ;; +unknown) fail "$0: unable to detect built target; try $0 --build=..." ;; +*) fail "$0: unknown or unsupported build target \"$build\"" ;; +esac + +# +# Try to get a conforming C99 freestanding environment +# +tryflag CFLAGS_C99FSE -std=c99 +tryflag CFLAGS_C99FSE -nostdinc +tryflag CFLAGS_C99FSE -ffreestanding \ +|| tryflag CFLAGS_C99FSE -fno-builtin +tryflag CFLAGS_C99FSE -fexcess-precision=standard \ +|| tryflag CFLAGS_C99FSE -ffloat-store + +# +# Setup basic default CFLAGS: debug, optimization, and -pipe +# +if fnmatch '-O*|*\ -O*' "$CFLAGS_AUTO $CFLAGS" ; then : +else +tryflag CFLAGS_AUTO -Os || tryflag CFLAGS_AUTO -O2 +fi +test "x$debug" = xyes && CFLAGS_AUTO="-g" +tryflag CFLAGS_AUTO -pipe + +# +# If debugging is disabled, omit bloated DWARF2 unwind tables & frame ptr +# +if fnmatch '-g*|*\ -g*' "$CFLAGS_AUTO $CFLAGS" ; then : +else +tryflag CFLAGS_AUTO -fno-unwind-tables +tryflag CFLAGS_AUTO -fno-asynchronous-unwind-tables +tryflag CFLAGS_AUTO -fomit-frame-pointer +fi + +# +# Some optimization levels add bloated alignment that hurt performance +# +tryflag CFLAGS_AUTO -falign-functions=1 +tryflag CFLAGS_AUTO -falign-labels=1 +tryflag CFLAGS_AUTO -falign-loops=1 +tryflag CFLAGS_AUTO -falign-jumps=1 + +# +# On x86, make sure we don't have incompatible instruction set +# extensions enabled by default. This is bad for making static binaries. +# We cheat and use i486 rather than i386 because i386 really does not +# work anyway (issues with atomic ops). +# +if test "$ARCH" = "i386" ; then +fnmatch '-march=*|*\ -march=*' "$CFLAGS" || tryflag CFLAGS_AUTO -march=i486 +fnmatch '-mtune=*|*\ -mtune=*' "$CFLAGS" || tryflag CFLAGS_AUTO -mtune=generic +fi + +if test "x$warnings" = xyes ; then +tryflag CFLAGS_AUTO -Wall +tryflag CFLAGS_AUTO -Wpointer-arith +tryflag CFLAGS_AUTO -Wcast-align +tryflag CFLAGS_AUTO -Wno-parentheses +tryflag CFLAGS_AUTO -Wno-uninitialized +tryflag CFLAGS_AUTO -Wno-missing-braces +tryflag CFLAGS_AUTO -Wno-unused-value +tryflag CFLAGS_AUTO -Wno-unused-but-set-variable +tryflag CFLAGS_AUTO -Wno-unknown-pragmas +fi + + +printf "creating config.mak... " + +exec 3>&1 1>config.mak + + +cat << EOF +# This version of config.mak was generated by configure +# Any changes made here will be lost if configure is re-run +ARCH = $ARCH +prefix = $prefix +exec_prefix = $exec_prefix +bindir = $bindir +libdir = $libdir +includedir = $includedir +syslibdir = $syslibdir +CC = $CC +CFLAGS= $CFLAGS_AUTO $CFLAGS +CFLAGS_C99FSE = $CFLAGS_C99FSE +CPPFLAGS = $CPPFLAGS +LDFLAGS = $LDFLAGS +EOF +test "x$static" = xno && echo "STATIC_LIBS =" +test "x$shared" = xno && echo "SHARED_LIBS =" +test "x$wrapper" = xno && echo "ALL_TOOLS =" +test "x$wrapper" = xno && echo "TOOL_LIBS =" +exec 1>&3 3>&- + +printf "done\n"