X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=configure;h=7b29ae40f68599080c1f57c74ac47dd4a3793798;hb=f9e25d813860d53cd1e9b6145cc63375d2fe2529;hp=b679986f7179dafd54683018ac0a0dbd5142a0a4;hpb=df065781ee913681ba86a636a2516cb0162cab19;p=musl diff --git a/configure b/configure index b679986f..7b29ae40 100755 --- a/configure +++ b/configure @@ -24,8 +24,10 @@ System types: --host=HOST same as --target 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] @@ -44,6 +46,12 @@ exit 0 # Helper functions +quote () { +tr '\n' ' ' </dev/null 2>&1 && { echo "$1" ; return 0 ; } +$1 +EOF +printf %s\\n "$1" | sed -e "s/'/'\\\\''/g" -e "1s/^/'/" -e "\$s/\$/'/" -e "s#^'\([-[:alnum:]_,./:]*\)=\(.*\)\$#\1='\2#" +} echo () { printf "%s\n" "$*" ; } fail () { echo "$*" ; exit 1 ; } fnmatch () { eval "case \"\$2\" in $1) return 0 ;; *) return 1 ;; esac" ; } @@ -72,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 $CFLAGS_TRY $2 -c -o /dev/null "$tmpc" >/dev/null 2>&1 ; then printf "yes\n" eval "$1=\"\${$1} \$2\"" eval "$1=\${$1# }" @@ -86,7 +94,7 @@ 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 +if $CC $LDFLAGS_TRY -nostdlib -shared "$2" -o /dev/null "$tmpc" >/dev/null 2>&1 ; then printf "yes\n" eval "$1=\"\${$1} \$2\"" eval "$1=\${$1# }" @@ -103,7 +111,12 @@ fi CFLAGS_C99FSE= CFLAGS_AUTO= +CFLAGS_MEMOPS= +CFLAGS_NOSSP= +CFLAGS_TRY= LDFLAGS_AUTO= +LDFLAGS_TRY= +OPTIMIZE_GLOBS= prefix=/usr/local/musl exec_prefix='$(prefix)' bindir='$(exec_prefix)/bin' @@ -111,10 +124,13 @@ libdir='$(prefix)/lib' includedir='$(prefix)/include' syslibdir='/lib' target= +optimize=auto debug=no warnings=no -shared=yes +visibility=auto +shared=auto static=yes +wrapper=auto for arg ; do case "$arg" in @@ -129,10 +145,15 @@ case "$arg" in --disable-shared|--enable-shared=no) shared=no ;; --enable-static|--enable-static=yes) static=yes ;; --disable-static|--enable-static=no) static=no ;; +--enable-optimize) optimize=yes ;; +--enable-optimize=*) optimize=${arg#*=} ;; +--disable-optimize) optimize=no ;; --enable-debug|--enable-debug=yes) debug=yes ;; --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=*) ;; @@ -176,24 +197,51 @@ trycc ${CROSS_COMPILE}cc printf "%s\n" "$CC" test -n "$CC" || { echo "$0: cannot find a C compiler" ; exit 1 ; } +printf "checking whether C compiler works... " +echo "typedef int x;" > "$tmpc" +if output=$($CC $CPPFLAGS $CFLAGS -c -o /dev/null "$tmpc" 2>&1) ; then +printf "yes\n" +else +printf "no; compiler output follows:\n%s\n" "$output" +exit 1 +fi + # -# Only build musl-gcc wrapper if toolchain does not already target musl +# Figure out options to force errors on unknown flags. +# +tryflag CFLAGS_TRY -Werror=unknown-warning-option +tryflag CFLAGS_TRY -Werror=unused-command-line-argument +tryldflag LDFLAGS_TRY -Werror=unknown-warning-option +tryldflag LDFLAGS_TRY -Werror=unused-command-line-argument + +# +# Need to know if the compiler is gcc to decide whether to build the +# musl-gcc wrapper, and for critical bug detection in some gcc versions. # -if test -z "$wrapper" ; then printf "checking whether compiler is gcc... " -if fnmatch '*gcc\ version*' "$($CC -v 2>&1)" ; then -echo yes +if fnmatch '*gcc\ version*' "$(LC_ALL=C $CC -v 2>&1)" ; then +cc_is_gcc=yes +else +cc_is_gcc=no +fi +echo "$cc_is_gcc" + +# +# Only build musl-gcc wrapper if toolchain does not already target musl +# +if test "$wrapper" = auto ; then printf "checking whether to build musl-gcc wrapper... " +if test "$cc_is_gcc" = yes ; then wrapper=yes while read line ; do case "$line" in */ld-musl-*) wrapper=no ;; esac done < "$tmpc" </dev/null 2>&1 ; then +printf "no\n" else -tryflag CFLAGS_AUTO -Os || tryflag CFLAGS_AUTO -O2 +printf "yes\n" +CFLAGS_C99FSE="$CFLAGS_C99FSE -D__may_alias__=" fi -test "x$debug" = xyes && CFLAGS_AUTO="-g" + +# +# 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, +# and memset. Really, we should add a check to determine if this +# option is sufficient, and if not, add a macro to cripple these +# functions with volatile... +# +tryflag CFLAGS_MEMOPS -fno-tree-loop-distribute-patterns + +# +# Enable debugging if requessted. +# +test "$debug" = yes && CFLAGS_AUTO=-g + +# +# Possibly add a -O option to CFLAGS and select modules to optimize with +# -O3 based on the status of --enable-optimize and provided CFLAGS. +# +printf "checking for optimization settings... " +case "x$optimize" in +xauto) +if fnmatch '-O*|*\ -O*' "$CFLAGS_AUTO $CFLAGS" ; then +printf "using provided CFLAGS\n" ;optimize=no +else +printf "using defaults\n" ; optimize=yes +fi +;; +xsize|xnone) printf "minimize size\n" ; optimize=size ;; +xno|x) printf "disabled\n" ; optimize=no ;; +*) printf "custom\n" ;; +esac + +test "$optimize" = no || tryflag CFLAGS_AUTO -Os || tryflag CFLAGS_AUTO -O2 +test "$optimize" = yes && optimize="internal,malloc,string" + +if fnmatch 'no|size' "$optimize" ; then : +else +printf "components to be optimized for speed:" +while test "$optimize" ; do +case "$optimize" in +*,*) this=${optimize%%,*} optimize=${optimize#*,} ;; +*) this=$optimize optimize= +esac +printf " $this" +case "$this" in +*/*.c) ;; +*/*) this=$this*.c ;; +*) this=$this/*.c ;; +esac +OPTIMIZE_GLOBS="$OPTIMIZE_GLOBS $this" +done +OPTIMIZE_GLOBS=${OPTIMIZE_GLOBS# } +printf "\n" +fi + +# Always try -pipe tryflag CFLAGS_AUTO -pipe # @@ -266,23 +396,17 @@ tryflag CFLAGS_AUTO -fno-asynchronous-unwind-tables # tryflag CFLAGS_AUTO -Wa,--noexecstack -# -# Some optimization levels add bloated alignment that hurt performance -# -tryflag CFLAGS_AUTO -falign-functions=1 -tryflag CFLAGS_AUTO -falign-labels=1 -tryflag CFLAGS_AUTO -falign-loops=1 -tryflag CFLAGS_AUTO -falign-jumps=1 - # # On x86, make sure we don't have incompatible instruction set # 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 # @@ -298,25 +422,52 @@ tryflag CFLAGS_AUTO -Werror=pointer-arith if test "x$warnings" = xyes ; then tryflag CFLAGS_AUTO -Wall -tryflag CFLAGS_AUTO -Wcast-align tryflag CFLAGS_AUTO -Wno-parentheses tryflag CFLAGS_AUTO -Wno-uninitialized tryflag CFLAGS_AUTO -Wno-missing-braces tryflag CFLAGS_AUTO -Wno-unused-value tryflag CFLAGS_AUTO -Wno-unused-but-set-variable 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 @@ -327,32 +478,92 @@ 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 +fi if test "$ARCH" = "arm" ; then trycppif __ARMEB__ "$t" && SUBARCH=${SUBARCH}eb -trycppif __SOFTFP__ "$t" || SUBARCH=${SUBARCH}hf +trycppif __ARM_PCS_VFP "$t" && SUBARCH=${SUBARCH}hf fi -test "$ARCH" = "mips" && trycppif "_MIPSEL || __MIPSEL || __MIPSEL__" "$t" \ -&& SUBARCH=${SUBARCH}el +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 +fi test "$ARCH" = "microblaze" && trycppif __MICROBLAZEEL__ "$t" \ && SUBARCH=${SUBARCH}el +if test "$ARCH" = "sh" ; then +trycppif __BIG_ENDIAN__ "$t" && SUBARCH=${SUBARCH}eb +if trycppif "__SH_FPU_ANY__ || __SH4__" "$t" ; then +# Some sh configurations are broken and replace double with float +# rather than using softfloat when the fpu is present but only +# supports single precision. Reject them. +printf "checking whether compiler's double type is IEEE double... " +echo 'typedef char dblcheck[(int)sizeof(double)-5];' > "$tmpc" +if $CC $CFLAGS_C99FSE $CPPFLAGS $CFLAGS -c -o /dev/null "$tmpc" >/dev/null 2>&1 ; then +printf "yes\n" +else +printf "no\n" +fail "$0: error: compiler's floating point configuration is unsupported" +fi +else +SUBARCH=${SUBARCH}-nofpu +fi +fi + test "$SUBARCH" \ && printf "configured for %s variant: %s\n" "$ARCH" "$ARCH$SUBARCH" +case "$ARCH$SUBARCH" in +arm) ASMSUBARCH=el ;; +*) ASMSUBARCH=$SUBARCH ;; +esac + +# +# Some archs (powerpc) have different possible long double formats +# that the compiler can be configured for. The logic for whether this +# is supported is in bits/float.h; in general, it is not. We need to +# check for mismatches here or code in printf, strotd, and scanf will +# be dangerously incorrect because it depends on (1) the macros being +# correct, and (2) IEEE semantics. +# +printf "checking whether compiler's long double definition matches float.h... " +echo '#include ' > "$tmpc" +echo '#if LDBL_MANT_DIG == 53' >> "$tmpc" +echo 'typedef char ldcheck[9-(int)sizeof(long double)];' >> "$tmpc" +echo '#endif' >> "$tmpc" +if $CC $CFLAGS_C99FSE -I./arch/$ARCH -I./include $CPPFLAGS $CFLAGS \ + -c -o /dev/null "$tmpc" >/dev/null 2>&1 ; then +printf "yes\n" +else +printf "no\n" +fail "$0: error: unsupported long double type" +fi + printf "creating config.mak... " +cmdline=$(quote "$0") +for i ; do cmdline="$cmdline $(quote "$i")" ; done + exec 3>&1 1>config.mak cat << EOF -# This version of config.mak was generated by configure +# This version of config.mak was generated by: +# $cmdline # Any changes made here will be lost if configure is re-run ARCH = $ARCH SUBARCH = $SUBARCH +ASMSUBARCH = $ASMSUBARCH prefix = $prefix exec_prefix = $exec_prefix bindir = $bindir @@ -360,12 +571,15 @@ 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 LIBCC = $LIBCC +OPTIMIZE_GLOBS = $OPTIMIZE_GLOBS EOF test "x$static" = xno && echo "STATIC_LIBS =" test "x$shared" = xno && echo "SHARED_LIBS ="