X-Git-Url: http://nsz.repo.hu/git/?p=musl;a=blobdiff_plain;f=configure;h=96f93b24cc705bde21bd3308bbeb0efacab09d5c;hp=2969b950bd65c0989c76f32d84fcc6f16caaa900;hb=1a70198b3e5a7866bf4c62d090d8a8e28b12521a;hpb=8c0a3d9e5c169fc9d0f246ab59362b658b029ad7 diff --git a/configure b/configure index 2969b950..96f93b24 100755 --- a/configure +++ b/configure @@ -50,15 +50,14 @@ 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 +stripdir () { +while eval "fnmatch '*/' \"\${$1}\"" ; do eval "$1=\${$1%/}" ; done } 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# }" @@ -72,7 +71,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" >/dev/null 2>&1 ; then printf "yes\n" eval "$1=\"\${$1} \$2\"" eval "$1=\${$1# }" @@ -90,15 +89,15 @@ fi CFLAGS_C99FSE= CFLAGS_AUTO= LDFLAGS_AUTO= -prefix= -exec_prefix= -bindir= -libdir= -includedir= -syslibdir= +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 @@ -135,12 +134,9 @@ LIBCC=*) LIBCC=${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 @@ -149,7 +145,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 @@ -170,7 +166,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 @@ -191,7 +187,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" # @@ -203,6 +199,7 @@ i?86*) ARCH=i386 ;; x86_64*) ARCH=x86_64 ;; 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 @@ -247,6 +244,13 @@ fi 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 # @@ -262,13 +266,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 @@ -292,6 +306,8 @@ 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"