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"