initial commit of configure script
authorRich Felker <dalias@aerifal.cx>
Sat, 5 May 2012 03:24:51 +0000 (23:24 -0400)
committerRich Felker <dalias@aerifal.cx>
Sat, 5 May 2012 03:24:51 +0000 (23:24 -0400)
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 [new file with mode: 0755]

diff --git a/configure b/configure
new file mode 100755 (executable)
index 0000000..df1d301
--- /dev/null
+++ b/configure
@@ -0,0 +1,275 @@
+#!/bin/sh
+
+usage () {
+cat <<EOF
+Usage: $0 [OPTION]... [VAR=VALUE]... [BUILDTYPE]
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Installation directories:
+  --prefix=PREFIX         main installation prefix [/usr/local/musl]
+  --exec-prefix=EPREFIX   installation prefix for executable files [PREFIX]
+
+Fine tuning of the installation directories:
+  --bindir=DIR            user executables [EPREFIX/bin]
+  --libdir=DIR            library files for the linker [PREFIX/lib]
+  --includedir=DIR        include files for the C compiler [PREFIX/include]
+  --syslibdir=DIR         location for the dynamic linker [/lib]
+
+System types:
+  --target=TARGET         configure to run on target TARGET [detected]
+  --build=BUILD           same as --target
+
+Optional features:
+  --enable-debug          build with debugging information [disabled]
+  --enable-warnings       build with recommended warnings flags [disabled]
+  --enable-gcc-wrapper    build musl-gcc toolchain wrapper [auto]
+  --disable-shared        inhibit building shared library [enabled]
+  --disable-static        inhibit building static library [enabled]
+
+Some influential environment variables:
+  CC                      C compiler command [detected]
+  CFLAGS                  C compiler flags [-Os -pipe ...]
+
+Use these variables to override the choices made by configure.
+
+EOF
+exit 0
+}
+
+# Helper functions
+
+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 ; }
+
+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 <<EOF
+$($CC -dumpspecs)
+EOF
+echo $wrapper
+else
+echo no
+fi
+fi
+
+
+
+#
+# Find the build architecture
+#
+printf "checking build system type... "
+test -n "$build" || build=$("$CC" -dumpmachine 2>/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"