From 64d2f8e82a877a52a3406ab77b930ea110aac228 Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Fri, 4 May 2012 23:24:51 -0400 Subject: [PATCH] initial commit of configure script this script is not based on autoconf; however it attempts to follow the same interface contracts for ease of integration with build systems. it is also not necessary to use musl. manually written config.mak files are still supported, as is building without any config.mak at all as long as you are happy with the default options and you supply at least ARCH on the command line to make. --- configure | 275 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 275 insertions(+) create mode 100755 configure 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"