X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=configure;h=143dc92740aa36025870fdc255a5b0a76a6fee49;hb=63c188ec42e76ff768e81f6b65b11c68fc43351e;hp=30f409fdfbe4776a8e4041ac96f1972ef92f4e20;hpb=9ca4dae5d895cf816eb1815511aba77a90f6acd7;p=musl diff --git a/configure b/configure index 30f409fd..143dc927 100755 --- a/configure +++ b/configure @@ -27,6 +27,7 @@ Optional features: --enable-optimize=... optimize listed components for speed over size [auto] --enable-debug build with debugging information [disabled] --enable-warnings build with recommended warnings flags [disabled] + --enable-visibility use global visibility options to optimize PIC [auto] --enable-gcc-wrapper build musl-gcc toolchain wrapper [auto] --disable-shared inhibit building shared library [enabled] --disable-static inhibit building static library [enabled] @@ -79,7 +80,7 @@ fi tryflag () { printf "checking whether compiler accepts %s... " "$2" echo "typedef int x;" > "$tmpc" -if $CC "$2" -c -o /dev/null "$tmpc" >/dev/null 2>&1 ; then +if $CC $2 -c -o /dev/null "$tmpc" >/dev/null 2>&1 ; then printf "yes\n" eval "$1=\"\${$1} \$2\"" eval "$1=\${$1# }" @@ -111,6 +112,7 @@ fi CFLAGS_C99FSE= CFLAGS_AUTO= CFLAGS_MEMOPS= +CFLAGS_NOSSP= LDFLAGS_AUTO= OPTIMIZE_GLOBS= prefix=/usr/local/musl @@ -123,7 +125,8 @@ target= optimize=auto debug=no warnings=no -shared=yes +visibility=auto +shared=auto static=yes wrapper=auto @@ -147,6 +150,8 @@ case "$arg" in --disable-debug|--enable-debug=no) debug=no ;; --enable-warnings|--enable-warnings=yes) warnings=yes ;; --disable-warnings|--enable-warnings=no) warnings=no ;; +--enable-visibility|--enable-visibility=yes) visibility=yes ;; +--disable-visibility|--enable-visibility=no) visibility=no ;; --enable-gcc-wrapper|--enable-gcc-wrapper=yes) wrapper=yes ;; --disable-gcc-wrapper|--enable-gcc-wrapper=no) wrapper=no ;; --enable-*|--disable-*|--with-*|--without-*|--*dir=*|--build=*) ;; @@ -204,7 +209,7 @@ fi # musl-gcc wrapper, and for critical bug detection in some gcc versions. # printf "checking whether compiler is gcc... " -if fnmatch '*gcc\ version*' "$($CC -v 2>&1)" ; then +if fnmatch '*gcc\ version*' "$(LC_ALL=C $CC -v 2>&1)" ; then cc_is_gcc=yes else cc_is_gcc=no @@ -245,11 +250,13 @@ case "$target" in # Catch these early to simplify matching for 32-bit archs mips64*|powerpc64*) fail "$0: unsupported target \"$target\"" ;; arm*) ARCH=arm ;; +aarch64*) ARCH=aarch64 ;; i?86*) ARCH=i386 ;; x86_64-x32*|x32*|x86_64*x32) ARCH=x32 ;; x86_64*) ARCH=x86_64 ;; mips*) ARCH=mips ;; microblaze*) ARCH=microblaze ;; +or1k*) ARCH=or1k ;; powerpc*) ARCH=powerpc ;; sh[1-9bel-]*|sh|superh*) ARCH=sh ;; unknown) fail "$0: unable to detect target arch; try $0 --target=..." ;; @@ -288,6 +295,13 @@ printf "yes\n" CFLAGS_C99FSE="$CFLAGS_C99FSE -D__may_alias__=" fi +# +# Check for options to disable stack protector, which needs to be +# disabled for a few early-bootstrap translation units. If not found, +# this is not an error; we assume the toolchain does not do ssp. +# +tryflag CFLAGS_NOSSP -fno-stack-protector + # # Check for options that may be needed to prevent the compiler from # generating self-referential versions of memcpy,, memmove, memcmp, @@ -298,12 +312,9 @@ fi tryflag CFLAGS_MEMOPS -fno-tree-loop-distribute-patterns # -# If debugging is explicitly enabled, don't auto-enable optimizations +# Enable debugging if requessted. # -if test "$debug" = yes ; then -CFLAGS_AUTO=-g -test "$optimize" = auto && optimize=no -fi +test "$debug" = yes && CFLAGS_AUTO=-g # # Possibly add a -O option to CFLAGS and select modules to optimize with @@ -380,10 +391,12 @@ tryflag CFLAGS_AUTO -Wa,--noexecstack # 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). +# Some build environments pass -march and -mtune options via CC, so +# check both CC and CFLAGS. # if test "$ARCH" = "i386" ; then -fnmatch '-march=*|*\ -march=*' "$CFLAGS" || tryldflag CFLAGS_AUTO -march=i486 -fnmatch '-mtune=*|*\ -mtune=*' "$CFLAGS" || tryldflag CFLAGS_AUTO -mtune=generic +fnmatch '-march=*|*\ -march=*' "$CC $CFLAGS" || tryldflag CFLAGS_AUTO -march=i486 +fnmatch '-mtune=*|*\ -mtune=*' "$CC $CFLAGS" || tryldflag CFLAGS_AUTO -mtune=generic fi # @@ -408,16 +421,43 @@ tryflag CFLAGS_AUTO -Wno-unknown-pragmas tryflag CFLAGS_AUTO -Wno-pointer-to-int-cast fi +if test "x$visibility" = xauto ; then +# This test checks toolchain support for several things: +# - the -include option +# - the attributes/pragmas used in vis.h +# - linking code that takes the address of protected symbols +printf "checking whether global visibility preinclude works... " +echo 'int (*fp)(void);' > "$tmpc" +echo 'int foo(void) { }' >> "$tmpc" +echo 'int bar(void) { fp = foo; return foo(); }' >> "$tmpc" +if $CC $CFLAGS_C99FSE $CPPFLAGS $CFLAGS \ + -DSHARED -fPIC -I./src/internal -include vis.h \ + -nostdlib -shared -Wl,-Bsymbolic-functions \ + -o /dev/null "$tmpc" >/dev/null 2>&1 ; then +visibility=yes +else +visibility=no +fi +printf "%s\n" "$visibility" +fi + +if test "x$visibility" = xyes ; then +CFLAGS_AUTO="$CFLAGS_AUTO -include vis.h" +CFLAGS_AUTO="${CFLAGS_AUTO# }" +fi + # Some patched GCC builds have these defaults messed up... -tryflag CFLAGS_AUTO -fno-stack-protector tryldflag LDFLAGS_AUTO -Wl,--hash-style=both +test "$shared" = "no" || { # Disable dynamic linking if ld is broken and can't do -Bsymbolic-functions LDFLAGS_DUMMY= tryldflag LDFLAGS_DUMMY -Wl,-Bsymbolic-functions || { +test "$shared" = "yes" && fail "$0: error: linker cannot build shared library" printf "warning: disabling dynamic linking support\n" shared=no } +} # Find compiler runtime library test -z "$LIBCC" && tryldflag LIBCC -lgcc && tryldflag LIBCC -lgcc_eh @@ -428,7 +468,7 @@ printf "using compiler runtime libraries: %s\n" "$LIBCC" # Figure out arch variants for archs with variants SUBARCH= -t="$CFLAGS_C99FSE $CPPFLAGS $CFLAGS_AUTO $CFLAGS" +t="$CFLAGS_C99FSE $CPPFLAGS $CFLAGS" if test "$ARCH" = "x86_64" ; then trycppif __ILP32__ "$t" && ARCH=x32 @@ -439,6 +479,10 @@ trycppif __ARMEB__ "$t" && SUBARCH=${SUBARCH}eb trycppif __ARM_PCS_VFP "$t" && SUBARCH=${SUBARCH}hf fi +if test "$ARCH" = "aarch64" ; then +trycppif __AARCH64EB__ "$t" && SUBARCH=${SUBARCH}_be +fi + if test "$ARCH" = "mips" ; then trycppif "_MIPSEL || __MIPSEL || __MIPSEL__" "$t" && SUBARCH=${SUBARCH}el trycppif __mips_soft_float "$t" && SUBARCH=${SUBARCH}-sf @@ -495,27 +539,6 @@ printf "no\n" fail "$0: error: unsupported long double type" fi -# -# Check for known bug in GCC 4.9.0 that results in a broken libc. -# -if test "$cc_is_gcc" = yes ; then -printf "checking for gcc constant folding bug with weak aliases... " -echo 'static int x = 0;' > "$tmpc" -echo 'extern int y __attribute__((__weak__, __alias__("x")));' >> "$tmpc" -echo 'extern int should_appear;' >> "$tmpc" -echo 'int foo() { return y ? should_appear : 0; }' >> "$tmpc" -case "$($CC $CFLAGS_C99FSE -I./arch/$ARCH -I./include \ - $CPPFLAGS $CFLAGS_AUTO $CFLAGS -S -o - "$tmpc" 2>/dev/null)" in -*should_appear*) -printf "no\n" -;; -*) -printf "yes\n" -fail "$0: error: broken compiler; try CFLAGS=-fno-toplevel-reorder" -;; -esac -fi - printf "creating config.mak... " cmdline=$(quote "$0") @@ -538,9 +561,10 @@ libdir = $libdir includedir = $includedir syslibdir = $syslibdir CC = $CC -CFLAGS= $CFLAGS_AUTO $CFLAGS +CFLAGS = $CFLAGS_AUTO $CFLAGS CFLAGS_C99FSE = $CFLAGS_C99FSE CFLAGS_MEMOPS = $CFLAGS_MEMOPS +CFLAGS_NOSSP = $CFLAGS_NOSSP CPPFLAGS = $CPPFLAGS LDFLAGS = $LDFLAGS_AUTO $LDFLAGS CROSS_COMPILE = $CROSS_COMPILE