add support for detecting pcc's compiler runtime
[musl] / configure
index f765ca7..19c241e 100755 (executable)
--- a/configure
+++ b/configure
@@ -33,6 +33,8 @@ Optional features:
 Some influential environment variables:
   CC                      C compiler command [detected]
   CFLAGS                  C compiler flags [-Os -pipe ...]
+  CROSS_COMPILE           prefix for cross compiler and tools [none]
+  LIBCC                   compiler runtime library [detected]
 
 Use these variables to override the choices made by configure.
 
@@ -56,7 +58,7 @@ 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
+if $CC "$2" -c -o /dev/null "$tmpc" 2>/dev/null ; then
 printf "yes\n"
 eval "$1=\"\${$1} \$2\""
 eval "$1=\${$1# }"
@@ -70,7 +72,7 @@ fi
 tryldflag () {
 printf "checking whether linker accepts %s... " "$2"
 echo "typedef int x;" > "$tmpc"
-if "$CC" -nostdlib -shared "$2" -o /dev/null "$tmpc" 2>/dev/null ; then
+if $CC -nostdlib -shared "$2" -o /dev/null "$tmpc" 2>/dev/null ; then
 printf "yes\n"
 eval "$1=\"\${$1} \$2\""
 eval "$1=\${$1# }"
@@ -126,6 +128,8 @@ CC=*) CC=${arg#*=} ;;
 CFLAGS=*) CFLAGS=${arg#*=} ;;
 CPPFLAGS=*) CPPFLAGS=${arg#*=} ;;
 LDFLAGS=*) LDFLAGS=${arg#*=} ;;
+CROSS_COMPILE=*) CROSS_COMPILE=${arg#*=} ;;
+LIBCC=*) LIBCC=${arg#*=} ;;
 *=*) ;;
 *) target=$arg ;;
 esac
@@ -155,9 +159,9 @@ 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
+trycc ${CROSS_COMPILE}gcc
+trycc ${CROSS_COMPILE}c99
+trycc ${CROSS_COMPILE}cc
 printf "%s\n" "$CC"
 test -n "$CC" || { echo "$0: cannot find a C compiler" ; exit 1 ; }
 
@@ -166,7 +170,7 @@ test -n "$CC" || { echo "$0: cannot find a C compiler" ; exit 1 ; }
 #
 if test -z "$wrapper" ; then
 printf "checking whether compiler is gcc... "
-if fnmatch '*gcc\ version*' "$("$CC" -v 2>&1)" ; then
+if fnmatch '*gcc\ version*' "$($CC -v 2>&1)" ; then
 echo yes
 printf "checking whether to build musl-gcc wrapper... "
 wrapper=yes
@@ -187,7 +191,7 @@ fi
 # Find the target architecture
 #
 printf "checking target system type... "
-test -n "$target" || target=$("$CC" -dumpmachine 2>/dev/null) || target=unknown
+test -n "$target" || target=$($CC -dumpmachine 2>/dev/null) || target=unknown
 printf "%s\n" "$target"
 
 #
@@ -197,6 +201,8 @@ case "$target" in
 arm*) ARCH=arm ;;
 i?86*) ARCH=i386 ;;
 x86_64*) ARCH=x86_64 ;;
+mips-*|mipsel-*) ARCH=mips ;;
+microblaze-*) ARCH=microblaze ;;
 unknown) fail "$0: unable to detect target arch; try $0 --target=..." ;;
 *) fail "$0: unknown or unsupported target \"$target\"" ;;
 esac
@@ -209,7 +215,7 @@ tryflag CFLAGS_C99FSE -nostdinc
 tryflag CFLAGS_C99FSE -ffreestanding \
 || tryflag CFLAGS_C99FSE -fno-builtin
 tryflag CFLAGS_C99FSE -fexcess-precision=standard \
-|| tryflag CFLAGS_C99FSE -ffloat-store
+|| { test "$ARCH" = i386 && tryflag CFLAGS_C99FSE -ffloat-store ; }
 tryflag CFLAGS_C99FSE -frounding-math
 
 #
@@ -223,15 +229,31 @@ test "x$debug" = xyes && CFLAGS_AUTO="-g"
 tryflag CFLAGS_AUTO -pipe
 
 #
-# If debugging is disabled, omit bloated DWARF2 unwind tables & frame ptr
+# If debugging is disabled, omit frame pointer. Modern GCC does this
+# anyway on most archs even when debugging is enabled since the frame
+# pointer is no longer needed for debugging.
 #
 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
 
+#
+# Modern GCC wants to put DWARF tables (used for debugging and
+# unwinding) in the loaded part of the program where they are
+# unstrippable. These options force them back to debug sections (and
+# cause them not to get generated at all if debugging is off).
+#
+tryflag CFLAGS_AUTO -fno-unwind-tables
+tryflag CFLAGS_AUTO -fno-asynchronous-unwind-tables
+
+#
+# The GNU toolchain defaults to assuming unmarked files need an
+# executable stack, potentially exposing vulnerabilities in programs
+# linked with such object files. Fix this.
+#
+tryflag CFLAGS_AUTO -Wa,--noexecstack
+
 #
 # Some optimization levels add bloated alignment that hurt performance
 #
@@ -247,8 +269,8 @@ tryflag CFLAGS_AUTO -falign-jumps=1
 # 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
+fnmatch '-march=*|*\ -march=*' "$CFLAGS" || tryldflag CFLAGS_AUTO -march=i486
+fnmatch '-mtune=*|*\ -mtune=*' "$CFLAGS" || tryldflag CFLAGS_AUTO -mtune=generic
 fi
 
 if test "x$warnings" = xyes ; then
@@ -265,7 +287,20 @@ fi
 
 # Some patched GCC builds have these defaults messed up...
 tryflag CFLAGS_AUTO -fno-stack-protector
-tryldflag LDFLAGS_AUTO -Wl,--hash-style=sysv
+tryldflag LDFLAGS_AUTO -Wl,--hash-style=both
+
+# Disable dynamic linking if ld is broken and can't do -Bsymbolic-functions
+LDFLAGS_DUMMY=
+tryldflag LDFLAGS_DUMMY -Wl,-Bsymbolic-functions || {
+printf "warning: disabling dynamic linking support\n"
+shared=no
+}
+
+# Find compiler runtime library
+test -z "$LIBCC" && tryldflag LIBCC -lgcc && tryldflag LIBCC -lgcc_eh
+test -z "$LIBCC" && tryldflag LIBCC -lcompiler_rt
+test -z "$LIBCC" && tryldflag LIBCC -lpcc
+printf "using compiler runtime libraries: %s\n" "$LIBCC"
 
 
 printf "creating config.mak... "
@@ -288,6 +323,8 @@ CFLAGS= $CFLAGS_AUTO $CFLAGS
 CFLAGS_C99FSE = $CFLAGS_C99FSE
 CPPFLAGS = $CPPFLAGS
 LDFLAGS = $LDFLAGS_AUTO $LDFLAGS
+CROSS_COMPILE = $CROSS_COMPILE
+LIBCC = $LIBCC
 EOF
 test "x$static" = xno && echo "STATIC_LIBS ="
 test "x$shared" = xno && echo "SHARED_LIBS ="