configure raw

   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    --disable-warnings      build with recommended warnings flags [enabled]
  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=yes
 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" != "." && test -f Makefile && test ! -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 || test "$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 "$srcdir/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. Also
 512  # turn off a common on-by-default cast warning regardless of compiler.
 513  #
 514  test "$cc_family" = clang && tryflag CFLAGS_AUTO -w
 515  
 516  tryflag CFLAGS_AUTO -Wno-pointer-to-int-cast
 517  
 518  #
 519  # Even with -std=c99, gcc accepts some constructs which are constraint
 520  # violations. We want to treat these as errors regardless of whether
 521  # other purely stylistic warnings are enabled -- especially implicit
 522  # function declarations, which are a dangerous programming error.
 523  #
 524  tryflag CFLAGS_AUTO -Werror=implicit-function-declaration
 525  tryflag CFLAGS_AUTO -Werror=implicit-int
 526  tryflag CFLAGS_AUTO -Werror=pointer-sign
 527  tryflag CFLAGS_AUTO -Werror=pointer-arith
 528  tryflag CFLAGS_AUTO -Werror=int-conversion
 529  tryflag CFLAGS_AUTO -Werror=incompatible-pointer-types
 530  tryflag CFLAGS_AUTO -Werror=discarded-qualifiers
 531  tryflag CFLAGS_AUTO -Werror=discarded-array-qualifiers
 532  
 533  #
 534  # GCC ignores unused arguements by default, but Clang needs this extra
 535  # parameter to stop printing warnings about LDFLAGS passed during
 536  # compiling stage and CFLAGS passed during linking stage.
 537  #
 538  test "$cc_family" = clang && tryflag CFLAGS_AUTO -Qunused-arguments
 539  
 540  if test "x$warnings" = xyes ; then
 541  tryflag CFLAGS_AUTO -Waddress
 542  tryflag CFLAGS_AUTO -Warray-bounds
 543  tryflag CFLAGS_AUTO -Wchar-subscripts
 544  tryflag CFLAGS_AUTO -Wduplicate-decl-specifier
 545  tryflag CFLAGS_AUTO -Winit-self
 546  tryflag CFLAGS_AUTO -Wreturn-type
 547  tryflag CFLAGS_AUTO -Wsequence-point
 548  tryflag CFLAGS_AUTO -Wstrict-aliasing
 549  tryflag CFLAGS_AUTO -Wunused-function
 550  tryflag CFLAGS_AUTO -Wunused-label
 551  tryflag CFLAGS_AUTO -Wunused-variable
 552  fi
 553  
 554  # Determine if the compiler produces position-independent code (PIC)
 555  # by default. If so, we don't need to compile separate object files
 556  # for libc.a and libc.so.
 557  if trycppif __PIC__ "$CFLAGS_C99FSE $CPPFLAGS $CFLAGS" ; then
 558  pic_default=yes
 559  else
 560  pic_default=no
 561  fi
 562  
 563  # Reduce space lost to padding for alignment purposes by sorting data
 564  # objects according to their alignment reqirements. This approximates
 565  # optimal packing.
 566  tryldflag LDFLAGS_AUTO -Wl,--sort-section,alignment
 567  tryldflag LDFLAGS_AUTO -Wl,--sort-common
 568  
 569  # When linking shared library, drop dummy weak definitions that were
 570  # replaced by strong definitions from other translation units.
 571  tryldflag LDFLAGS_AUTO -Wl,--gc-sections
 572  
 573  # Some patched GCC builds have these defaults messed up...
 574  tryldflag LDFLAGS_AUTO -Wl,--hash-style=both
 575  
 576  # Prevent linking if there are undefined symbols; if any exist,
 577  # libc.so will crash at runtime during relocation processing.
 578  # The common way this can happen is failure to link the compiler
 579  # runtime library; implementation error is also a possibility.
 580  tryldflag LDFLAGS_AUTO -Wl,--no-undefined
 581  
 582  # Avoid exporting symbols from compiler runtime libraries. They
 583  # should be hidden anyway, but some toolchains including old gcc
 584  # versions built without shared library support and pcc are broken.
 585  tryldflag LDFLAGS_AUTO -Wl,--exclude-libs=ALL
 586  
 587  # Public data symbols must be interposable to allow for copy
 588  # relocations, but otherwise we want to bind symbols at libc link
 589  # time to eliminate startup relocations and PLT overhead. Use
 590  # --dynamic-list rather than -Bsymbolic-functions for greater
 591  # control over what symbols are left unbound.
 592  tryldflag LDFLAGS_AUTO -Wl,--dynamic-list="$srcdir/dynamic.list"
 593  
 594  # Find compiler runtime library
 595  test -z "$LIBCC" && tryldflag LIBCC -lgcc && tryldflag LIBCC -lgcc_eh
 596  test -z "$LIBCC" && tryldflag LIBCC -lcompiler_rt
 597  test -z "$LIBCC" && try_libcc=`$CC -print-libgcc-file-name 2>/dev/null` \
 598                   && tryldflag LIBCC "$try_libcc"
 599  test -z "$LIBCC" && try_libcc=`$CC -print-file-name=libpcc.a 2>/dev/null` \
 600                   && tryldflag LIBCC "$try_libcc"
 601  printf "using compiler runtime libraries: %s\n" "$LIBCC"
 602  
 603  # Figure out arch variants for archs with variants
 604  SUBARCH=
 605  t="$CFLAGS_C99FSE $CPPFLAGS $CFLAGS"
 606  
 607  if test "$ARCH" = "i386" ; then
 608  printf "checking whether compiler can use ebx in PIC asm constraints... "
 609  cat > "$tmpc" <<EOF
 610  int foo(int x) { __asm__ ( "" : "+b"(x) ); return x; }
 611  EOF
 612  if $CC $CFLAGS_C99FSE $CPPFLAGS $CFLAGS -fPIC \
 613    -c -o /dev/null "$tmpc" >/dev/null 2>&1 ; then
 614  printf "yes\n"
 615  else
 616  printf "no\n"
 617  CFLAGS_AUTO="$CFLAGS_AUTO -DBROKEN_EBX_ASM"
 618  fi
 619  fi
 620  
 621  if test "$ARCH" = "x86_64" ; then
 622  trycppif __ILP32__ "$t" && ARCH=x32
 623  fi
 624  
 625  if test "$ARCH" = "arm" ; then
 626  if trycppif __thumb2__ "$t" ; then
 627  tryflag CFLAGS_AUTO -mimplicit-it=always
 628  tryflag CFLAGS_AUTO -Wa,-mimplicit-it=always
 629  tryflag CFLAGS_AUTO -Wa,-mthumb
 630  fi
 631  trycppif __ARMEB__ "$t" && SUBARCH=${SUBARCH}eb
 632  trycppif __ARM_PCS_VFP "$t" && SUBARCH=${SUBARCH}hf
 633  # Versions of clang up until at least 3.8 have the wrong constraint codes
 634  # for floating point operands to inline asm. Detect this so the affected
 635  # source files can just disable the asm.
 636  if test "$cc_family" = clang ; then
 637  printf "checking whether clang's vfp asm constraints work... "
 638  echo 'float f(float x) { __asm__("":"+t"(x)); return x; }' > "$tmpc"
 639  if $CC $CFLAGS_C99FSE $CPPFLAGS $CFLAGS -c -o /dev/null "$tmpc" >/dev/null 2>&1 ; then
 640  printf "yes\n"
 641  else
 642  printf "no\n"
 643  CFLAGS_AUTO="$CFLAGS_AUTO -DBROKEN_VFP_ASM"
 644  CFLAGS_AUTO="${CFLAGS_AUTO# }"
 645  fi
 646  fi
 647  fi
 648  
 649  if test "$ARCH" = "aarch64" ; then
 650  trycppif __AARCH64EB__ "$t" && SUBARCH=${SUBARCH}_be
 651  fi
 652  
 653  if test "$ARCH" = "m68k" ; then
 654  if trycppif "__HAVE_68881__" ; then : ;
 655  elif trycppif "__mcffpu__" ; then SUBARCH="-fp64"
 656  else SUBARCH="-sf"
 657  fi
 658  fi
 659  
 660  if test "$ARCH" = "mips" ; then
 661  trycppif "__mips_isa_rev >= 6" "$t" && SUBARCH=${SUBARCH}r6
 662  trycppif "_MIPSEL || __MIPSEL || __MIPSEL__" "$t" && SUBARCH=${SUBARCH}el
 663  trycppif __mips_soft_float "$t" && SUBARCH=${SUBARCH}-sf
 664  fi
 665  
 666  if test "$ARCH" = "mips64" ; then
 667  trycppif "_MIPS_SIM != _ABI64" "$t" && ARCH=mipsn32
 668  trycppif "__mips_isa_rev >= 6" "$t" && SUBARCH=${SUBARCH}r6
 669  trycppif "_MIPSEL || __MIPSEL || __MIPSEL__" "$t" && SUBARCH=${SUBARCH}el
 670  trycppif __mips_soft_float "$t" && SUBARCH=${SUBARCH}-sf
 671  fi
 672  
 673  if test "$ARCH" = "powerpc" ; then
 674  trycppif "_SOFT_FLOAT || __NO_FPRS__" "$t" && SUBARCH=${SUBARCH}-sf
 675  printf "checking whether compiler can use 'd' constraint in asm... "
 676  echo 'double f(double x) { __asm__ ("fabs %0, %1" : "=d"(x) : "d"(x)); return x; }' > "$tmpc"
 677  if $CC $CFLAGS_C99FSE $CPPFLAGS $CFLAGS -c -o /dev/null "$tmpc" >/dev/null 2>&1 ; then
 678  printf "yes\n"
 679  else
 680  printf "no\n"
 681  CFLAGS_AUTO="$CFLAGS_AUTO -DBROKEN_PPC_D_ASM"
 682  CFLAGS_AUTO="${CFLAGS_AUTO# }"
 683  fi
 684  fi
 685  
 686  test "$ARCH" = "microblaze" && trycppif __MICROBLAZEEL__ "$t" \
 687  && SUBARCH=${SUBARCH}el
 688  
 689  if test "$ARCH" = "powerpc64" ; then
 690  trycppif "_CALL_ELF == 2" "$t" || fail "$0: error: unsupported powerpc64 ABI"
 691  trycppif __LITTLE_ENDIAN__ "$t" && SUBARCH=${SUBARCH}le
 692  trycppif _SOFT_FLOAT "$t" && fail "$0: error: soft-float not supported on powerpc64"
 693  fi
 694  
 695  if test "$ARCH" = "riscv64" ; then
 696  trycppif __riscv_float_abi_soft "$t" && SUBARCH=${SUBARCH}-sf
 697  trycppif __riscv_float_abi_single "$t" && SUBARCH=${SUBARCH}-sp
 698  fi
 699  
 700  if test "$ARCH" = "sh" ; then
 701  tryflag CFLAGS_AUTO -Wa,--isa=any
 702  trycppif __BIG_ENDIAN__ "$t" && SUBARCH=${SUBARCH}eb
 703  if trycppif "__SH_FPU_ANY__ || __SH4__" "$t" ; then
 704  # Some sh configurations are broken and replace double with float
 705  # rather than using softfloat when the fpu is present but only
 706  # supports single precision. Reject them.
 707  printf "checking whether compiler's double type is IEEE double... "
 708  echo 'typedef char dblcheck[(int)sizeof(double)-5];' > "$tmpc"
 709  if $CC $CFLAGS_C99FSE $CPPFLAGS $CFLAGS -c -o /dev/null "$tmpc" >/dev/null 2>&1 ; then
 710  printf "yes\n"
 711  else
 712  printf "no\n"
 713  fail "$0: error: compiler's floating point configuration is unsupported"
 714  fi
 715  else
 716  SUBARCH=${SUBARCH}-nofpu
 717  fi
 718  if trycppif __SH_FDPIC__ "$t" ; then
 719  SUBARCH=${SUBARCH}-fdpic
 720  fi
 721  fi
 722  
 723  test "$SUBARCH" \
 724  && printf "configured for %s variant: %s\n" "$ARCH" "$ARCH$SUBARCH"
 725  
 726  case "$ARCH$SUBARCH" in
 727  arm) ASMSUBARCH=el ;;
 728  *) ASMSUBARCH=$SUBARCH ;;
 729  esac
 730  
 731  #
 732  # Some archs (powerpc) have different possible long double formats
 733  # that the compiler can be configured for. The logic for whether this
 734  # is supported is in bits/float.h; in general, it is not. We need to
 735  # check for mismatches here or code in printf, strotd, and scanf will
 736  # be dangerously incorrect because it depends on (1) the macros being
 737  # correct, and (2) IEEE semantics.
 738  #
 739  printf "checking whether compiler's long double definition matches float.h... "
 740  echo '#include <float.h>' > "$tmpc"
 741  echo '#define C(m,s) (m==LDBL_MANT_DIG && s==sizeof(long double))' >> "$tmpc"
 742  echo 'typedef char ldcheck[(C(53,8)||C(64,12)||C(64,16)||C(113,16))*2-1];' >> "$tmpc"
 743  if $CC $CFLAGS_C99FSE \
 744    -I$srcdir/arch/$ARCH -I$srcdir/arch/generic -I$srcdir/include \
 745    $CPPFLAGS $CFLAGS -c -o /dev/null "$tmpc" >/dev/null 2>&1 ; then
 746  printf "yes\n"
 747  else
 748  printf "no\n"
 749  fail "$0: error: unsupported long double type"
 750  fi
 751  
 752  #
 753  # Some build systems globally pass in broken CFLAGS like -ffast-math
 754  # for all packages. On recent GCC we can detect this and error out
 755  # early rather than producing a seriously-broken math library.
 756  #
 757  if trycppif "__FAST_MATH__" \
 758    "$CFLAGS_C99FSE $CPPFLAGS $CFLAGS" ; then
 759  fail "$0: error: compiler has broken floating point; check CFLAGS"
 760  fi
 761  
 762  printf "creating config.mak... "
 763  
 764  cmdline=$(quote "$0")
 765  for i ; do cmdline="$cmdline $(quote "$i")" ; done
 766  
 767  exec 3>&1 1>config.mak
 768  
 769  
 770  cat << EOF
 771  # This version of config.mak was generated by:
 772  # $cmdline
 773  # Any changes made here will be lost if configure is re-run
 774  AR = ${AR:-\$(CROSS_COMPILE)ar}
 775  RANLIB = ${RANLIB:-\$(CROSS_COMPILE)ranlib}
 776  ARCH = $ARCH
 777  SUBARCH = $SUBARCH
 778  ASMSUBARCH = $ASMSUBARCH
 779  srcdir = $srcdir
 780  prefix = $prefix
 781  exec_prefix = $exec_prefix
 782  bindir = $bindir
 783  libdir = $libdir
 784  includedir = $includedir
 785  syslibdir = $syslibdir
 786  CC = $CC
 787  CFLAGS = $CFLAGS
 788  CFLAGS_AUTO = $CFLAGS_AUTO
 789  CFLAGS_C99FSE = $CFLAGS_C99FSE
 790  CFLAGS_MEMOPS = $CFLAGS_MEMOPS
 791  CFLAGS_NOSSP = $CFLAGS_NOSSP
 792  CPPFLAGS = $CPPFLAGS
 793  LDFLAGS = $LDFLAGS
 794  LDFLAGS_AUTO = $LDFLAGS_AUTO
 795  CROSS_COMPILE = $CROSS_COMPILE
 796  LIBCC = $LIBCC
 797  OPTIMIZE_GLOBS = $OPTIMIZE_GLOBS
 798  ALL_TOOLS = $tools
 799  TOOL_LIBS = $tool_libs
 800  ADD_CFI = $ADD_CFI
 801  MALLOC_DIR = $malloc_dir
 802  EOF
 803  test "x$static" = xno && echo "STATIC_LIBS ="
 804  test "x$shared" = xno && echo "SHARED_LIBS ="
 805  test "x$cc_family" = xgcc && echo 'WRAPCC_GCC = $(CC)'
 806  test "x$cc_family" = xclang && echo 'WRAPCC_CLANG = $(CC)'
 807  test "x$pic_default" = xyes && echo 'AOBJS = $(LOBJS)'
 808  exec 1>&3 3>&-
 809  
 810  test "$srcdir" = "." || ln -sf $srcdir/Makefile .
 811  
 812  printf "done\n"
 813