| Rich Felker | 64d2f8e | 2012-05-04 23:24:51 -0400 | [diff] [blame] | 1 | #!/bin/sh | 
 | 2 |  | 
 | 3 | usage () { | 
 | 4 | cat <<EOF | 
| Rich Felker | 278883d | 2012-06-03 16:22:13 -0400 | [diff] [blame] | 5 | Usage: $0 [OPTION]... [VAR=VALUE]... [TARGET] | 
| Rich Felker | 64d2f8e | 2012-05-04 23:24:51 -0400 | [diff] [blame] | 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 | Installation directories: | 
 | 13 |   --prefix=PREFIX         main installation prefix [/usr/local/musl] | 
 | 14 |   --exec-prefix=EPREFIX   installation prefix for executable files [PREFIX] | 
 | 15 |  | 
 | 16 | Fine tuning of the installation directories: | 
 | 17 |   --bindir=DIR            user executables [EPREFIX/bin] | 
 | 18 |   --libdir=DIR            library files for the linker [PREFIX/lib] | 
 | 19 |   --includedir=DIR        include files for the C compiler [PREFIX/include] | 
 | 20 |   --syslibdir=DIR         location for the dynamic linker [/lib] | 
 | 21 |  | 
 | 22 | System types: | 
 | 23 |   --target=TARGET         configure to run on target TARGET [detected] | 
| Rich Felker | 278883d | 2012-06-03 16:22:13 -0400 | [diff] [blame] | 24 |   --host=HOST             same as --target | 
| Rich Felker | 64d2f8e | 2012-05-04 23:24:51 -0400 | [diff] [blame] | 25 |  | 
 | 26 | Optional features: | 
| Rich Felker | a80847d | 2013-07-22 21:22:04 -0400 | [diff] [blame] | 27 |   --enable-optimize=...   optimize listed components for speed over size [auto] | 
| Rich Felker | 64d2f8e | 2012-05-04 23:24:51 -0400 | [diff] [blame] | 28 |   --enable-debug          build with debugging information [disabled] | 
 | 29 |   --enable-warnings       build with recommended warnings flags [disabled] | 
 | 30 |   --enable-gcc-wrapper    build musl-gcc toolchain wrapper [auto] | 
 | 31 |   --disable-shared        inhibit building shared library [enabled] | 
 | 32 |   --disable-static        inhibit building static library [enabled] | 
 | 33 |  | 
 | 34 | Some influential environment variables: | 
 | 35 |   CC                      C compiler command [detected] | 
 | 36 |   CFLAGS                  C compiler flags [-Os -pipe ...] | 
| Rich Felker | 94e920d | 2012-08-14 22:50:16 -0400 | [diff] [blame] | 37 |   CROSS_COMPILE           prefix for cross compiler and tools [none] | 
| Rich Felker | 2c1cd23 | 2012-09-10 15:30:52 -0400 | [diff] [blame] | 38 |   LIBCC                   compiler runtime library [detected] | 
| Rich Felker | 64d2f8e | 2012-05-04 23:24:51 -0400 | [diff] [blame] | 39 |  | 
 | 40 | Use these variables to override the choices made by configure. | 
 | 41 |  | 
 | 42 | EOF | 
 | 43 | exit 0 | 
 | 44 | } | 
 | 45 |  | 
 | 46 | # Helper functions | 
 | 47 |  | 
| Rich Felker | 453f462 | 2013-08-16 18:19:47 -0400 | [diff] [blame] | 48 | quote () { | 
 | 49 | tr '\n' ' ' <<EOF | grep '^[-[:alnum:]_=,./:]* $' >/dev/null 2>&1 && { echo "$1" ; return 0 ; } | 
 | 50 | $1 | 
 | 51 | EOF | 
| Rich Felker | e449974 | 2013-08-20 13:51:46 -0400 | [diff] [blame] | 52 | printf %s\\n "$1" | sed -e "s/'/'\\\\''/g" -e "1s/^/'/" -e "\$s/\$/'/" -e "s#^'\([-[:alnum:]_,./:]*\)=\(.*\)\$#\1='\2#" | 
| Rich Felker | 453f462 | 2013-08-16 18:19:47 -0400 | [diff] [blame] | 53 | } | 
| Rich Felker | 64d2f8e | 2012-05-04 23:24:51 -0400 | [diff] [blame] | 54 | echo () { printf "%s\n" "$*" ; } | 
 | 55 | fail () { echo "$*" ; exit 1 ; } | 
 | 56 | fnmatch () { eval "case \"\$2\" in $1) return 0 ;; *) return 1 ;; esac" ; } | 
 | 57 | cmdexists () { type "$1" >/dev/null 2>&1 ; } | 
 | 58 | trycc () { test -z "$CC" && cmdexists "$1" && CC=$1 ; } | 
 | 59 |  | 
| Rich Felker | 3d9e3a3 | 2012-11-08 17:20:50 -0500 | [diff] [blame] | 60 | stripdir () { | 
 | 61 | while eval "fnmatch '*/' \"\${$1}\"" ; do eval "$1=\${$1%/}" ; done | 
| Rich Felker | 64d2f8e | 2012-05-04 23:24:51 -0400 | [diff] [blame] | 62 | } | 
 | 63 |  | 
| Rich Felker | 3e7f186 | 2013-07-18 20:30:58 -0400 | [diff] [blame] | 64 | trycppif () { | 
 | 65 | printf "checking preprocessor condition %s... " "$1" | 
| Rich Felker | df06578 | 2013-07-18 20:37:19 -0400 | [diff] [blame] | 66 | echo "typedef int x;" > "$tmpc" | 
 | 67 | echo "#if $1" >> "$tmpc" | 
| Rich Felker | 3e7f186 | 2013-07-18 20:30:58 -0400 | [diff] [blame] | 68 | echo "#error yes" >> "$tmpc" | 
 | 69 | echo "#endif" >> "$tmpc" | 
 | 70 | if $CC $2 -c -o /dev/null "$tmpc" >/dev/null 2>&1 ; then | 
 | 71 | printf "false\n" | 
 | 72 | return 1 | 
 | 73 | else | 
 | 74 | printf "true\n" | 
 | 75 | return 0 | 
 | 76 | fi | 
 | 77 | } | 
 | 78 |  | 
| Rich Felker | 64d2f8e | 2012-05-04 23:24:51 -0400 | [diff] [blame] | 79 | tryflag () { | 
 | 80 | printf "checking whether compiler accepts %s... " "$2" | 
 | 81 | echo "typedef int x;" > "$tmpc" | 
| Rich Felker | cd31a1f | 2012-10-26 18:15:51 -0400 | [diff] [blame] | 82 | if $CC "$2" -c -o /dev/null "$tmpc" >/dev/null 2>&1 ; then | 
| Rich Felker | 64d2f8e | 2012-05-04 23:24:51 -0400 | [diff] [blame] | 83 | printf "yes\n" | 
 | 84 | eval "$1=\"\${$1} \$2\"" | 
 | 85 | eval "$1=\${$1# }" | 
 | 86 | return 0 | 
 | 87 | else | 
 | 88 | printf "no\n" | 
 | 89 | return 1 | 
 | 90 | fi | 
 | 91 | } | 
 | 92 |  | 
| Rich Felker | 08f70a3 | 2012-06-06 20:45:52 -0400 | [diff] [blame] | 93 | tryldflag () { | 
 | 94 | printf "checking whether linker accepts %s... " "$2" | 
| Rich Felker | 67a0383 | 2012-06-07 00:23:58 -0400 | [diff] [blame] | 95 | echo "typedef int x;" > "$tmpc" | 
| Rich Felker | cd31a1f | 2012-10-26 18:15:51 -0400 | [diff] [blame] | 96 | if $CC -nostdlib -shared "$2" -o /dev/null "$tmpc" >/dev/null 2>&1 ; then | 
| Rich Felker | 08f70a3 | 2012-06-06 20:45:52 -0400 | [diff] [blame] | 97 | printf "yes\n" | 
 | 98 | eval "$1=\"\${$1} \$2\"" | 
 | 99 | eval "$1=\${$1# }" | 
 | 100 | return 0 | 
 | 101 | else | 
 | 102 | printf "no\n" | 
 | 103 | return 1 | 
 | 104 | fi | 
 | 105 | } | 
 | 106 |  | 
| Rich Felker | 64d2f8e | 2012-05-04 23:24:51 -0400 | [diff] [blame] | 107 |  | 
 | 108 |  | 
 | 109 | # Beginning of actual script | 
 | 110 |  | 
| Rich Felker | 08f70a3 | 2012-06-06 20:45:52 -0400 | [diff] [blame] | 111 | CFLAGS_C99FSE= | 
 | 112 | CFLAGS_AUTO= | 
| Rich Felker | 4a1f55e | 2013-08-01 17:12:23 -0400 | [diff] [blame] | 113 | CFLAGS_MEMOPS= | 
| Rich Felker | 08f70a3 | 2012-06-06 20:45:52 -0400 | [diff] [blame] | 114 | LDFLAGS_AUTO= | 
| Rich Felker | a80847d | 2013-07-22 21:22:04 -0400 | [diff] [blame] | 115 | OPTIMIZE_GLOBS= | 
| Rich Felker | 3d9e3a3 | 2012-11-08 17:20:50 -0500 | [diff] [blame] | 116 | prefix=/usr/local/musl | 
 | 117 | exec_prefix='$(prefix)' | 
 | 118 | bindir='$(exec_prefix)/bin' | 
 | 119 | libdir='$(prefix)/lib' | 
 | 120 | includedir='$(prefix)/include' | 
 | 121 | syslibdir='/lib' | 
| Rich Felker | 278883d | 2012-06-03 16:22:13 -0400 | [diff] [blame] | 122 | target= | 
| Rich Felker | a80847d | 2013-07-22 21:22:04 -0400 | [diff] [blame] | 123 | optimize=auto | 
| Rich Felker | 64d2f8e | 2012-05-04 23:24:51 -0400 | [diff] [blame] | 124 | debug=no | 
| Rich Felker | 3d9e3a3 | 2012-11-08 17:20:50 -0500 | [diff] [blame] | 125 | warnings=no | 
| Rich Felker | d79b277 | 2014-06-10 12:11:12 -0400 | [diff] [blame^] | 126 | shared=auto | 
| Rich Felker | 64d2f8e | 2012-05-04 23:24:51 -0400 | [diff] [blame] | 127 | static=yes | 
| Rich Felker | 9ca4dae | 2014-05-19 10:33:28 -0400 | [diff] [blame] | 128 | wrapper=auto | 
| Rich Felker | 64d2f8e | 2012-05-04 23:24:51 -0400 | [diff] [blame] | 129 |  | 
 | 130 | for arg ; do | 
 | 131 | case "$arg" in | 
 | 132 | --help) usage ;; | 
 | 133 | --prefix=*) prefix=${arg#*=} ;; | 
 | 134 | --exec-prefix=*) exec_prefix=${arg#*=} ;; | 
 | 135 | --bindir=*) bindir=${arg#*=} ;; | 
 | 136 | --libdir=*) libdir=${arg#*=} ;; | 
 | 137 | --includedir=*) includedir=${arg#*=} ;; | 
 | 138 | --syslibdir=*) syslibdir=${arg#*=} ;; | 
 | 139 | --enable-shared|--enable-shared=yes) shared=yes ;; | 
 | 140 | --disable-shared|--enable-shared=no) shared=no ;; | 
 | 141 | --enable-static|--enable-static=yes) static=yes ;; | 
 | 142 | --disable-static|--enable-static=no) static=no ;; | 
| Rich Felker | a80847d | 2013-07-22 21:22:04 -0400 | [diff] [blame] | 143 | --enable-optimize) optimize=yes ;; | 
 | 144 | --enable-optimize=*) optimize=${arg#*=} ;; | 
 | 145 | --disable-optimize) optimize=no ;; | 
| Rich Felker | 64d2f8e | 2012-05-04 23:24:51 -0400 | [diff] [blame] | 146 | --enable-debug|--enable-debug=yes) debug=yes ;; | 
 | 147 | --disable-debug|--enable-debug=no) debug=no ;; | 
 | 148 | --enable-warnings|--enable-warnings=yes) warnings=yes ;; | 
 | 149 | --disable-warnings|--enable-warnings=no) warnings=no ;; | 
 | 150 | --enable-gcc-wrapper|--enable-gcc-wrapper=yes) wrapper=yes ;; | 
 | 151 | --disable-gcc-wrapper|--enable-gcc-wrapper=no) wrapper=no ;; | 
| Rich Felker | 278883d | 2012-06-03 16:22:13 -0400 | [diff] [blame] | 152 | --enable-*|--disable-*|--with-*|--without-*|--*dir=*|--build=*) ;; | 
 | 153 | --host=*|--target=*) target=${arg#*=} ;; | 
| Rich Felker | 64d2f8e | 2012-05-04 23:24:51 -0400 | [diff] [blame] | 154 | -* ) echo "$0: unknown option $arg" ;; | 
 | 155 | CC=*) CC=${arg#*=} ;; | 
 | 156 | CFLAGS=*) CFLAGS=${arg#*=} ;; | 
 | 157 | CPPFLAGS=*) CPPFLAGS=${arg#*=} ;; | 
 | 158 | LDFLAGS=*) LDFLAGS=${arg#*=} ;; | 
| Rich Felker | 94e920d | 2012-08-14 22:50:16 -0400 | [diff] [blame] | 159 | CROSS_COMPILE=*) CROSS_COMPILE=${arg#*=} ;; | 
| Rich Felker | 2c1cd23 | 2012-09-10 15:30:52 -0400 | [diff] [blame] | 160 | LIBCC=*) LIBCC=${arg#*=} ;; | 
| Rich Felker | 278883d | 2012-06-03 16:22:13 -0400 | [diff] [blame] | 161 | *=*) ;; | 
 | 162 | *) target=$arg ;; | 
| Rich Felker | 64d2f8e | 2012-05-04 23:24:51 -0400 | [diff] [blame] | 163 | esac | 
 | 164 | done | 
 | 165 |  | 
| Rich Felker | 3d9e3a3 | 2012-11-08 17:20:50 -0500 | [diff] [blame] | 166 | for i in prefix exec_prefix bindir libdir includedir syslibdir ; do | 
 | 167 | stripdir $i | 
 | 168 | done | 
| Rich Felker | 64d2f8e | 2012-05-04 23:24:51 -0400 | [diff] [blame] | 169 |  | 
 | 170 | # | 
 | 171 | # Get a temp filename we can use | 
 | 172 | # | 
 | 173 | i=0 | 
 | 174 | set -C | 
 | 175 | while : ; do i=$(($i+1)) | 
 | 176 | tmpc="./conf$$-$PPID-$i.c" | 
| Rich Felker | 6c0cba8 | 2012-11-18 23:15:47 -0500 | [diff] [blame] | 177 | 2>|/dev/null > "$tmpc" && break | 
| Rich Felker | 64d2f8e | 2012-05-04 23:24:51 -0400 | [diff] [blame] | 178 | test "$i" -gt 50 && fail "$0: cannot create temporary file $tmpc" | 
 | 179 | done | 
 | 180 | set +C | 
 | 181 | trap 'rm "$tmpc"' EXIT INT QUIT TERM HUP | 
 | 182 |  | 
 | 183 | # | 
 | 184 | # Find a C compiler to use | 
 | 185 | # | 
 | 186 | printf "checking for C compiler... " | 
| Rich Felker | 94e920d | 2012-08-14 22:50:16 -0400 | [diff] [blame] | 187 | trycc ${CROSS_COMPILE}gcc | 
 | 188 | trycc ${CROSS_COMPILE}c99 | 
 | 189 | trycc ${CROSS_COMPILE}cc | 
| Rich Felker | 64d2f8e | 2012-05-04 23:24:51 -0400 | [diff] [blame] | 190 | printf "%s\n" "$CC" | 
 | 191 | test -n "$CC" || { echo "$0: cannot find a C compiler" ; exit 1 ; } | 
 | 192 |  | 
| Rich Felker | 8945667 | 2014-05-12 14:22:57 -0400 | [diff] [blame] | 193 | printf "checking whether C compiler works... " | 
 | 194 | echo "typedef int x;" > "$tmpc" | 
 | 195 | if output=$($CC $CPPFLAGS $CFLAGS -c -o /dev/null "$tmpc" 2>&1) ; then | 
 | 196 | printf "yes\n" | 
 | 197 | else | 
 | 198 | printf "no; compiler output follows:\n%s\n" "$output" | 
 | 199 | exit 1 | 
 | 200 | fi | 
 | 201 |  | 
| Rich Felker | 64d2f8e | 2012-05-04 23:24:51 -0400 | [diff] [blame] | 202 | # | 
| Rich Felker | 9ca4dae | 2014-05-19 10:33:28 -0400 | [diff] [blame] | 203 | # Need to know if the compiler is gcc to decide whether to build the | 
 | 204 | # musl-gcc wrapper, and for critical bug detection in some gcc versions. | 
| Rich Felker | 64d2f8e | 2012-05-04 23:24:51 -0400 | [diff] [blame] | 205 | # | 
| Rich Felker | 64d2f8e | 2012-05-04 23:24:51 -0400 | [diff] [blame] | 206 | printf "checking whether compiler is gcc... " | 
| Rich Felker | 01e5a1b | 2012-10-18 23:02:53 -0400 | [diff] [blame] | 207 | if fnmatch '*gcc\ version*' "$($CC -v 2>&1)" ; then | 
| Rich Felker | 9ca4dae | 2014-05-19 10:33:28 -0400 | [diff] [blame] | 208 | cc_is_gcc=yes | 
 | 209 | else | 
 | 210 | cc_is_gcc=no | 
 | 211 | fi | 
 | 212 | echo "$cc_is_gcc" | 
 | 213 |  | 
 | 214 | # | 
 | 215 | # Only build musl-gcc wrapper if toolchain does not already target musl | 
 | 216 | # | 
 | 217 | if test "$wrapper" = auto ; then | 
| Rich Felker | 64d2f8e | 2012-05-04 23:24:51 -0400 | [diff] [blame] | 218 | printf "checking whether to build musl-gcc wrapper... " | 
| Rich Felker | 9ca4dae | 2014-05-19 10:33:28 -0400 | [diff] [blame] | 219 | if test "$cc_is_gcc" = yes ; then | 
| Rich Felker | 64d2f8e | 2012-05-04 23:24:51 -0400 | [diff] [blame] | 220 | wrapper=yes | 
 | 221 | while read line ; do | 
 | 222 | case "$line" in */ld-musl-*) wrapper=no ;; esac | 
 | 223 | done <<EOF | 
 | 224 | $($CC -dumpspecs) | 
 | 225 | EOF | 
| Rich Felker | 64d2f8e | 2012-05-04 23:24:51 -0400 | [diff] [blame] | 226 | else | 
| Rich Felker | 9ca4dae | 2014-05-19 10:33:28 -0400 | [diff] [blame] | 227 | wrapper=no | 
| Rich Felker | 64d2f8e | 2012-05-04 23:24:51 -0400 | [diff] [blame] | 228 | fi | 
| Rich Felker | 9ca4dae | 2014-05-19 10:33:28 -0400 | [diff] [blame] | 229 | echo "$wrapper" | 
| Rich Felker | 64d2f8e | 2012-05-04 23:24:51 -0400 | [diff] [blame] | 230 | fi | 
 | 231 |  | 
 | 232 |  | 
 | 233 |  | 
 | 234 | # | 
| Rich Felker | 278883d | 2012-06-03 16:22:13 -0400 | [diff] [blame] | 235 | # Find the target architecture | 
| Rich Felker | 64d2f8e | 2012-05-04 23:24:51 -0400 | [diff] [blame] | 236 | # | 
| Rich Felker | 278883d | 2012-06-03 16:22:13 -0400 | [diff] [blame] | 237 | printf "checking target system type... " | 
| Rich Felker | 01e5a1b | 2012-10-18 23:02:53 -0400 | [diff] [blame] | 238 | test -n "$target" || target=$($CC -dumpmachine 2>/dev/null) || target=unknown | 
| Rich Felker | 278883d | 2012-06-03 16:22:13 -0400 | [diff] [blame] | 239 | printf "%s\n" "$target" | 
| Rich Felker | 64d2f8e | 2012-05-04 23:24:51 -0400 | [diff] [blame] | 240 |  | 
 | 241 | # | 
 | 242 | # Convert to just ARCH | 
 | 243 | # | 
| Rich Felker | 278883d | 2012-06-03 16:22:13 -0400 | [diff] [blame] | 244 | case "$target" in | 
| Rich Felker | 0b8f0c5 | 2014-02-28 13:12:40 -0500 | [diff] [blame] | 245 | # Catch these early to simplify matching for 32-bit archs | 
 | 246 | mips64*|powerpc64*) fail "$0: unsupported target \"$target\"" ;; | 
| Rich Felker | 64d2f8e | 2012-05-04 23:24:51 -0400 | [diff] [blame] | 247 | arm*) ARCH=arm ;; | 
 | 248 | i?86*) ARCH=i386 ;; | 
| Rich Felker | f162c06 | 2014-03-17 17:38:22 -0400 | [diff] [blame] | 249 | x86_64-x32*|x32*|x86_64*x32) ARCH=x32 ;; | 
| Rich Felker | 64d2f8e | 2012-05-04 23:24:51 -0400 | [diff] [blame] | 250 | x86_64*) ARCH=x86_64 ;; | 
| Rich Felker | 0b8f0c5 | 2014-02-28 13:12:40 -0500 | [diff] [blame] | 251 | mips*) ARCH=mips ;; | 
 | 252 | microblaze*) ARCH=microblaze ;; | 
 | 253 | powerpc*) ARCH=powerpc ;; | 
 | 254 | sh[1-9bel-]*|sh|superh*) ARCH=sh ;; | 
| Rich Felker | 278883d | 2012-06-03 16:22:13 -0400 | [diff] [blame] | 255 | unknown) fail "$0: unable to detect target arch; try $0 --target=..." ;; | 
 | 256 | *) fail "$0: unknown or unsupported target \"$target\"" ;; | 
| Rich Felker | 64d2f8e | 2012-05-04 23:24:51 -0400 | [diff] [blame] | 257 | esac | 
 | 258 |  | 
 | 259 | # | 
 | 260 | # Try to get a conforming C99 freestanding environment | 
 | 261 | # | 
 | 262 | tryflag CFLAGS_C99FSE -std=c99 | 
 | 263 | tryflag CFLAGS_C99FSE -nostdinc | 
 | 264 | tryflag CFLAGS_C99FSE -ffreestanding \ | 
 | 265 | || tryflag CFLAGS_C99FSE -fno-builtin | 
 | 266 | tryflag CFLAGS_C99FSE -fexcess-precision=standard \ | 
| Rich Felker | 2121b8a | 2012-07-03 23:53:05 -0400 | [diff] [blame] | 267 | || { test "$ARCH" = i386 && tryflag CFLAGS_C99FSE -ffloat-store ; } | 
| Rich Felker | b4ccc3c | 2012-05-05 17:18:31 -0400 | [diff] [blame] | 268 | tryflag CFLAGS_C99FSE -frounding-math | 
| Rich Felker | 64d2f8e | 2012-05-04 23:24:51 -0400 | [diff] [blame] | 269 |  | 
| Rich Felker | 4a1f55e | 2013-08-01 17:12:23 -0400 | [diff] [blame] | 270 | # | 
| Rich Felker | 06ceee8 | 2013-08-27 17:33:47 -0400 | [diff] [blame] | 271 | # We may use the may_alias attribute if __GNUC__ is defined, so | 
 | 272 | # if the compiler defines __GNUC__ but does not provide it, | 
 | 273 | # it must be defined away as part of the CFLAGS. | 
 | 274 | # | 
 | 275 | printf "checking whether compiler needs attribute((may_alias)) suppression... " | 
 | 276 | cat > "$tmpc" <<EOF | 
 | 277 | typedef int | 
 | 278 | #ifdef __GNUC__ | 
 | 279 | __attribute__((__may_alias__)) | 
 | 280 | #endif | 
 | 281 | x; | 
 | 282 | EOF | 
 | 283 | if $CC $CFLAGS_C99FSE -I./arch/$ARCH -I./include $CPPFLAGS $CFLAGS \ | 
 | 284 |   -c -o /dev/null "$tmpc" >/dev/null 2>&1 ; then | 
 | 285 | printf "no\n" | 
 | 286 | else | 
 | 287 | printf "yes\n" | 
 | 288 | CFLAGS_C99FSE="$CFLAGS_C99FSE -D__may_alias__=" | 
 | 289 | fi | 
 | 290 |  | 
 | 291 | # | 
| Rich Felker | 4a1f55e | 2013-08-01 17:12:23 -0400 | [diff] [blame] | 292 | # Check for options that may be needed to prevent the compiler from | 
 | 293 | # generating self-referential versions of memcpy,, memmove, memcmp, | 
 | 294 | # and memset. Really, we should add a check to determine if this | 
 | 295 | # option is sufficient, and if not, add a macro to cripple these | 
 | 296 | # functions with volatile... | 
 | 297 | # | 
 | 298 | tryflag CFLAGS_MEMOPS -fno-tree-loop-distribute-patterns | 
| Rich Felker | a80847d | 2013-07-22 21:22:04 -0400 | [diff] [blame] | 299 |  | 
| Rich Felker | 64d2f8e | 2012-05-04 23:24:51 -0400 | [diff] [blame] | 300 | # | 
| Rich Felker | a80847d | 2013-07-22 21:22:04 -0400 | [diff] [blame] | 301 | # If debugging is explicitly enabled, don't auto-enable optimizations | 
| Rich Felker | 64d2f8e | 2012-05-04 23:24:51 -0400 | [diff] [blame] | 302 | # | 
| Rich Felker | a80847d | 2013-07-22 21:22:04 -0400 | [diff] [blame] | 303 | if test "$debug" = yes ; then | 
 | 304 | CFLAGS_AUTO=-g | 
 | 305 | test "$optimize" = auto && optimize=no | 
| Rich Felker | 64d2f8e | 2012-05-04 23:24:51 -0400 | [diff] [blame] | 306 | fi | 
| Rich Felker | a80847d | 2013-07-22 21:22:04 -0400 | [diff] [blame] | 307 |  | 
 | 308 | # | 
 | 309 | # Possibly add a -O option to CFLAGS and select modules to optimize with | 
 | 310 | # -O3 based on the status of --enable-optimize and provided CFLAGS. | 
 | 311 | # | 
 | 312 | printf "checking for optimization settings... " | 
 | 313 | case "x$optimize" in | 
 | 314 | xauto) | 
 | 315 | if fnmatch '-O*|*\ -O*' "$CFLAGS_AUTO $CFLAGS" ; then | 
 | 316 | printf "using provided CFLAGS\n" ;optimize=no | 
 | 317 | else | 
 | 318 | printf "using defaults\n" ; optimize=yes | 
 | 319 | fi | 
 | 320 | ;; | 
 | 321 | xsize|xnone) printf "minimize size\n" ; optimize=size ;; | 
 | 322 | xno|x) printf "disabled\n" ; optimize=no ;; | 
 | 323 | *) printf "custom\n" ;; | 
 | 324 | esac | 
 | 325 |  | 
 | 326 | test "$optimize" = no || tryflag CFLAGS_AUTO -Os || tryflag CFLAGS_AUTO -O2 | 
| Rich Felker | 43d2531 | 2013-07-24 23:21:45 -0400 | [diff] [blame] | 327 | test "$optimize" = yes && optimize="internal,malloc,string" | 
| Rich Felker | a80847d | 2013-07-22 21:22:04 -0400 | [diff] [blame] | 328 |  | 
 | 329 | if fnmatch 'no|size' "$optimize" ; then : | 
 | 330 | else | 
 | 331 | printf "components to be optimized for speed:" | 
 | 332 | while test "$optimize" ; do | 
 | 333 | case "$optimize" in | 
 | 334 | *,*) this=${optimize%%,*} optimize=${optimize#*,} ;; | 
 | 335 | *) this=$optimize optimize= | 
 | 336 | esac | 
 | 337 | printf " $this" | 
 | 338 | case "$this" in | 
 | 339 | */*.c) ;; | 
 | 340 | */*) this=$this*.c ;; | 
 | 341 | *) this=$this/*.c ;; | 
 | 342 | esac | 
 | 343 | OPTIMIZE_GLOBS="$OPTIMIZE_GLOBS $this" | 
 | 344 | done | 
 | 345 | OPTIMIZE_GLOBS=${OPTIMIZE_GLOBS# } | 
 | 346 | printf "\n" | 
 | 347 | fi | 
 | 348 |  | 
 | 349 | # Always try -pipe | 
| Rich Felker | 64d2f8e | 2012-05-04 23:24:51 -0400 | [diff] [blame] | 350 | tryflag CFLAGS_AUTO -pipe | 
 | 351 |  | 
 | 352 | # | 
| Rich Felker | b439c05 | 2012-08-29 09:36:02 -0400 | [diff] [blame] | 353 | # If debugging is disabled, omit frame pointer. Modern GCC does this | 
 | 354 | # anyway on most archs even when debugging is enabled since the frame | 
 | 355 | # pointer is no longer needed for debugging. | 
| Rich Felker | 64d2f8e | 2012-05-04 23:24:51 -0400 | [diff] [blame] | 356 | # | 
 | 357 | if fnmatch '-g*|*\ -g*' "$CFLAGS_AUTO $CFLAGS" ; then : | 
 | 358 | else  | 
| Rich Felker | 64d2f8e | 2012-05-04 23:24:51 -0400 | [diff] [blame] | 359 | tryflag CFLAGS_AUTO -fomit-frame-pointer | 
 | 360 | fi | 
 | 361 |  | 
 | 362 | # | 
| Rich Felker | b439c05 | 2012-08-29 09:36:02 -0400 | [diff] [blame] | 363 | # Modern GCC wants to put DWARF tables (used for debugging and | 
 | 364 | # unwinding) in the loaded part of the program where they are | 
 | 365 | # unstrippable. These options force them back to debug sections (and | 
 | 366 | # cause them not to get generated at all if debugging is off). | 
 | 367 | # | 
 | 368 | tryflag CFLAGS_AUTO -fno-unwind-tables | 
 | 369 | tryflag CFLAGS_AUTO -fno-asynchronous-unwind-tables | 
 | 370 |  | 
 | 371 | # | 
| Rich Felker | adefe83 | 2012-10-03 11:49:58 -0400 | [diff] [blame] | 372 | # The GNU toolchain defaults to assuming unmarked files need an | 
 | 373 | # executable stack, potentially exposing vulnerabilities in programs | 
 | 374 | # linked with such object files. Fix this. | 
 | 375 | # | 
 | 376 | tryflag CFLAGS_AUTO -Wa,--noexecstack | 
 | 377 |  | 
 | 378 | # | 
| Rich Felker | 64d2f8e | 2012-05-04 23:24:51 -0400 | [diff] [blame] | 379 | # On x86, make sure we don't have incompatible instruction set | 
 | 380 | # extensions enabled by default. This is bad for making static binaries. | 
 | 381 | # We cheat and use i486 rather than i386 because i386 really does not | 
 | 382 | # work anyway (issues with atomic ops). | 
 | 383 | # | 
 | 384 | if test "$ARCH" = "i386" ; then | 
| Rich Felker | 80a4545 | 2012-10-25 14:52:12 -0400 | [diff] [blame] | 385 | fnmatch '-march=*|*\ -march=*' "$CFLAGS" || tryldflag CFLAGS_AUTO -march=i486 | 
 | 386 | fnmatch '-mtune=*|*\ -mtune=*' "$CFLAGS" || tryldflag CFLAGS_AUTO -mtune=generic | 
| Rich Felker | 64d2f8e | 2012-05-04 23:24:51 -0400 | [diff] [blame] | 387 | fi | 
 | 388 |  | 
| Rich Felker | 2384f27 | 2012-12-11 23:28:31 -0500 | [diff] [blame] | 389 | # | 
 | 390 | # Even with -std=c99, gcc accepts some constructs which are constraint | 
 | 391 | # violations. We want to treat these as errors regardless of whether | 
 | 392 | # other purely stylistic warnings are enabled -- especially implicit | 
 | 393 | # function declarations, which are a dangerous programming error. | 
 | 394 | # | 
 | 395 | tryflag CFLAGS_AUTO -Werror=implicit-function-declaration | 
 | 396 | tryflag CFLAGS_AUTO -Werror=implicit-int | 
 | 397 | tryflag CFLAGS_AUTO -Werror=pointer-sign | 
 | 398 | tryflag CFLAGS_AUTO -Werror=pointer-arith | 
 | 399 |  | 
| Rich Felker | 64d2f8e | 2012-05-04 23:24:51 -0400 | [diff] [blame] | 400 | if test "x$warnings" = xyes ; then | 
 | 401 | tryflag CFLAGS_AUTO -Wall | 
| Rich Felker | 64d2f8e | 2012-05-04 23:24:51 -0400 | [diff] [blame] | 402 | tryflag CFLAGS_AUTO -Wno-parentheses | 
 | 403 | tryflag CFLAGS_AUTO -Wno-uninitialized | 
 | 404 | tryflag CFLAGS_AUTO -Wno-missing-braces | 
 | 405 | tryflag CFLAGS_AUTO -Wno-unused-value | 
 | 406 | tryflag CFLAGS_AUTO -Wno-unused-but-set-variable | 
 | 407 | tryflag CFLAGS_AUTO -Wno-unknown-pragmas | 
| rofl0r | adbeefb | 2014-01-08 03:11:46 +0100 | [diff] [blame] | 408 | tryflag CFLAGS_AUTO -Wno-pointer-to-int-cast | 
| Rich Felker | 64d2f8e | 2012-05-04 23:24:51 -0400 | [diff] [blame] | 409 | fi | 
 | 410 |  | 
| Rich Felker | 0c5efde | 2012-06-06 22:00:08 -0400 | [diff] [blame] | 411 | # Some patched GCC builds have these defaults messed up... | 
 | 412 | tryflag CFLAGS_AUTO -fno-stack-protector | 
| Rich Felker | 2bd05a4 | 2012-08-25 17:13:28 -0400 | [diff] [blame] | 413 | tryldflag LDFLAGS_AUTO -Wl,--hash-style=both | 
| Rich Felker | 08f70a3 | 2012-06-06 20:45:52 -0400 | [diff] [blame] | 414 |  | 
| Rich Felker | d79b277 | 2014-06-10 12:11:12 -0400 | [diff] [blame^] | 415 | test "$shared" = "no" || { | 
| Rich Felker | 498a100 | 2012-06-07 00:32:22 -0400 | [diff] [blame] | 416 | # Disable dynamic linking if ld is broken and can't do -Bsymbolic-functions | 
 | 417 | LDFLAGS_DUMMY= | 
 | 418 | tryldflag LDFLAGS_DUMMY -Wl,-Bsymbolic-functions || { | 
| Rich Felker | d79b277 | 2014-06-10 12:11:12 -0400 | [diff] [blame^] | 419 | test "$shared" = "yes" && fail "$0: error: linker cannot build shared library" | 
| Rich Felker | 498a100 | 2012-06-07 00:32:22 -0400 | [diff] [blame] | 420 | printf "warning: disabling dynamic linking support\n" | 
 | 421 | shared=no | 
 | 422 | } | 
| Rich Felker | d79b277 | 2014-06-10 12:11:12 -0400 | [diff] [blame^] | 423 | } | 
| Rich Felker | 498a100 | 2012-06-07 00:32:22 -0400 | [diff] [blame] | 424 |  | 
| Rich Felker | 2c1cd23 | 2012-09-10 15:30:52 -0400 | [diff] [blame] | 425 | # Find compiler runtime library | 
 | 426 | test -z "$LIBCC" && tryldflag LIBCC -lgcc && tryldflag LIBCC -lgcc_eh | 
 | 427 | test -z "$LIBCC" && tryldflag LIBCC -lcompiler_rt | 
| Rich Felker | cd31a1f | 2012-10-26 18:15:51 -0400 | [diff] [blame] | 428 | test -z "$LIBCC" && try_libcc=`$CC -print-file-name=libpcc.a 2>/dev/null` \ | 
 | 429 |                  && tryldflag LIBCC "$try_libcc" | 
| Rich Felker | 2c1cd23 | 2012-09-10 15:30:52 -0400 | [diff] [blame] | 430 | printf "using compiler runtime libraries: %s\n" "$LIBCC" | 
| Rich Felker | a1546e8 | 2012-07-12 14:24:10 -0400 | [diff] [blame] | 431 |  | 
| Rich Felker | 3e7f186 | 2013-07-18 20:30:58 -0400 | [diff] [blame] | 432 | # Figure out arch variants for archs with variants | 
 | 433 | SUBARCH= | 
 | 434 | t="$CFLAGS_C99FSE $CPPFLAGS $CFLAGS_AUTO $CFLAGS" | 
 | 435 |  | 
| rofl0r | 8c82023 | 2014-03-19 22:31:00 +0100 | [diff] [blame] | 436 | if test "$ARCH" = "x86_64" ; then | 
 | 437 | trycppif __ILP32__ "$t" && ARCH=x32 | 
 | 438 | fi | 
 | 439 |  | 
| Rich Felker | 3e7f186 | 2013-07-18 20:30:58 -0400 | [diff] [blame] | 440 | if test "$ARCH" = "arm" ; then | 
 | 441 | trycppif __ARMEB__ "$t" && SUBARCH=${SUBARCH}eb | 
| Rich Felker | 4918c2b | 2013-08-16 17:09:07 -0400 | [diff] [blame] | 442 | trycppif __ARM_PCS_VFP "$t" && SUBARCH=${SUBARCH}hf | 
| Rich Felker | 3e7f186 | 2013-07-18 20:30:58 -0400 | [diff] [blame] | 443 | fi | 
 | 444 |  | 
| Szabolcs Nagy | e5bb165 | 2014-02-24 23:16:29 +0100 | [diff] [blame] | 445 | if test "$ARCH" = "mips" ; then | 
 | 446 | trycppif "_MIPSEL || __MIPSEL || __MIPSEL__" "$t" && SUBARCH=${SUBARCH}el | 
 | 447 | trycppif __mips_soft_float "$t" && SUBARCH=${SUBARCH}-sf | 
 | 448 | fi | 
| Rich Felker | 3e7f186 | 2013-07-18 20:30:58 -0400 | [diff] [blame] | 449 |  | 
 | 450 | test "$ARCH" = "microblaze" && trycppif __MICROBLAZEEL__ "$t" \ | 
 | 451 | && SUBARCH=${SUBARCH}el | 
 | 452 |  | 
| Rich Felker | b1683a1 | 2014-02-27 23:18:42 -0500 | [diff] [blame] | 453 | if test "$ARCH" = "sh" ; then | 
 | 454 | trycppif __BIG_ENDIAN__ "$t" && SUBARCH=${SUBARCH}eb | 
| Bobby Bingham | 23d6418 | 2014-04-27 21:13:59 -0500 | [diff] [blame] | 455 | if trycppif "__SH_FPU_ANY__ || __SH4__" "$t" ; then | 
| Rich Felker | b1683a1 | 2014-02-27 23:18:42 -0500 | [diff] [blame] | 456 | # Some sh configurations are broken and replace double with float | 
 | 457 | # rather than using softfloat when the fpu is present but only | 
 | 458 | # supports single precision. Reject them. | 
 | 459 | printf "checking whether compiler's double type is IEEE double... " | 
| Rich Felker | 946b9fa | 2014-02-27 23:55:04 -0500 | [diff] [blame] | 460 | echo 'typedef char dblcheck[(int)sizeof(double)-5];' > "$tmpc" | 
| Rich Felker | b1683a1 | 2014-02-27 23:18:42 -0500 | [diff] [blame] | 461 | if $CC $CFLAGS_C99FSE $CPPFLAGS $CFLAGS -c -o /dev/null "$tmpc" >/dev/null 2>&1 ; then | 
 | 462 | printf "yes\n" | 
 | 463 | else | 
 | 464 | printf "no\n" | 
 | 465 | fail "$0: error: compiler's floating point configuration is unsupported" | 
 | 466 | fi | 
 | 467 | else | 
 | 468 | SUBARCH=${SUBARCH}-nofpu | 
 | 469 | fi | 
 | 470 | fi | 
| Bobby Bingham | 3a3c813 | 2013-10-05 05:13:18 -0500 | [diff] [blame] | 471 |  | 
| Rich Felker | 3e7f186 | 2013-07-18 20:30:58 -0400 | [diff] [blame] | 472 | test "$SUBARCH" \ | 
 | 473 | && printf "configured for %s variant: %s\n" "$ARCH" "$ARCH$SUBARCH" | 
| Rich Felker | 64d2f8e | 2012-05-04 23:24:51 -0400 | [diff] [blame] | 474 |  | 
| Rich Felker | 90d7772 | 2013-08-11 03:27:35 -0400 | [diff] [blame] | 475 | case "$ARCH$SUBARCH" in | 
 | 476 | arm) ASMSUBARCH=el ;; | 
 | 477 | *) ASMSUBARCH=$SUBARCH ;; | 
 | 478 | esac | 
 | 479 |  | 
| Rich Felker | 86cc54b | 2013-08-02 19:34:22 -0400 | [diff] [blame] | 480 | # | 
 | 481 | # Some archs (powerpc) have different possible long double formats | 
 | 482 | # that the compiler can be configured for. The logic for whether this | 
 | 483 | # is supported is in bits/float.h; in general, it is not. We need to | 
 | 484 | # check for mismatches here or code in printf, strotd, and scanf will | 
 | 485 | # be dangerously incorrect because it depends on (1) the macros being | 
 | 486 | # correct, and (2) IEEE semantics. | 
 | 487 | # | 
 | 488 | printf "checking whether compiler's long double definition matches float.h... " | 
 | 489 | echo '#include <float.h>' > "$tmpc" | 
 | 490 | echo '#if LDBL_MANT_DIG == 53' >> "$tmpc" | 
 | 491 | echo 'typedef char ldcheck[9-(int)sizeof(long double)];' >> "$tmpc" | 
 | 492 | echo '#endif' >> "$tmpc" | 
 | 493 | if $CC $CFLAGS_C99FSE -I./arch/$ARCH -I./include $CPPFLAGS $CFLAGS \ | 
 | 494 |   -c -o /dev/null "$tmpc" >/dev/null 2>&1 ; then | 
 | 495 | printf "yes\n" | 
 | 496 | else | 
 | 497 | printf "no\n" | 
 | 498 | fail "$0: error: unsupported long double type" | 
 | 499 | fi | 
 | 500 |  | 
| Rich Felker | 9ca4dae | 2014-05-19 10:33:28 -0400 | [diff] [blame] | 501 | # | 
 | 502 | # Check for known bug in GCC 4.9.0 that results in a broken libc. | 
 | 503 | # | 
 | 504 | if test "$cc_is_gcc" = yes ; then | 
 | 505 | printf "checking for gcc constant folding bug with weak aliases... " | 
 | 506 | echo 'static int x = 0;' > "$tmpc" | 
 | 507 | echo 'extern int y __attribute__((__weak__, __alias__("x")));' >> "$tmpc" | 
 | 508 | echo 'extern int should_appear;' >> "$tmpc" | 
 | 509 | echo 'int foo() { return y ? should_appear : 0; }' >> "$tmpc" | 
 | 510 | case "$($CC $CFLAGS_C99FSE -I./arch/$ARCH -I./include \ | 
 | 511 |   $CPPFLAGS $CFLAGS_AUTO $CFLAGS -S -o - "$tmpc" 2>/dev/null)" in | 
 | 512 | *should_appear*) | 
 | 513 | printf "no\n" | 
 | 514 | ;; | 
 | 515 | *) | 
 | 516 | printf "yes\n" | 
 | 517 | fail "$0: error: broken compiler; try CFLAGS=-fno-toplevel-reorder" | 
 | 518 | ;; | 
 | 519 | esac | 
 | 520 | fi | 
 | 521 |  | 
| Rich Felker | 64d2f8e | 2012-05-04 23:24:51 -0400 | [diff] [blame] | 522 | printf "creating config.mak... " | 
 | 523 |  | 
| Rich Felker | 453f462 | 2013-08-16 18:19:47 -0400 | [diff] [blame] | 524 | cmdline=$(quote "$0") | 
 | 525 | for i ; do cmdline="$cmdline $(quote "$i")" ; done | 
 | 526 |  | 
| Rich Felker | 64d2f8e | 2012-05-04 23:24:51 -0400 | [diff] [blame] | 527 | exec 3>&1 1>config.mak | 
 | 528 |  | 
 | 529 |  | 
 | 530 | cat << EOF | 
| Rich Felker | 453f462 | 2013-08-16 18:19:47 -0400 | [diff] [blame] | 531 | # This version of config.mak was generated by: | 
 | 532 | # $cmdline | 
| Rich Felker | 64d2f8e | 2012-05-04 23:24:51 -0400 | [diff] [blame] | 533 | # Any changes made here will be lost if configure is re-run | 
 | 534 | ARCH = $ARCH | 
| Rich Felker | 3e7f186 | 2013-07-18 20:30:58 -0400 | [diff] [blame] | 535 | SUBARCH = $SUBARCH | 
| Rich Felker | 90d7772 | 2013-08-11 03:27:35 -0400 | [diff] [blame] | 536 | ASMSUBARCH = $ASMSUBARCH | 
| Rich Felker | 64d2f8e | 2012-05-04 23:24:51 -0400 | [diff] [blame] | 537 | prefix = $prefix | 
 | 538 | exec_prefix = $exec_prefix | 
 | 539 | bindir = $bindir | 
 | 540 | libdir = $libdir | 
 | 541 | includedir = $includedir | 
 | 542 | syslibdir = $syslibdir | 
 | 543 | CC = $CC | 
| Rich Felker | 7c6db37 | 2014-05-20 15:49:21 -0400 | [diff] [blame] | 544 | CFLAGS = $CFLAGS_AUTO $CFLAGS | 
| Rich Felker | 64d2f8e | 2012-05-04 23:24:51 -0400 | [diff] [blame] | 545 | CFLAGS_C99FSE = $CFLAGS_C99FSE | 
| Rich Felker | 4a1f55e | 2013-08-01 17:12:23 -0400 | [diff] [blame] | 546 | CFLAGS_MEMOPS = $CFLAGS_MEMOPS | 
| Rich Felker | 64d2f8e | 2012-05-04 23:24:51 -0400 | [diff] [blame] | 547 | CPPFLAGS = $CPPFLAGS | 
| Rich Felker | 08f70a3 | 2012-06-06 20:45:52 -0400 | [diff] [blame] | 548 | LDFLAGS = $LDFLAGS_AUTO $LDFLAGS | 
| Rich Felker | 94e920d | 2012-08-14 22:50:16 -0400 | [diff] [blame] | 549 | CROSS_COMPILE = $CROSS_COMPILE | 
| Rich Felker | 2c1cd23 | 2012-09-10 15:30:52 -0400 | [diff] [blame] | 550 | LIBCC = $LIBCC | 
| Rich Felker | a80847d | 2013-07-22 21:22:04 -0400 | [diff] [blame] | 551 | OPTIMIZE_GLOBS = $OPTIMIZE_GLOBS | 
| Rich Felker | 64d2f8e | 2012-05-04 23:24:51 -0400 | [diff] [blame] | 552 | EOF | 
 | 553 | test "x$static" = xno && echo "STATIC_LIBS =" | 
 | 554 | test "x$shared" = xno && echo "SHARED_LIBS =" | 
 | 555 | test "x$wrapper" = xno && echo "ALL_TOOLS =" | 
 | 556 | test "x$wrapper" = xno && echo "TOOL_LIBS =" | 
 | 557 | exec 1>&3 3>&- | 
 | 558 |  | 
 | 559 | printf "done\n" |