X-Git-Url: http://nsz.repo.hu/git/?p=musl;a=blobdiff_plain;f=configure;h=9b06d2b43a43f5ec819f283a4ea4df209ab85d2f;hp=4ef6ccceaf888be5b1d29fb3176d7b1f12326b0e;hb=adefe830dd376be386df5650a09c313c483adf1a;hpb=b4ccc3c1361ca611d6590dd4af288fb9fa6a843b diff --git a/configure b/configure index 4ef6ccce..9b06d2b4 100755 --- a/configure +++ b/configure @@ -2,7 +2,7 @@ usage () { cat < "$tmpc" +if "$CC" -nostdlib -shared "$2" -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 +CFLAGS_C99FSE= +CFLAGS_AUTO= +LDFLAGS_AUTO= prefix= exec_prefix= bindir= libdir= includedir= syslibdir= -build= +target= debug=no warnings= shared=yes @@ -102,14 +121,17 @@ case "$arg" in --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#*=} ;; +--enable-*|--disable-*|--with-*|--without-*|--*dir=*|--build=*) ;; +--host=*|--target=*) target=${arg#*=} ;; -* ) echo "$0: unknown option $arg" ;; CC=*) CC=${arg#*=} ;; CFLAGS=*) CFLAGS=${arg#*=} ;; CPPFLAGS=*) CPPFLAGS=${arg#*=} ;; LDFLAGS=*) LDFLAGS=${arg#*=} ;; -*) build=$arg ;; +CROSS_COMPILE=*) CROSS_COMPILE=${arg#*=} ;; +LIBCC=*) LIBCC=${arg#*=} ;; +*=*) ;; +*) target=$arg ;; esac done @@ -137,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 ; } @@ -148,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*|GCC*' "$("$CC" --version 2>/dev/null)" ; then +if fnmatch '*gcc\ version*' "$("$CC" -v 2>&1)" ; then echo yes printf "checking whether to build musl-gcc wrapper... " wrapper=yes @@ -166,21 +188,23 @@ fi # -# Find the build architecture +# Find the target architecture # -printf "checking build system type... " -test -n "$build" || build=$("$CC" -dumpmachine 2>/dev/null) || build=unknown -printf "%s\n" "$build" +printf "checking target system type... " +test -n "$target" || target=$("$CC" -dumpmachine 2>/dev/null) || target=unknown +printf "%s\n" "$target" # # Convert to just ARCH # -case "$build" in +case "$target" 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\"" ;; +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 # @@ -191,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 # @@ -205,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 # @@ -245,6 +285,22 @@ tryflag CFLAGS_AUTO -Wno-unused-but-set-variable tryflag CFLAGS_AUTO -Wno-unknown-pragmas fi +# Some patched GCC builds have these defaults messed up... +tryflag CFLAGS_AUTO -fno-stack-protector +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 +printf "using compiler runtime libraries: %s\n" "$LIBCC" + printf "creating config.mak... " @@ -265,7 +321,9 @@ CC = $CC CFLAGS= $CFLAGS_AUTO $CFLAGS CFLAGS_C99FSE = $CFLAGS_C99FSE CPPFLAGS = $CPPFLAGS -LDFLAGS = $LDFLAGS +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 ="