X-Git-Url: http://nsz.repo.hu/git/?p=musl;a=blobdiff_plain;f=configure;h=042c41bd28790d98837748644d73de89a0143a76;hp=4ef6ccceaf888be5b1d29fb3176d7b1f12326b0e;hb=3e7f186ea18d7362e3e117f6e848b5514d8266d1;hpb=b4ccc3c1361ca611d6590dd4af288fb9fa6a843b diff --git a/configure b/configure index 4ef6ccce..042c41bd 100755 --- a/configure +++ b/configure @@ -2,7 +2,7 @@ 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 +stripdir () { +while eval "fnmatch '*/' \"\${$1}\"" ; do eval "$1=\${$1%/}" ; done +} + +trycppif () { +printf "checking preprocessor condition %s... " "$1" +echo "#if $1" > "$tmpc" +echo "#error yes" >> "$tmpc" +echo "#endif" >> "$tmpc" +if $CC $2 -c -o /dev/null "$tmpc" >/dev/null 2>&1 ; then +printf "false\n" +return 1 +else +printf "true\n" +return 0 +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" >/dev/null 2>&1 ; then +printf "yes\n" +eval "$1=\"\${$1} \$2\"" +eval "$1=\${$1# }" +return 0 +else +printf "no\n" +return 1 +fi +} + +tryldflag () { +printf "checking whether linker accepts %s... " "$2" +echo "typedef int x;" > "$tmpc" +if $CC -nostdlib -shared "$2" -o /dev/null "$tmpc" >/dev/null 2>&1 ; then printf "yes\n" eval "$1=\"\${$1} \$2\"" eval "$1=\${$1# }" @@ -71,15 +100,18 @@ fi # Beginning of actual script -prefix= -exec_prefix= -bindir= -libdir= -includedir= -syslibdir= -build= +CFLAGS_C99FSE= +CFLAGS_AUTO= +LDFLAGS_AUTO= +prefix=/usr/local/musl +exec_prefix='$(prefix)' +bindir='$(exec_prefix)/bin' +libdir='$(prefix)/lib' +includedir='$(prefix)/include' +syslibdir='/lib' +target= debug=no -warnings= +warnings=no shared=yes static=yes @@ -102,23 +134,23 @@ 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 -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' +for i in prefix exec_prefix bindir libdir includedir syslibdir ; do +stripdir $i +done # # Get a temp filename we can use @@ -127,7 +159,7 @@ i=0 set -C while : ; do i=$(($i+1)) tmpc="./conf$$-$PPID-$i.c" -2>/dev/null > "$tmpc" && break +2>|/dev/null > "$tmpc" && break test "$i" -gt 50 && fail "$0: cannot create temporary file $tmpc" done set +C @@ -137,9 +169,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 +180,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 +198,24 @@ 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 ;; +powerpc-*) ARCH=powerpc ;; +unknown) fail "$0: unable to detect target arch; try $0 --target=..." ;; +*) fail "$0: unknown or unsupported target \"$target\"" ;; esac # @@ -191,7 +226,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 +240,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 # @@ -229,13 +280,23 @@ 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 +# +# Even with -std=c99, gcc accepts some constructs which are constraint +# violations. We want to treat these as errors regardless of whether +# other purely stylistic warnings are enabled -- especially implicit +# function declarations, which are a dangerous programming error. +# +tryflag CFLAGS_AUTO -Werror=implicit-function-declaration +tryflag CFLAGS_AUTO -Werror=implicit-int +tryflag CFLAGS_AUTO -Werror=pointer-sign +tryflag CFLAGS_AUTO -Werror=pointer-arith + 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 @@ -245,6 +306,41 @@ 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 +test -z "$LIBCC" && try_libcc=`$CC -print-file-name=libpcc.a 2>/dev/null` \ + && tryldflag LIBCC "$try_libcc" +printf "using compiler runtime libraries: %s\n" "$LIBCC" + +# Figure out arch variants for archs with variants +SUBARCH= +t="$CFLAGS_C99FSE $CPPFLAGS $CFLAGS_AUTO $CFLAGS" + +if test "$ARCH" = "arm" ; then +trycppif __ARMEB__ "$t" && SUBARCH=${SUBARCH}eb +trycppif __SOFTFP__ "$t" || SUBARCH=${SUBARCH}hf +fi + +test "$ARCH" = "mips" && trycppif "_MIPSEL || __MIPSEL || __MIPSEL__" "$t" \ +&& SUBARCH=${SUBARCH}el + +test "$ARCH" = "microblaze" && trycppif __MICROBLAZEEL__ "$t" \ +&& SUBARCH=${SUBARCH}el + +test "$SUBARCH" \ +&& printf "configured for %s variant: %s\n" "$ARCH" "$ARCH$SUBARCH" printf "creating config.mak... " @@ -255,6 +351,7 @@ 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 +SUBARCH = $SUBARCH prefix = $prefix exec_prefix = $exec_prefix bindir = $bindir @@ -265,7 +362,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 ="