github.com/afumu/libc@v0.0.6/musl/configure (about) 1 #!/bin/sh 2 3 usage () { 4 cat <<EOF 5 Usage: $0 [OPTION]... [VAR=VALUE]... [TARGET] 6 7 To assign environment variables (e.g., CC, CFLAGS...), specify them as 8 VAR=VALUE. See below for descriptions of some of the useful variables. 9 10 Defaults for the options are specified in brackets. 11 12 Configuration: 13 --srcdir=DIR source directory [detected] 14 15 Installation directories: 16 --prefix=PREFIX main installation prefix [/usr/local/musl] 17 --exec-prefix=EPREFIX installation prefix for executable files [PREFIX] 18 19 Fine tuning of the installation directories: 20 --bindir=DIR user executables [EPREFIX/bin] 21 --libdir=DIR library files for the linker [PREFIX/lib] 22 --includedir=DIR include files for the C compiler [PREFIX/include] 23 --syslibdir=DIR location for the dynamic linker [/lib] 24 25 System types: 26 --target=TARGET configure to run on target TARGET [detected] 27 --host=HOST same as --target 28 --build=BUILD build system type; used only to infer cross-compiling 29 30 Optional features: 31 --enable-optimize=... optimize listed components for speed over size [auto] 32 --enable-debug build with debugging information [disabled] 33 --enable-warnings build with recommended warnings flags [disabled] 34 --enable-wrapper=... build given musl toolchain wrapper [auto] 35 --disable-shared inhibit building shared library [enabled] 36 --disable-static inhibit building static library [enabled] 37 38 Optional packages: 39 --with-malloc=... choose malloc implementation [mallocng] 40 41 Some influential environment variables: 42 CC C compiler command [detected] 43 CFLAGS C compiler flags [-Os -pipe ...] 44 CROSS_COMPILE prefix for cross compiler and tools [none] 45 LIBCC compiler runtime library [detected] 46 47 Use these variables to override the choices made by configure. 48 49 EOF 50 exit 0 51 } 52 53 # Helper functions 54 55 quote () { 56 tr '\n' ' ' <<EOF | grep '^[-[:alnum:]_=,./:]* $' >/dev/null 2>&1 && { echo "$1" ; return 0 ; } 57 $1 58 EOF 59 printf %s\\n "$1" | sed -e "s/'/'\\\\''/g" -e "1s/^/'/" -e "\$s/\$/'/" -e "s#^'\([-[:alnum:]_,./:]*\)=\(.*\)\$#\1='\2#" 60 } 61 echo () { printf "%s\n" "$*" ; } 62 fail () { echo "$*" ; exit 1 ; } 63 fnmatch () { eval "case \"\$2\" in $1) return 0 ;; *) return 1 ;; esac" ; } 64 cmdexists () { type "$1" >/dev/null 2>&1 ; } 65 trycc () { test -z "$CC" && cmdexists "$1" && CC=$1 ; } 66 67 stripdir () { 68 while eval "fnmatch '*/' \"\${$1}\"" ; do eval "$1=\${$1%/}" ; done 69 } 70 71 trycppif () { 72 printf "checking preprocessor condition %s... " "$1" 73 echo "typedef int x;" > "$tmpc" 74 echo "#if $1" >> "$tmpc" 75 echo "#error yes" >> "$tmpc" 76 echo "#endif" >> "$tmpc" 77 if $CC $2 -c -o /dev/null "$tmpc" >/dev/null 2>&1 ; then 78 printf "false\n" 79 return 1 80 else 81 printf "true\n" 82 return 0 83 fi 84 } 85 86 tryflag () { 87 printf "checking whether compiler accepts %s... " "$2" 88 echo "typedef int x;" > "$tmpc" 89 if $CC $CFLAGS_TRY $2 -c -o /dev/null "$tmpc" >/dev/null 2>&1 ; then 90 printf "yes\n" 91 eval "$1=\"\${$1} \$2\"" 92 eval "$1=\${$1# }" 93 return 0 94 else 95 printf "no\n" 96 return 1 97 fi 98 } 99 100 tryldflag () { 101 printf "checking whether linker accepts %s... " "$2" 102 echo "typedef int x;" > "$tmpc" 103 if $CC $LDFLAGS_TRY -nostdlib -shared "$2" -o /dev/null "$tmpc" >/dev/null 2>&1 ; then 104 printf "yes\n" 105 eval "$1=\"\${$1} \$2\"" 106 eval "$1=\${$1# }" 107 return 0 108 else 109 printf "no\n" 110 return 1 111 fi 112 } 113 114 115 116 # Beginning of actual script 117 118 CFLAGS_C99FSE= 119 CFLAGS_AUTO= 120 CFLAGS_MEMOPS= 121 CFLAGS_NOSSP= 122 CFLAGS_TRY= 123 LDFLAGS_AUTO= 124 LDFLAGS_TRY= 125 OPTIMIZE_GLOBS= 126 srcdir= 127 prefix=/usr/local/musl 128 exec_prefix='$(prefix)' 129 bindir='$(exec_prefix)/bin' 130 libdir='$(prefix)/lib' 131 includedir='$(prefix)/include' 132 syslibdir='/lib' 133 tools= 134 tool_libs= 135 build= 136 target= 137 optimize=auto 138 debug=no 139 warnings=no 140 shared=auto 141 static=yes 142 wrapper=auto 143 gcc_wrapper=no 144 clang_wrapper=no 145 malloc_dir=mallocng 146 147 for arg ; do 148 case "$arg" in 149 --help|-h) usage ;; 150 --srcdir=*) srcdir=${arg#*=} ;; 151 --prefix=*) prefix=${arg#*=} ;; 152 --exec-prefix=*) exec_prefix=${arg#*=} ;; 153 --bindir=*) bindir=${arg#*=} ;; 154 --libdir=*) libdir=${arg#*=} ;; 155 --includedir=*) includedir=${arg#*=} ;; 156 --syslibdir=*) syslibdir=${arg#*=} ;; 157 --enable-shared|--enable-shared=yes) shared=yes ;; 158 --disable-shared|--enable-shared=no) shared=no ;; 159 --enable-static|--enable-static=yes) static=yes ;; 160 --disable-static|--enable-static=no) static=no ;; 161 --enable-optimize) optimize=yes ;; 162 --enable-optimize=*) optimize=${arg#*=} ;; 163 --disable-optimize) optimize=no ;; 164 --enable-debug|--enable-debug=yes) debug=yes ;; 165 --disable-debug|--enable-debug=no) debug=no ;; 166 --enable-warnings|--enable-warnings=yes) warnings=yes ;; 167 --disable-warnings|--enable-warnings=no) warnings=no ;; 168 --enable-wrapper|--enable-wrapper=yes) wrapper=detect ;; 169 --enable-wrapper=all) wrapper=yes ; gcc_wrapper=yes ; clang_wrapper=yes ;; 170 --enable-wrapper=gcc) wrapper=yes ; gcc_wrapper=yes ;; 171 --enable-wrapper=clang) wrapper=yes ; clang_wrapper=yes ;; 172 --disable-wrapper|--enable-wrapper=no) wrapper=no ;; 173 --enable-gcc-wrapper|--enable-gcc-wrapper=yes) wrapper=yes ; gcc_wrapper=yes ;; 174 --disable-gcc-wrapper|--enable-gcc-wrapper=no) wrapper=no ;; 175 --with-malloc=*) malloc_dir=${arg#*=} ;; 176 --enable-*|--disable-*|--with-*|--without-*|--*dir=*) ;; 177 --host=*|--target=*) target=${arg#*=} ;; 178 --build=*) build=${arg#*=} ;; 179 -* ) echo "$0: unknown option $arg" ;; 180 AR=*) AR=${arg#*=} ;; 181 RANLIB=*) RANLIB=${arg#*=} ;; 182 CC=*) CC=${arg#*=} ;; 183 CFLAGS=*) CFLAGS=${arg#*=} ;; 184 CPPFLAGS=*) CPPFLAGS=${arg#*=} ;; 185 LDFLAGS=*) LDFLAGS=${arg#*=} ;; 186 CROSS_COMPILE=*) CROSS_COMPILE=${arg#*=} ;; 187 LIBCC=*) LIBCC=${arg#*=} ;; 188 *=*) ;; 189 *) build=$arg ; target=$arg ;; 190 esac 191 done 192 193 for i in srcdir prefix exec_prefix bindir libdir includedir syslibdir ; do 194 stripdir $i 195 done 196 197 # 198 # Get the source dir for out-of-tree builds 199 # 200 if test -z "$srcdir" ; then 201 srcdir="${0%/configure}" 202 stripdir srcdir 203 fi 204 abs_builddir="$(pwd)" || fail "$0: cannot determine working directory" 205 abs_srcdir="$(cd $srcdir && pwd)" || fail "$0: invalid source directory $srcdir" 206 test "$abs_srcdir" = "$abs_builddir" && srcdir=. 207 test "$srcdir" != "." -a -f Makefile -a ! -h Makefile && fail "$0: Makefile already exists in the working directory" 208 209 # 210 # Get a temp filename we can use 211 # 212 i=0 213 set -C 214 while : ; do i=$(($i+1)) 215 tmpc="./conf$$-$PPID-$i.c" 216 2>|/dev/null > "$tmpc" && break 217 test "$i" -gt 50 && fail "$0: cannot create temporary file $tmpc" 218 done 219 set +C 220 trap 'rm "$tmpc"' EXIT INT QUIT TERM HUP 221 222 # 223 # Check that the requested malloc implementation exists 224 # 225 test -d "$srcdir/src/malloc/$malloc_dir" \ 226 || fail "$0: error: chosen malloc implementation '$malloc_dir' does not exist" 227 228 # 229 # Check whether we are cross-compiling, and set a default 230 # CROSS_COMPILE prefix if none was provided. 231 # 232 test "$target" && \ 233 test "$target" != "$build" && \ 234 test -z "$CROSS_COMPILE" && \ 235 CROSS_COMPILE="$target-" 236 237 # 238 # Find a C compiler to use 239 # 240 printf "checking for C compiler... " 241 trycc ${CROSS_COMPILE}gcc 242 trycc ${CROSS_COMPILE}c99 243 trycc ${CROSS_COMPILE}cc 244 printf "%s\n" "$CC" 245 test -n "$CC" || { echo "$0: cannot find a C compiler" ; exit 1 ; } 246 247 printf "checking whether C compiler works... " 248 echo "typedef int x;" > "$tmpc" 249 if output=$($CC $CPPFLAGS $CFLAGS -c -o /dev/null "$tmpc" 2>&1) ; then 250 printf "yes\n" 251 else 252 printf "no; compiler output follows:\n%s\n" "$output" 253 exit 1 254 fi 255 256 # 257 # Figure out options to force errors on unknown flags. 258 # 259 tryflag CFLAGS_TRY -Werror=unknown-warning-option 260 tryflag CFLAGS_TRY -Werror=unused-command-line-argument 261 tryflag CFLAGS_TRY -Werror=ignored-optimization-argument 262 tryldflag LDFLAGS_TRY -Werror=unknown-warning-option 263 tryldflag LDFLAGS_TRY -Werror=unused-command-line-argument 264 265 # 266 # Need to know if the compiler is gcc or clang to decide which toolchain 267 # wrappers to build. 268 # 269 printf "checking for C compiler family... " 270 cc_ver="$(LC_ALL=C $CC -v 2>&1)" 271 cc_family=unknown 272 if fnmatch '*gcc\ version*' "$cc_ver" ; then 273 cc_family=gcc 274 elif fnmatch '*clang\ version*' "$cc_ver" ; then 275 cc_family=clang 276 fi 277 echo "$cc_family" 278 279 # 280 # Figure out toolchain wrapper to build 281 # 282 if test "$wrapper" = auto -o "$wrapper" = detect ; then 283 echo "#include <stdlib.h>" > "$tmpc" 284 echo "#if ! __GLIBC__" >> "$tmpc" 285 echo "#error no" >> "$tmpc" 286 echo "#endif" >> "$tmpc" 287 printf "checking for toolchain wrapper to build... " 288 if test "$wrapper" = auto && ! $CC -c -o /dev/null "$tmpc" >/dev/null 2>&1 ; then 289 echo "none" 290 elif test "$cc_family" = gcc ; then 291 gcc_wrapper=yes 292 echo "gcc" 293 elif test "$cc_family" = clang ; then 294 clang_wrapper=yes 295 echo "clang" 296 else 297 echo "none" 298 if test "$wrapper" = detect ; then 299 fail "$0: could not find an appropriate toolchain wrapper" 300 fi 301 fi 302 fi 303 304 if test "$gcc_wrapper" = yes ; then 305 tools="$tools obj/musl-gcc" 306 tool_libs="$tool_libs lib/musl-gcc.specs" 307 fi 308 if test "$clang_wrapper" = yes ; then 309 tools="$tools obj/musl-clang obj/ld.musl-clang" 310 fi 311 312 # 313 # Find the target architecture 314 # 315 printf "checking target system type... " 316 test -n "$target" || target=$($CC -dumpmachine 2>/dev/null) || target=unknown 317 printf "%s\n" "$target" 318 319 # 320 # Convert to just ARCH 321 # 322 case "$target" in 323 # Catch these early to simplify matching for 32-bit archs 324 arm*) ARCH=arm ;; 325 aarch64*) ARCH=aarch64 ;; 326 i?86-nt32*) ARCH=nt32 ;; 327 i?86*) ARCH=i386 ;; 328 x86_64-x32*|x32*|x86_64*x32) ARCH=x32 ;; 329 x86_64-nt64*) ARCH=nt64 ;; 330 x86_64*) ARCH=x86_64 ;; 331 m68k*) ARCH=m68k ;; 332 mips64*|mipsisa64*) ARCH=mips64 ;; 333 mips*) ARCH=mips ;; 334 microblaze*) ARCH=microblaze ;; 335 or1k*) ARCH=or1k ;; 336 powerpc64*|ppc64*) ARCH=powerpc64 ;; 337 powerpc*|ppc*) ARCH=powerpc ;; 338 riscv64*) ARCH=riscv64 ;; 339 sh[1-9bel-]*|sh|superh*) ARCH=sh ;; 340 s390x*) ARCH=s390x ;; 341 unknown) fail "$0: unable to detect target arch; try $0 --target=..." ;; 342 *) fail "$0: unknown or unsupported target \"$target\"" ;; 343 esac 344 345 # 346 # Try to get a conforming C99 freestanding environment 347 # 348 tryflag CFLAGS_C99FSE -std=c99 349 tryflag CFLAGS_C99FSE -nostdinc 350 tryflag CFLAGS_C99FSE -ffreestanding \ 351 || tryflag CFLAGS_C99FSE -fno-builtin 352 tryflag CFLAGS_C99FSE -fexcess-precision=standard \ 353 || { test "$ARCH" = i386 && tryflag CFLAGS_C99FSE -ffloat-store ; } 354 tryflag CFLAGS_C99FSE -frounding-math 355 356 # 357 # We may use the may_alias attribute if __GNUC__ is defined, so 358 # if the compiler defines __GNUC__ but does not provide it, 359 # it must be defined away as part of the CFLAGS. 360 # 361 printf "checking whether compiler needs attribute((may_alias)) suppression... " 362 cat > "$tmpc" <<EOF 363 typedef int 364 #ifdef __GNUC__ 365 __attribute__((__may_alias__)) 366 #endif 367 x; 368 EOF 369 if $CC $CFLAGS_C99FSE $CPPFLAGS $CFLAGS \ 370 -c -o /dev/null "$tmpc" >/dev/null 2>&1 ; then 371 printf "no\n" 372 else 373 printf "yes\n" 374 CFLAGS_C99FSE="$CFLAGS_C99FSE -D__may_alias__=" 375 fi 376 377 # 378 # The GNU toolchain defaults to assuming unmarked files need an 379 # executable stack, potentially exposing vulnerabilities in programs 380 # linked with such object files. Fix this. 381 # 382 tryflag CFLAGS_C99FSE -Wa,--noexecstack 383 384 # 385 # Check for options to disable stack protector, which needs to be 386 # disabled for a few early-bootstrap translation units. If not found, 387 # this is not an error; we assume the toolchain does not do ssp. 388 # 389 tryflag CFLAGS_NOSSP -fno-stack-protector 390 391 # 392 # Check for options that may be needed to prevent the compiler from 393 # generating self-referential versions of memcpy,, memmove, memcmp, 394 # and memset. Really, we should add a check to determine if this 395 # option is sufficient, and if not, add a macro to cripple these 396 # functions with volatile... 397 # 398 tryflag CFLAGS_MEMOPS -fno-tree-loop-distribute-patterns 399 400 # 401 # Enable debugging if requessted. 402 # 403 test "$debug" = yes && CFLAGS_AUTO=-g 404 405 # 406 # Preprocess asm files to add extra debugging information if debug is 407 # enabled, our assembler supports the needed directives, and the 408 # preprocessing script has been written for our architecture. 409 # 410 printf "checking whether we should preprocess assembly to add debugging information... " 411 if fnmatch '-g*|*\ -g*' "$CFLAGS_AUTO $CFLAGS" && 412 test -f "tools/add-cfi.$ARCH.awk" && 413 printf ".file 1 \"srcfile.s\"\n.line 1\n.cfi_startproc\n.cfi_endproc" | $CC -g -x assembler -c -o /dev/null 2>/dev/null - 414 then 415 ADD_CFI=yes 416 else 417 ADD_CFI=no 418 fi 419 printf "%s\n" "$ADD_CFI" 420 421 # 422 # Possibly add a -O option to CFLAGS and select modules to optimize with 423 # -O3 based on the status of --enable-optimize and provided CFLAGS. 424 # 425 printf "checking for optimization settings... " 426 case "x$optimize" in 427 xauto) 428 if fnmatch '-O*|*\ -O*' "$CFLAGS_AUTO $CFLAGS" ; then 429 printf "using provided CFLAGS\n" ;optimize=no 430 else 431 printf "using defaults\n" ; optimize=yes 432 fi 433 ;; 434 xsize|xnone) printf "minimize size\n" ; optimize=size ;; 435 xno|x) printf "disabled\n" ; optimize=no ;; 436 *) printf "custom\n" ;; 437 esac 438 439 test "$optimize" = no || tryflag CFLAGS_AUTO -Os || tryflag CFLAGS_AUTO -O2 440 test "$optimize" = yes && optimize="internal,malloc,string" 441 442 if fnmatch 'no|size' "$optimize" ; then : 443 else 444 printf "components to be optimized for speed:" 445 while test "$optimize" ; do 446 case "$optimize" in 447 *,*) this=${optimize%%,*} optimize=${optimize#*,} ;; 448 *) this=$optimize optimize= 449 esac 450 printf " $this" 451 case "$this" in 452 */*.c) ;; 453 */*) this=$this*.c ;; 454 *) this=$this/*.c ;; 455 esac 456 OPTIMIZE_GLOBS="$OPTIMIZE_GLOBS $this" 457 done 458 OPTIMIZE_GLOBS=${OPTIMIZE_GLOBS# } 459 printf "\n" 460 fi 461 462 # Always try -pipe 463 tryflag CFLAGS_AUTO -pipe 464 465 # 466 # If debugging is disabled, omit frame pointer. Modern GCC does this 467 # anyway on most archs even when debugging is enabled since the frame 468 # pointer is no longer needed for debugging. 469 # 470 if fnmatch '-g*|*\ -g*' "$CFLAGS_AUTO $CFLAGS" ; then : 471 else 472 tryflag CFLAGS_AUTO -fomit-frame-pointer 473 fi 474 475 # 476 # Modern GCC wants to put DWARF tables (used for debugging and 477 # unwinding) in the loaded part of the program where they are 478 # unstrippable. These options force them back to debug sections (and 479 # cause them not to get generated at all if debugging is off). 480 # 481 tryflag CFLAGS_AUTO -fno-unwind-tables 482 tryflag CFLAGS_AUTO -fno-asynchronous-unwind-tables 483 484 # 485 # Attempt to put each function and each data object in its own 486 # section. This both allows additional size optimizations at link 487 # time and works around a dangerous class of compiler/assembler bugs 488 # whereby relative address expressions are constant-folded by the 489 # assembler even when one or more of the symbols involved is 490 # replaceable. See gas pr 18561 and gcc pr 66609, 68178, etc. 491 # 492 tryflag CFLAGS_AUTO -ffunction-sections 493 tryflag CFLAGS_AUTO -fdata-sections 494 495 # 496 # On x86, make sure we don't have incompatible instruction set 497 # extensions enabled by default. This is bad for making static binaries. 498 # We cheat and use i486 rather than i386 because i386 really does not 499 # work anyway (issues with atomic ops). 500 # Some build environments pass -march and -mtune options via CC, so 501 # check both CC and CFLAGS. 502 # 503 if test "$ARCH" = "i386" ; then 504 fnmatch '-march=*|*\ -march=*' "$CC $CFLAGS" || tryldflag CFLAGS_AUTO -march=i486 505 fnmatch '-mtune=*|*\ -mtune=*' "$CC $CFLAGS" || tryldflag CFLAGS_AUTO -mtune=generic 506 fi 507 508 # 509 # GCC defines -w as overriding any -W options, regardless of order, but 510 # clang has a bunch of annoying warnings enabled by default and needs -w 511 # to start from a clean slate. So use -w if building with clang. 512 # 513 test "$cc_family" = clang && tryflag CFLAGS_AUTO -w 514 515 # 516 # Even with -std=c99, gcc accepts some constructs which are constraint 517 # violations. We want to treat these as errors regardless of whether 518 # other purely stylistic warnings are enabled -- especially implicit 519 # function declarations, which are a dangerous programming error. 520 # 521 tryflag CFLAGS_AUTO -Werror=implicit-function-declaration 522 tryflag CFLAGS_AUTO -Werror=implicit-int 523 tryflag CFLAGS_AUTO -Werror=pointer-sign 524 tryflag CFLAGS_AUTO -Werror=pointer-arith 525 526 # 527 # GCC ignores unused arguements by default, but Clang needs this extra 528 # parameter to stop printing warnings about LDFLAGS passed during 529 # compiling stage and CFLAGS passed during linking stage. 530 # 531 test "$cc_family" = clang && tryflag CFLAGS_AUTO -Qunused-arguments 532 533 if test "x$warnings" = xyes ; then 534 tryflag CFLAGS_AUTO -Wall 535 tryflag CFLAGS_AUTO -Wno-parentheses 536 tryflag CFLAGS_AUTO -Wno-uninitialized 537 tryflag CFLAGS_AUTO -Wno-missing-braces 538 tryflag CFLAGS_AUTO -Wno-unused-value 539 tryflag CFLAGS_AUTO -Wno-unused-but-set-variable 540 tryflag CFLAGS_AUTO -Wno-unknown-pragmas 541 tryflag CFLAGS_AUTO -Wno-pointer-to-int-cast 542 fi 543 544 # Determine if the compiler produces position-independent code (PIC) 545 # by default. If so, we don't need to compile separate object files 546 # for libc.a and libc.so. 547 if trycppif __PIC__ "$CFLAGS_C99FSE $CPPFLAGS $CFLAGS" ; then 548 pic_default=yes 549 else 550 pic_default=no 551 fi 552 553 # Reduce space lost to padding for alignment purposes by sorting data 554 # objects according to their alignment reqirements. This approximates 555 # optimal packing. 556 tryldflag LDFLAGS_AUTO -Wl,--sort-section,alignment 557 tryldflag LDFLAGS_AUTO -Wl,--sort-common 558 559 # When linking shared library, drop dummy weak definitions that were 560 # replaced by strong definitions from other translation units. 561 tryldflag LDFLAGS_AUTO -Wl,--gc-sections 562 563 # Some patched GCC builds have these defaults messed up... 564 tryldflag LDFLAGS_AUTO -Wl,--hash-style=both 565 566 # Prevent linking if there are undefined symbols; if any exist, 567 # libc.so will crash at runtime during relocation processing. 568 # The common way this can happen is failure to link the compiler 569 # runtime library; implementation error is also a possibility. 570 tryldflag LDFLAGS_AUTO -Wl,--no-undefined 571 572 # Avoid exporting symbols from compiler runtime libraries. They 573 # should be hidden anyway, but some toolchains including old gcc 574 # versions built without shared library support and pcc are broken. 575 tryldflag LDFLAGS_AUTO -Wl,--exclude-libs=ALL 576 577 # Public data symbols must be interposable to allow for copy 578 # relocations, but otherwise we want to bind symbols at libc link 579 # time to eliminate startup relocations and PLT overhead. Use 580 # --dynamic-list rather than -Bsymbolic-functions for greater 581 # control over what symbols are left unbound. 582 tryldflag LDFLAGS_AUTO -Wl,--dynamic-list="$srcdir/dynamic.list" 583 584 # Find compiler runtime library 585 test -z "$LIBCC" && tryldflag LIBCC -lgcc && tryldflag LIBCC -lgcc_eh 586 test -z "$LIBCC" && tryldflag LIBCC -lcompiler_rt 587 test -z "$LIBCC" && try_libcc=`$CC -print-libgcc-file-name 2>/dev/null` \ 588 && tryldflag LIBCC "$try_libcc" 589 test -z "$LIBCC" && try_libcc=`$CC -print-file-name=libpcc.a 2>/dev/null` \ 590 && tryldflag LIBCC "$try_libcc" 591 printf "using compiler runtime libraries: %s\n" "$LIBCC" 592 593 # Figure out arch variants for archs with variants 594 SUBARCH= 595 t="$CFLAGS_C99FSE $CPPFLAGS $CFLAGS" 596 597 if test "$ARCH" = "i386" ; then 598 printf "checking whether compiler can use ebx in PIC asm constraints... " 599 cat > "$tmpc" <<EOF 600 int foo(int x) { __asm__ ( "" : "+b"(x) ); return x; } 601 EOF 602 if $CC $CFLAGS_C99FSE $CPPFLAGS $CFLAGS -fPIC \ 603 -c -o /dev/null "$tmpc" >/dev/null 2>&1 ; then 604 printf "yes\n" 605 else 606 printf "no\n" 607 CFLAGS_AUTO="$CFLAGS_AUTO -DBROKEN_EBX_ASM" 608 fi 609 fi 610 611 if test "$ARCH" = "x86_64" ; then 612 trycppif __ILP32__ "$t" && ARCH=x32 613 fi 614 615 if test "$ARCH" = "arm" ; then 616 if trycppif __thumb2__ "$t" ; then 617 tryflag CFLAGS_AUTO -mimplicit-it=always 618 tryflag CFLAGS_AUTO -Wa,-mimplicit-it=always 619 tryflag CFLAGS_AUTO -Wa,-mthumb 620 fi 621 trycppif __ARMEB__ "$t" && SUBARCH=${SUBARCH}eb 622 trycppif __ARM_PCS_VFP "$t" && SUBARCH=${SUBARCH}hf 623 # Versions of clang up until at least 3.8 have the wrong constraint codes 624 # for floating point operands to inline asm. Detect this so the affected 625 # source files can just disable the asm. 626 if test "$cc_family" = clang ; then 627 printf "checking whether clang's vfp asm constraints work... " 628 echo 'float f(float x) { __asm__("":"+t"(x)); return x; }' > "$tmpc" 629 if $CC $CFLAGS_C99FSE $CPPFLAGS $CFLAGS -c -o /dev/null "$tmpc" >/dev/null 2>&1 ; then 630 printf "yes\n" 631 else 632 printf "no\n" 633 CFLAGS_AUTO="$CFLAGS_AUTO -DBROKEN_VFP_ASM" 634 CFLAGS_AUTO="${CFLAGS_AUTO# }" 635 fi 636 fi 637 fi 638 639 if test "$ARCH" = "aarch64" ; then 640 trycppif __AARCH64EB__ "$t" && SUBARCH=${SUBARCH}_be 641 fi 642 643 if test "$ARCH" = "m68k" ; then 644 if trycppif "__HAVE_68881__" ; then : ; 645 elif trycppif "__mcffpu__" ; then SUBARCH="-fp64" 646 else SUBARCH="-sf" 647 fi 648 fi 649 650 if test "$ARCH" = "mips" ; then 651 trycppif "__mips_isa_rev >= 6" "$t" && SUBARCH=${SUBARCH}r6 652 trycppif "_MIPSEL || __MIPSEL || __MIPSEL__" "$t" && SUBARCH=${SUBARCH}el 653 trycppif __mips_soft_float "$t" && SUBARCH=${SUBARCH}-sf 654 fi 655 656 if test "$ARCH" = "mips64" ; then 657 trycppif "_MIPS_SIM != _ABI64" "$t" && ARCH=mipsn32 658 trycppif "__mips_isa_rev >= 6" "$t" && SUBARCH=${SUBARCH}r6 659 trycppif "_MIPSEL || __MIPSEL || __MIPSEL__" "$t" && SUBARCH=${SUBARCH}el 660 trycppif __mips_soft_float "$t" && SUBARCH=${SUBARCH}-sf 661 fi 662 663 if test "$ARCH" = "powerpc" ; then 664 trycppif "__NO_FPRS__ && !_SOFT_FLOAT" "$t" && fail \ 665 "$0: error: compiler's floating point configuration is unsupported" 666 trycppif _SOFT_FLOAT "$t" && SUBARCH=${SUBARCH}-sf 667 printf "checking whether compiler can use 'd' constraint in asm... " 668 echo 'double f(double x) { __asm__ ("fabs %0, %1" : "=d"(x) : "d"(x)); return x; }' > "$tmpc" 669 if $CC $CFLAGS_C99FSE $CPPFLAGS $CFLAGS -c -o /dev/null "$tmpc" >/dev/null 2>&1 ; then 670 printf "yes\n" 671 else 672 printf "no\n" 673 CFLAGS_AUTO="$CFLAGS_AUTO -DBROKEN_PPC_D_ASM" 674 CFLAGS_AUTO="${CFLAGS_AUTO# }" 675 fi 676 fi 677 678 test "$ARCH" = "microblaze" && trycppif __MICROBLAZEEL__ "$t" \ 679 && SUBARCH=${SUBARCH}el 680 681 if test "$ARCH" = "powerpc64" ; then 682 trycppif "_CALL_ELF == 2" "$t" || fail "$0: error: unsupported powerpc64 ABI" 683 trycppif __LITTLE_ENDIAN__ "$t" && SUBARCH=${SUBARCH}le 684 trycppif _SOFT_FLOAT "$t" && fail "$0: error: soft-float not supported on powerpc64" 685 fi 686 687 if test "$ARCH" = "riscv64" ; then 688 trycppif __riscv_float_abi_soft "$t" && SUBARCH=${SUBARCH}-sf 689 trycppif __riscv_float_abi_single "$t" && SUBARCH=${SUBARCH}-sp 690 fi 691 692 if test "$ARCH" = "sh" ; then 693 tryflag CFLAGS_AUTO -Wa,--isa=any 694 trycppif __BIG_ENDIAN__ "$t" && SUBARCH=${SUBARCH}eb 695 if trycppif "__SH_FPU_ANY__ || __SH4__" "$t" ; then 696 # Some sh configurations are broken and replace double with float 697 # rather than using softfloat when the fpu is present but only 698 # supports single precision. Reject them. 699 printf "checking whether compiler's double type is IEEE double... " 700 echo 'typedef char dblcheck[(int)sizeof(double)-5];' > "$tmpc" 701 if $CC $CFLAGS_C99FSE $CPPFLAGS $CFLAGS -c -o /dev/null "$tmpc" >/dev/null 2>&1 ; then 702 printf "yes\n" 703 else 704 printf "no\n" 705 fail "$0: error: compiler's floating point configuration is unsupported" 706 fi 707 else 708 SUBARCH=${SUBARCH}-nofpu 709 fi 710 if trycppif __SH_FDPIC__ "$t" ; then 711 SUBARCH=${SUBARCH}-fdpic 712 fi 713 fi 714 715 test "$SUBARCH" \ 716 && printf "configured for %s variant: %s\n" "$ARCH" "$ARCH$SUBARCH" 717 718 case "$ARCH$SUBARCH" in 719 arm) ASMSUBARCH=el ;; 720 *) ASMSUBARCH=$SUBARCH ;; 721 esac 722 723 # 724 # Some archs (powerpc) have different possible long double formats 725 # that the compiler can be configured for. The logic for whether this 726 # is supported is in bits/float.h; in general, it is not. We need to 727 # check for mismatches here or code in printf, strotd, and scanf will 728 # be dangerously incorrect because it depends on (1) the macros being 729 # correct, and (2) IEEE semantics. 730 # 731 printf "checking whether compiler's long double definition matches float.h... " 732 echo '#include <float.h>' > "$tmpc" 733 echo '#define C(m,s) (m==LDBL_MANT_DIG && s==sizeof(long double))' >> "$tmpc" 734 echo 'typedef char ldcheck[(C(53,8)||C(64,12)||C(64,16)||C(113,16))*2-1];' >> "$tmpc" 735 if $CC $CFLAGS_C99FSE \ 736 -I$srcdir/arch/$ARCH -I$srcdir/arch/generic -I$srcdir/include \ 737 $CPPFLAGS $CFLAGS -c -o /dev/null "$tmpc" >/dev/null 2>&1 ; then 738 printf "yes\n" 739 else 740 printf "no\n" 741 fail "$0: error: unsupported long double type" 742 fi 743 744 # 745 # Some build systems globally pass in broken CFLAGS like -ffast-math 746 # for all packages. On recent GCC we can detect this and error out 747 # early rather than producing a seriously-broken math library. 748 # 749 if trycppif "__FAST_MATH__" \ 750 "$CFLAGS_C99FSE $CPPFLAGS $CFLAGS" ; then 751 fail "$0: error: compiler has broken floating point; check CFLAGS" 752 fi 753 754 printf "creating config.mak... " 755 756 cmdline=$(quote "$0") 757 for i ; do cmdline="$cmdline $(quote "$i")" ; done 758 759 exec 3>&1 1>config.mak 760 761 762 cat << EOF 763 # This version of config.mak was generated by: 764 # $cmdline 765 # Any changes made here will be lost if configure is re-run 766 AR = ${AR:-\$(CROSS_COMPILE)ar} 767 RANLIB = ${RANLIB:-\$(CROSS_COMPILE)ranlib} 768 ARCH = $ARCH 769 SUBARCH = $SUBARCH 770 ASMSUBARCH = $ASMSUBARCH 771 srcdir = $srcdir 772 prefix = $prefix 773 exec_prefix = $exec_prefix 774 bindir = $bindir 775 libdir = $libdir 776 includedir = $includedir 777 syslibdir = $syslibdir 778 CC = $CC 779 CFLAGS = $CFLAGS 780 CFLAGS_AUTO = $CFLAGS_AUTO 781 CFLAGS_C99FSE = $CFLAGS_C99FSE 782 CFLAGS_MEMOPS = $CFLAGS_MEMOPS 783 CFLAGS_NOSSP = $CFLAGS_NOSSP 784 CPPFLAGS = $CPPFLAGS 785 LDFLAGS = $LDFLAGS 786 LDFLAGS_AUTO = $LDFLAGS_AUTO 787 CROSS_COMPILE = $CROSS_COMPILE 788 LIBCC = $LIBCC 789 OPTIMIZE_GLOBS = $OPTIMIZE_GLOBS 790 ALL_TOOLS = $tools 791 TOOL_LIBS = $tool_libs 792 ADD_CFI = $ADD_CFI 793 MALLOC_DIR = $malloc_dir 794 EOF 795 test "x$static" = xno && echo "STATIC_LIBS =" 796 test "x$shared" = xno && echo "SHARED_LIBS =" 797 test "x$cc_family" = xgcc && echo 'WRAPCC_GCC = $(CC)' 798 test "x$cc_family" = xclang && echo 'WRAPCC_CLANG = $(CC)' 799 test "x$pic_default" = xyes && echo 'AOBJS = $(LOBJS)' 800 exec 1>&3 3>&- 801 802 test "$srcdir" = "." || ln -sf $srcdir/Makefile . 803 804 printf "done\n"