summaryrefslogtreecommitdiff
path: root/configure
diff options
context:
space:
mode:
Diffstat (limited to 'configure')
-rwxr-xr-xconfigure275
1 files changed, 275 insertions, 0 deletions
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 <<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"