]> git.proxmox.com Git - rustc.git/blame - configure
New upstream version 1.15.0+dfsg1
[rustc.git] / configure
CommitLineData
223e47cc
LB
1#!/bin/sh
2
7453a54e
SL
3# /bin/sh on Solaris is not a POSIX compatible shell, but /usr/bin/bash is.
4if [ `uname -s` = 'SunOS' -a "${POSIX_SHELL}" != "true" ]; then
5 POSIX_SHELL="true"
6 export POSIX_SHELL
7 exec /usr/bin/env bash $0 "$@"
8fi
9unset POSIX_SHELL # clear it so if we invoke other scripts, they run as bash as well
10
223e47cc 11msg() {
62682a34 12 echo "configure: $*"
223e47cc
LB
13}
14
15step_msg() {
16 msg
17 msg "$1"
18 msg
19}
20
21warn() {
22 echo "configure: WARNING: $1"
23}
24
25err() {
26 echo "configure: error: $1"
27 exit 1
28}
29
d9579d0f
AL
30run() {
31 msg "$@"
32 "$@"
33}
34
223e47cc
LB
35need_ok() {
36 if [ $? -ne 0 ]
37 then
1a4d82fc 38 err "$1"
223e47cc
LB
39 fi
40}
41
42need_cmd() {
1a4d82fc 43 if command -v $1 >/dev/null 2>&1
62682a34
SL
44 then msg "found program '$1'"
45 else err "program '$1' is missing, please install it"
223e47cc
LB
46 fi
47}
48
49make_dir() {
50 if [ ! -d $1 ]
51 then
d9579d0f 52 run mkdir -p $1
223e47cc
LB
53 fi
54}
55
56copy_if_changed() {
57 if cmp -s $1 $2
58 then
59 msg "leaving $2 unchanged"
60 else
d9579d0f 61 run cp -f $1 $2
223e47cc
LB
62 chmod u-w $2 # make copied artifact read-only
63 fi
64}
65
66move_if_changed() {
67 if cmp -s $1 $2
68 then
69 msg "leaving $2 unchanged"
70 else
d9579d0f 71 run mv -f $1 $2
223e47cc
LB
72 chmod u-w $2 # make moved artifact read-only
73 fi
74}
75
76putvar() {
77 local T
78 eval T=\$$1
79 eval TLEN=\${#$1}
80 if [ $TLEN -gt 35 ]
81 then
82 printf "configure: %-20s := %.35s ...\n" $1 "$T"
83 else
84 printf "configure: %-20s := %s %s\n" $1 "$T" "$2"
85 fi
86 printf "%-20s := %s\n" $1 "$T" >>config.tmp
87}
88
1a4d82fc
JJ
89putpathvar() {
90 local T
91 eval T=\$$1
92 eval TLEN=\${#$1}
93 if [ $TLEN -gt 35 ]
94 then
95 printf "configure: %-20s := %.35s ...\n" $1 "$T"
96 else
97 printf "configure: %-20s := %s %s\n" $1 "$T" "$2"
98 fi
99 if [ -z "$T" ]
100 then
101 printf "%-20s := \n" $1 >>config.tmp
102 else
103 printf "%-20s := \"%s\"\n" $1 "$T" >>config.tmp
104 fi
105}
106
223e47cc
LB
107probe() {
108 local V=$1
109 shift
110 local P
111 local T
112 for P
113 do
1a4d82fc 114 T=$(command -v $P 2>&1)
223e47cc
LB
115 if [ $? -eq 0 ]
116 then
d9579d0f
AL
117 VER0=$($P --version 2>/dev/null \
118 | grep -o '[vV]\?[0-9][0-9.][a-z0-9.-]*' | head -1 )
223e47cc
LB
119 if [ $? -eq 0 -a "x${VER0}" != "x" ]
120 then
121 VER="($VER0)"
122 else
123 VER=""
124 fi
125 break
126 else
127 VER=""
128 T=""
129 fi
130 done
131 eval $V=\$T
1a4d82fc 132 putpathvar $V "$VER"
223e47cc
LB
133}
134
135probe_need() {
223e47cc 136 probe $*
3157f602
XL
137 local V=$1
138 shift
223e47cc
LB
139 eval VV=\$$V
140 if [ -z "$VV" ]
141 then
3157f602 142 err "$V needed, but unable to find any of: $*"
223e47cc
LB
143 fi
144}
145
146validate_opt () {
147 for arg in $CFG_CONFIGURE_ARGS
148 do
149 isArgValid=0
150 for option in $BOOL_OPTIONS
151 do
152 if test --disable-$option = $arg
153 then
154 isArgValid=1
155 fi
156 if test --enable-$option = $arg
157 then
158 isArgValid=1
159 fi
160 done
161 for option in $VAL_OPTIONS
162 do
163 if echo "$arg" | grep -q -- "--$option="
164 then
165 isArgValid=1
166 fi
167 done
168 if [ "$arg" = "--help" ]
169 then
970d7e83 170 echo
223e47cc
LB
171 echo "No more help available for Configure options,"
172 echo "check the Wiki or join our IRC channel"
173 break
174 else
175 if test $isArgValid -eq 0
176 then
177 err "Option '$arg' is not recognized"
178 fi
179 fi
180 done
181}
182
1a4d82fc
JJ
183# `valopt OPTION_NAME DEFAULT DOC` extracts a string-valued option
184# from command line, using provided default value for the option if
185# not present, and saves it to the generated config.mk.
186#
187# `valopt_nosave` is much the same, except that it does not save the
188# result to config.mk (instead the script should use `putvar` itself
189# later on to save it). `valopt_core` is the core upon which the
190# other two are built.
191
192valopt_core() {
193 VAL_OPTIONS="$VAL_OPTIONS $2"
194
195 local SAVE=$1
196 local OP=$2
197 local DEFAULT=$3
198 shift
223e47cc
LB
199 shift
200 shift
201 local DOC="$*"
202 if [ $HELP -eq 0 ]
203 then
204 local UOP=$(echo $OP | tr '[:lower:]' '[:upper:]' | tr '\-' '\_')
205 local V="CFG_${UOP}"
9346a6ac 206 local V_PROVIDED="${V}_PROVIDED"
223e47cc
LB
207 eval $V="$DEFAULT"
208 for arg in $CFG_CONFIGURE_ARGS
209 do
210 if echo "$arg" | grep -q -- "--$OP="
211 then
212 val=$(echo "$arg" | cut -f2 -d=)
213 eval $V=$val
9346a6ac 214 eval $V_PROVIDED=1
223e47cc
LB
215 fi
216 done
1a4d82fc
JJ
217 if [ "$SAVE" = "save" ]
218 then
219 putvar $V
220 fi
223e47cc
LB
221 else
222 if [ -z "$DEFAULT" ]
223 then
224 DEFAULT="<none>"
225 fi
226 OP="${OP}=[${DEFAULT}]"
227 printf " --%-30s %s\n" "$OP" "$DOC"
228 fi
229}
230
1a4d82fc
JJ
231valopt_nosave() {
232 valopt_core nosave "$@"
233}
223e47cc 234
1a4d82fc
JJ
235valopt() {
236 valopt_core save "$@"
237}
238
239# `opt OPTION_NAME DEFAULT DOC` extracts a boolean-valued option from
240# command line, using the provided default value (0/1) for the option
241# if not present, and saves it to the generated config.mk.
242#
243# `opt_nosave` is much the same, except that it does not save the
244# result to config.mk (instead the script should use `putvar` itself
245# later on to save it). `opt_core` is the core upon which the other
246# two are built.
247
248opt_core() {
249 BOOL_OPTIONS="$BOOL_OPTIONS $2"
250
251 local SAVE=$1
252 local OP=$2
253 local DEFAULT=$3
254 shift
223e47cc
LB
255 shift
256 shift
257 local DOC="$*"
258 local FLAG=""
259
260 if [ $DEFAULT -eq 0 ]
261 then
262 FLAG="enable"
9346a6ac 263 DEFAULT_FLAG="disable"
223e47cc
LB
264 else
265 FLAG="disable"
9346a6ac 266 DEFAULT_FLAG="enable"
223e47cc
LB
267 DOC="don't $DOC"
268 fi
269
270 if [ $HELP -eq 0 ]
271 then
272 for arg in $CFG_CONFIGURE_ARGS
273 do
274 if [ "$arg" = "--${FLAG}-${OP}" ]
275 then
276 OP=$(echo $OP | tr 'a-z-' 'A-Z_')
277 FLAG=$(echo $FLAG | tr 'a-z' 'A-Z')
278 local V="CFG_${FLAG}_${OP}"
9346a6ac 279 local V_PROVIDED="CFG_${FLAG}_${OP}_PROVIDED"
223e47cc 280 eval $V=1
9346a6ac 281 eval $V_PROVIDED=1
1a4d82fc
JJ
282 if [ "$SAVE" = "save" ]
283 then
284 putvar $V
285 fi
9346a6ac
AL
286 elif [ "$arg" = "--${DEFAULT_FLAG}-${OP}" ]
287 then
288 OP=$(echo $OP | tr 'a-z-' 'A-Z_')
289 DEFAULT_FLAG=$(echo $DEFAULT_FLAG | tr 'a-z' 'A-Z')
290 local V_PROVIDED="CFG_${DEFAULT_FLAG}_${OP}_PROVIDED"
291 eval $V_PROVIDED=1
223e47cc
LB
292 fi
293 done
294 else
c1a9b12d 295 if [ -n "$META" ]
223e47cc
LB
296 then
297 OP="$OP=<$META>"
298 fi
299 printf " --%-30s %s\n" "$FLAG-$OP" "$DOC"
300 fi
301}
302
1a4d82fc
JJ
303opt_nosave() {
304 opt_core nosave "$@"
305}
306
307opt() {
308 opt_core save "$@"
309}
310
311envopt() {
312 local NAME=$1
313 local V="CFG_${NAME}"
314 eval VV=\$$V
315
316 # If configure didn't set a value already, then check environment.
317 #
318 # (It is recommended that the configure script always check the
319 # environment before setting any values to envopt variables; see
320 # e.g. how CFG_CC is handled, where it first checks `-z "$CC"`,
321 # and issues msg if it ends up employing that provided value.)
322 if [ -z "$VV" ]
323 then
324 eval $V=\$$NAME
325 eval VV=\$$V
326 fi
327
328 # If script or environment provided a value, save it.
c1a9b12d 329 if [ -n "$VV" ]
1a4d82fc
JJ
330 then
331 putvar $V
332 fi
333}
334
c1a9b12d
SL
335enable_if_not_disabled() {
336 local OP=$1
337 local UOP=$(echo $OP | tr '[:lower:]' '[:upper:]' | tr '\-' '\_')
338 local ENAB_V="CFG_ENABLE_$UOP"
339 local EXPLICITLY_DISABLED="CFG_DISABLE_${UOP}_PROVIDED"
340 eval VV=\$$EXPLICITLY_DISABLED
341 if [ -z "$VV" ]; then
342 eval $ENAB_V=1
343 fi
344}
345
1a4d82fc
JJ
346to_gnu_triple() {
347 case $1 in
348 i686-pc-windows-gnu) echo i686-w64-mingw32 ;;
349 x86_64-pc-windows-gnu) echo x86_64-w64-mingw32 ;;
350 *) echo $1 ;;
351 esac
352}
353
d9579d0f
AL
354# Prints the absolute path of a directory to stdout
355abs_path() {
356 local _path="$1"
357 # Unset CDPATH because it causes havok: it makes the destination unpredictable
358 # and triggers 'cd' to print the path to stdout. Route `cd`'s output to /dev/null
359 # for good measure.
360 (unset CDPATH && cd "$_path" > /dev/null && pwd)
361}
362
9e0c209e
SL
363HELP=0
364for arg; do
365 case "$arg" in
366 --help) HELP=1;;
367 esac
368done
369
223e47cc
LB
370msg "looking for configure programs"
371need_cmd cmp
372need_cmd mkdir
373need_cmd printf
374need_cmd cut
375need_cmd head
376need_cmd grep
377need_cmd xargs
378need_cmd cp
379need_cmd find
380need_cmd uname
381need_cmd date
382need_cmd tr
383need_cmd sed
970d7e83 384need_cmd file
85aaf69f 385need_cmd make
223e47cc
LB
386
387msg "inspecting environment"
388
389CFG_OSTYPE=$(uname -s)
390CFG_CPUTYPE=$(uname -m)
391
392if [ $CFG_OSTYPE = Darwin -a $CFG_CPUTYPE = i386 ]
393then
394 # Darwin's `uname -s` lies and always returns i386. We have to use sysctl
395 # instead.
396 if sysctl hw.optional.x86_64 | grep -q ': 1'
397 then
398 CFG_CPUTYPE=x86_64
399 fi
400fi
401
402# The goal here is to come up with the same triple as LLVM would,
403# at least for the subset of platforms we're willing to target.
404
405case $CFG_OSTYPE in
406
407 Linux)
408 CFG_OSTYPE=unknown-linux-gnu
409 ;;
410
411 FreeBSD)
412 CFG_OSTYPE=unknown-freebsd
413 ;;
414
1a4d82fc
JJ
415 DragonFly)
416 CFG_OSTYPE=unknown-dragonfly
417 ;;
418
c34b1796
AL
419 Bitrig)
420 CFG_OSTYPE=unknown-bitrig
421 ;;
422
85aaf69f 423 OpenBSD)
c34b1796 424 CFG_OSTYPE=unknown-openbsd
85aaf69f
SL
425 ;;
426
c1a9b12d
SL
427 NetBSD)
428 CFG_OSTYPE=unknown-netbsd
429 ;;
430
223e47cc
LB
431 Darwin)
432 CFG_OSTYPE=apple-darwin
433 ;;
434
7453a54e
SL
435 SunOS)
436 CFG_OSTYPE=sun-solaris
437 CFG_CPUTYPE=$(isainfo -n)
438 ;;
439
9e0c209e
SL
440 Haiku)
441 CFG_OSTYPE=unknown-haiku
442 ;;
443
1a4d82fc
JJ
444 MINGW*)
445 # msys' `uname` does not print gcc configuration, but prints msys
446 # configuration. so we cannot believe `uname -m`:
447 # msys1 is always i686 and msys2 is always x86_64.
448 # instead, msys defines $MSYSTEM which is MINGW32 on i686 and
449 # MINGW64 on x86_64.
450 CFG_CPUTYPE=i686
451 CFG_OSTYPE=pc-windows-gnu
452 if [ "$MSYSTEM" = MINGW64 ]
453 then
454 CFG_CPUTYPE=x86_64
455 fi
223e47cc 456 ;;
1a4d82fc
JJ
457
458 MSYS*)
459 CFG_OSTYPE=pc-windows-gnu
460 ;;
461
c34b1796 462# Thad's Cygwin identifiers below
223e47cc
LB
463
464# Vista 32 bit
465 CYGWIN_NT-6.0)
1a4d82fc 466 CFG_OSTYPE=pc-windows-gnu
223e47cc
LB
467 CFG_CPUTYPE=i686
468 ;;
469
470# Vista 64 bit
471 CYGWIN_NT-6.0-WOW64)
1a4d82fc 472 CFG_OSTYPE=pc-windows-gnu
223e47cc
LB
473 CFG_CPUTYPE=x86_64
474 ;;
475
476# Win 7 32 bit
477 CYGWIN_NT-6.1)
1a4d82fc 478 CFG_OSTYPE=pc-windows-gnu
223e47cc
LB
479 CFG_CPUTYPE=i686
480 ;;
481
482# Win 7 64 bit
483 CYGWIN_NT-6.1-WOW64)
1a4d82fc 484 CFG_OSTYPE=pc-windows-gnu
223e47cc
LB
485 CFG_CPUTYPE=x86_64
486 ;;
487
c34b1796
AL
488# Win 8 # uname -s on 64-bit cygwin does not contain WOW64, so simply use uname -m to detect arch (works in my install)
489 CYGWIN_NT-6.3)
490 CFG_OSTYPE=pc-windows-gnu
491 ;;
223e47cc
LB
492# We do not detect other OS such as XP/2003 using 64 bit using uname.
493# If we want to in the future, we will need to use Cygwin - Chuck's csih helper in /usr/lib/csih/winProductName.exe or alternative.
494 *)
495 err "unknown OS type: $CFG_OSTYPE"
496 ;;
497esac
498
499
500case $CFG_CPUTYPE in
501
502 i386 | i486 | i686 | i786 | x86)
503 CFG_CPUTYPE=i686
504 ;;
505
506 xscale | arm)
507 CFG_CPUTYPE=arm
508 ;;
509
c30ab7b3 510 armv6l)
1a4d82fc
JJ
511 CFG_CPUTYPE=arm
512 CFG_OSTYPE="${CFG_OSTYPE}eabihf"
513 ;;
514
c30ab7b3
SL
515 armv7l)
516 CFG_CPUTYPE=armv7
517 CFG_OSTYPE="${CFG_OSTYPE}eabihf"
518 ;;
519
1a4d82fc
JJ
520 aarch64)
521 CFG_CPUTYPE=aarch64
522 ;;
523
9cc50fc6 524 powerpc | ppc)
85aaf69f
SL
525 CFG_CPUTYPE=powerpc
526 ;;
527
9cc50fc6
SL
528 powerpc64 | ppc64)
529 CFG_CPUTYPE=powerpc64
530 ;;
531
532 powerpc64le | ppc64le)
533 CFG_CPUTYPE=powerpc64le
534 ;;
535
9e0c209e
SL
536 s390x)
537 CFG_CPUTYPE=s390x
538 ;;
539
223e47cc
LB
540 x86_64 | x86-64 | x64 | amd64)
541 CFG_CPUTYPE=x86_64
542 ;;
543
9e0c209e
SL
544 BePC)
545 CFG_CPUTYPE=i686
546 ;;
547
223e47cc
LB
548 *)
549 err "unknown CPU type: $CFG_CPUTYPE"
550esac
551
552# Detect 64 bit linux systems with 32 bit userland and force 32 bit compilation
553if [ $CFG_OSTYPE = unknown-linux-gnu -a $CFG_CPUTYPE = x86_64 ]
554then
c34b1796
AL
555 # $SHELL does not exist in standard 'sh', so probably only exists
556 # if configure is running in an interactive bash shell. /usr/bin/env
557 # exists *everywhere*.
558 BIN_TO_PROBE="$SHELL"
9cc50fc6
SL
559 if [ ! -r "$BIN_TO_PROBE" ]; then
560 if [ -r "/usr/bin/env" ]; then
561 BIN_TO_PROBE="/usr/bin/env"
562 else
563 warn "Cannot check if the userland is i686 or x86_64"
564 fi
565 fi
566 file -L "$BIN_TO_PROBE" | grep -q "x86[_-]64"
567 if [ $? != 0 ]; then
568 msg "i686 userland on x86_64 Linux kernel"
569 CFG_CPUTYPE=i686
223e47cc
LB
570 fi
571fi
572
573
1a4d82fc 574DEFAULT_BUILD="${CFG_CPUTYPE}-${CFG_OSTYPE}"
223e47cc 575
d9579d0f 576CFG_SRC_DIR="$(abs_path $(dirname $0))/"
62682a34 577CFG_SRC_DIR_RELATIVE="$(dirname $0)/"
223e47cc 578CFG_BUILD_DIR="$(pwd)/"
1a4d82fc 579CFG_SELF="$0"
223e47cc
LB
580CFG_CONFIGURE_ARGS="$@"
581
92a42be0 582
7453a54e 583case "${CFG_SRC_DIR}" in
92a42be0
SL
584 *\ * )
585 err "The path to the rust source directory contains spaces, which is not supported"
586 ;;
587 *)
588 ;;
589esac
590
591
223e47cc 592OPTIONS=""
9e0c209e 593if [ "$HELP" -eq 1 ]
223e47cc 594then
970d7e83 595 echo
223e47cc 596 echo "Usage: $CFG_SELF [options]"
970d7e83 597 echo
223e47cc 598 echo "Options:"
970d7e83 599 echo
223e47cc
LB
600else
601 msg "recreating config.tmp"
602 echo '' >config.tmp
603
604 step_msg "processing $CFG_SELF args"
605fi
606
607BOOL_OPTIONS=""
608VAL_OPTIONS=""
609
d9579d0f 610opt debug 0 "debug mode; disables optimization unless \`--enable-optimize\` given"
223e47cc
LB
611opt valgrind 0 "run tests with valgrind (memcheck by default)"
612opt helgrind 0 "run tests with helgrind instead of memcheck"
1a4d82fc 613opt valgrind-rpass 1 "run rpass-valgrind tests with valgrind"
c34b1796
AL
614opt docs 1 "build standard library documentation"
615opt compiler-docs 0 "build compiler documentation"
1a4d82fc 616opt optimize-tests 1 "build tests with optimizations"
d9579d0f 617opt debuginfo-tests 0 "build tests with debugger metadata"
c30ab7b3 618opt quiet-tests 0 "enable quieter output when running tests"
3157f602 619opt libcpp 1 "build llvm with libc++ instead of libstdc++ when using clang"
9346a6ac
AL
620opt llvm-assertions 0 "build LLVM with assertions"
621opt debug-assertions 0 "build with debugging assertions"
223e47cc 622opt fast-make 0 "use .gitmodules as timestamp for submodule deps"
970d7e83 623opt ccache 0 "invoke gcc/clang via ccache to reuse object files between builds"
476ff2be 624opt sccache 0 "invoke gcc/clang via sccache to reuse object files between builds"
223e47cc 625opt local-rust 0 "use an installed rustc rather than downloading a snapshot"
5bcae85e 626opt local-rebuild 0 "assume local-rust matches the current version, for rebuilds; implies local-rust, and is implied if local-rust already matches the current version"
1a4d82fc 627opt llvm-static-stdcpp 0 "statically link to libstdc++ for LLVM"
476ff2be 628opt llvm-link-shared 0 "prefer shared linking to LLVM (llvm-config --link-shared)"
9cc50fc6 629opt rpath 1 "build rpaths into rustc itself"
b039eaaf 630opt stage0-landing-pads 1 "enable landing pads during bootstrap with stage0"
1a4d82fc
JJ
631# This is used by the automation to produce single-target nightlies
632opt dist-host-only 0 "only install bins for the host architecture"
633opt inject-std-version 1 "inject the current compiler version of libstd into programs"
62682a34 634opt llvm-version-check 1 "check if the LLVM version is supported, build anyway"
476ff2be 635opt rustbuild 1 "use the rust and cargo based build system"
54a0048b 636opt codegen-tests 1 "run the src/test/codegen tests"
a7813a04 637opt option-checking 1 "complain about unrecognized options in this configure script"
5bcae85e 638opt ninja 0 "build LLVM using the Ninja generator (for MSVC, requires building in the correct environment)"
476ff2be 639opt vendor 0 "enable usage of vendored Rust crates"
1a4d82fc 640
9346a6ac
AL
641# Optimization and debugging options. These may be overridden by the release channel, etc.
642opt_nosave optimize 1 "build optimized rust code"
643opt_nosave optimize-cxx 1 "build optimized C++ code"
644opt_nosave optimize-llvm 1 "build optimized LLVM"
645opt_nosave llvm-assertions 0 "build LLVM with assertions"
646opt_nosave debug-assertions 0 "build with debugging assertions"
476ff2be 647opt_nosave llvm-release-debuginfo 0 "build LLVM with debugger metadata"
9346a6ac 648opt_nosave debuginfo 0 "build with debugger metadata"
c30ab7b3 649opt_nosave debuginfo-lines 0 "build with line number debugger metadata"
476ff2be 650opt_nosave debuginfo-only-std 0 "build only libstd with debugging information"
9346a6ac
AL
651opt_nosave debug-jemalloc 0 "build jemalloc with --enable-debug --enable-fill"
652
1a4d82fc
JJ
653valopt localstatedir "/var/lib" "local state directory"
654valopt sysconfdir "/etc" "install system configuration files"
655
656valopt datadir "${CFG_PREFIX}/share" "install data"
657valopt infodir "${CFG_PREFIX}/share/info" "install additional info"
223e47cc 658valopt llvm-root "" "set LLVM root"
62682a34 659valopt python "" "set path to python"
1a4d82fc
JJ
660valopt jemalloc-root "" "set directory where libjemalloc_pic.a is located"
661valopt build "${DEFAULT_BUILD}" "GNUs ./configure syntax LLVM build triple"
7453a54e 662valopt android-cross-path "" "Android NDK standalone path (deprecated)"
e9174d1e 663valopt i686-linux-android-ndk "" "i686-linux-android NDK standalone path"
c1a9b12d 664valopt arm-linux-androideabi-ndk "" "arm-linux-androideabi NDK standalone path"
a7813a04 665valopt armv7-linux-androideabi-ndk "" "armv7-linux-androideabi NDK standalone path"
c1a9b12d 666valopt aarch64-linux-android-ndk "" "aarch64-linux-android NDK standalone path"
9cc50fc6 667valopt nacl-cross-path "" "NaCl SDK path (Pepper Canary is recommended). Must be absolute!"
c30ab7b3 668valopt musl-root "/usr/local" "MUSL root installation directory (deprecated)"
476ff2be
SL
669valopt musl-root-x86_64 "" "x86_64-unknown-linux-musl install directory"
670valopt musl-root-i686 "" "i686-unknown-linux-musl install directory"
671valopt musl-root-arm "" "arm-unknown-linux-musleabi install directory"
672valopt musl-root-armhf "" "arm-unknown-linux-musleabihf install directory"
673valopt musl-root-armv7 "" "armv7-unknown-linux-musleabihf install directory"
9cc50fc6 674valopt extra-filename "" "Additional data that is hashed and passed to the -C extra-filename flag"
223e47cc 675
5bcae85e
SL
676if [ -e ${CFG_SRC_DIR}.git ]
677then
678 valopt release-channel "dev" "the name of the release channel to build"
679else
680 # If we have no git directory then we are probably a tarball distribution
681 # and should default to stable channel - Issue 28322
682 probe CFG_GIT git
683 msg "git: no git directory. Changing default release channel to stable"
684 valopt release-channel "stable" "the name of the release channel to build"
685fi
686
e9174d1e
SL
687# Used on systems where "cc" and "ar" are unavailable
688valopt default-linker "cc" "the default linker"
689valopt default-ar "ar" "the default ar"
690
1a4d82fc
JJ
691# Many of these are saved below during the "writing configuration" step
692# (others are conditionally saved).
693opt_nosave manage-submodules 1 "let the build manage the git submodules"
694opt_nosave clang 0 "prefer clang to gcc for building the runtime"
9346a6ac 695opt_nosave jemalloc 1 "build liballoc with jemalloc"
d9579d0f 696opt elf-tls 1 "elf thread local storage on platforms where supported"
1a4d82fc
JJ
697
698valopt_nosave prefix "/usr/local" "set installation prefix"
699valopt_nosave local-rust-root "/usr/local" "set prefix for local rust binary"
700valopt_nosave host "${CFG_BUILD}" "GNUs ./configure syntax LLVM host triples"
701valopt_nosave target "${CFG_HOST}" "GNUs ./configure syntax LLVM target triples"
702valopt_nosave mandir "${CFG_PREFIX}/share/man" "install man pages in PATH"
9e0c209e 703valopt_nosave docdir "${CFG_PREFIX}/share/doc/rust" "install documentation in PATH"
1a4d82fc 704
92a42be0
SL
705# On Windows this determines root of the subtree for target libraries.
706# Host runtime libs always go to 'bin'.
707valopt libdir "${CFG_PREFIX}/lib" "install libraries"
1a4d82fc
JJ
708
709case "$CFG_LIBDIR" in
710 "$CFG_PREFIX"/*) CAT_INC=2;;
711 "$CFG_PREFIX"*) CAT_INC=1;;
712 *)
713 err "libdir must begin with the prefix. Use --prefix to set it accordingly.";;
714esac
715
716CFG_LIBDIR_RELATIVE=`echo ${CFG_LIBDIR} | cut -c$((${#CFG_PREFIX}+${CAT_INC}))-`
717
223e47cc
LB
718if [ $HELP -eq 1 ]
719then
970d7e83 720 echo
223e47cc
LB
721 exit 0
722fi
723
1a4d82fc 724# Validate Options
a7813a04
XL
725if [ -z "$CFG_DISABLE_OPTION_CHECKING" ]
726then
727 step_msg "validating $CFG_SELF args"
728 validate_opt
729fi
1a4d82fc 730
9346a6ac 731# Validate the release channel, and configure options
1a4d82fc 732case "$CFG_RELEASE_CHANNEL" in
9346a6ac
AL
733 nightly )
734 msg "overriding settings for $CFG_RELEASE_CHANNEL"
735 CFG_ENABLE_LLVM_ASSERTIONS=1
476ff2be
SL
736 # FIXME(stage0) re-enable this on the next stage0 now that #35566 is
737 # fixed
c30ab7b3
SL
738 case "$CFG_BUILD" in
739 *-pc-windows-gnu)
740 ;;
741 *)
476ff2be
SL
742 CFG_ENABLE_DEBUGINFO_LINES=1
743 CFG_ENABLE_DEBUGINFO_ONLY_STD=1
c30ab7b3
SL
744 ;;
745 esac
476ff2be 746
1a4d82fc 747 ;;
c30ab7b3
SL
748 beta | stable)
749 msg "overriding settings for $CFG_RELEASE_CHANNEL"
750 case "$CFG_BUILD" in
751 *-pc-windows-gnu)
752 ;;
753 *)
476ff2be
SL
754 CFG_ENABLE_DEBUGINFO_LINES=1
755 CFG_ENABLE_DEBUGINFO_ONLY_STD=1
c30ab7b3
SL
756 ;;
757 esac
758 ;;
759 dev)
9346a6ac
AL
760 ;;
761 *)
1a4d82fc
JJ
762 err "release channel must be 'dev', 'nightly', 'beta' or 'stable'"
763 ;;
764esac
765
9346a6ac
AL
766# Adjust perf and debug options for debug mode
767if [ -n "$CFG_ENABLE_DEBUG" ]; then
768 msg "debug mode enabled, setting performance options"
769 if [ -z "$CFG_ENABLE_OPTIMIZE_PROVIDED" ]; then
770 msg "optimization not explicitly enabled, disabling optimization"
771 CFG_DISABLE_OPTIMIZE=1
772 CFG_DISABLE_OPTIMIZE_CXX=1
773 fi
c1a9b12d
SL
774
775 # Set following variables to 1 unless setting already provided
776 enable_if_not_disabled debug-assertions
777 enable_if_not_disabled debug-jemalloc
778 enable_if_not_disabled debuginfo
779 enable_if_not_disabled llvm-assertions
1a4d82fc 780fi
9346a6ac
AL
781
782# OK, now write the debugging options
783if [ -n "$CFG_DISABLE_OPTIMIZE" ]; then putvar CFG_DISABLE_OPTIMIZE; fi
784if [ -n "$CFG_DISABLE_OPTIMIZE_CXX" ]; then putvar CFG_DISABLE_OPTIMIZE_CXX; fi
785if [ -n "$CFG_DISABLE_OPTIMIZE_LLVM" ]; then putvar CFG_DISABLE_OPTIMIZE_LLVM; fi
786if [ -n "$CFG_ENABLE_LLVM_ASSERTIONS" ]; then putvar CFG_ENABLE_LLVM_ASSERTIONS; fi
787if [ -n "$CFG_ENABLE_DEBUG_ASSERTIONS" ]; then putvar CFG_ENABLE_DEBUG_ASSERTIONS; fi
476ff2be 788if [ -n "$CFG_ENABLE_LLVM_RELEASE_DEBUGINFO" ]; then putvar CFG_ENABLE_LLVM_RELEASE_DEBUGINFO; fi
9346a6ac 789if [ -n "$CFG_ENABLE_DEBUGINFO" ]; then putvar CFG_ENABLE_DEBUGINFO; fi
c30ab7b3 790if [ -n "$CFG_ENABLE_DEBUGINFO_LINES" ]; then putvar CFG_ENABLE_DEBUGINFO_LINES; fi
476ff2be 791if [ -n "$CFG_ENABLE_DEBUGINFO_ONLY_STD" ]; then putvar CFG_ENABLE_DEBUGINFO_ONLY_STD; fi
9346a6ac 792if [ -n "$CFG_ENABLE_DEBUG_JEMALLOC" ]; then putvar CFG_ENABLE_DEBUG_JEMALLOC; fi
1a4d82fc 793
223e47cc
LB
794step_msg "looking for build programs"
795
3157f602 796probe_need CFG_CURL curl
62682a34 797if [ -z "$CFG_PYTHON_PROVIDED" ]; then
7453a54e 798 probe_need CFG_PYTHON python2.7 python2 python
62682a34 799fi
223e47cc
LB
800
801python_version=$($CFG_PYTHON -V 2>&1)
7453a54e
SL
802if [ $(echo $python_version | grep -c '^Python 2\.7') -ne 1 ]; then
803 err "Found $python_version, but Python 2.7 is required"
223e47cc
LB
804fi
805
806# If we have no git directory then we are probably a tarball distribution
807# and shouldn't attempt to load submodules
808if [ ! -e ${CFG_SRC_DIR}.git ]
809then
810 probe CFG_GIT git
811 msg "git: no git directory. disabling submodules"
812 CFG_DISABLE_MANAGE_SUBMODULES=1
813else
814 probe_need CFG_GIT git
815fi
816
d9579d0f
AL
817# Use `md5sum` on GNU platforms, or `md5 -q` on BSD
818probe CFG_MD5 md5
819probe CFG_MD5SUM md5sum
820if [ -n "$CFG_MD5" ]
821then
62682a34 822 CFG_HASH_COMMAND="$CFG_MD5 -q | cut -c 1-8"
d9579d0f
AL
823elif [ -n "$CFG_MD5SUM" ]
824then
62682a34 825 CFG_HASH_COMMAND="$CFG_MD5SUM | cut -c 1-8"
d9579d0f
AL
826else
827 err 'could not find one of: md5 md5sum'
828fi
829putvar CFG_HASH_COMMAND
830
223e47cc 831probe CFG_CLANG clang++
970d7e83 832probe CFG_CCACHE ccache
223e47cc
LB
833probe CFG_GCC gcc
834probe CFG_LD ld
835probe CFG_VALGRIND valgrind
836probe CFG_PERF perf
837probe CFG_ISCC iscc
1a4d82fc
JJ
838probe CFG_ANTLR4 antlr4
839probe CFG_GRUN grun
85aaf69f
SL
840probe CFG_FLEX flex
841probe CFG_BISON bison
223e47cc 842probe CFG_GDB gdb
1a4d82fc
JJ
843probe CFG_LLDB lldb
844
5bcae85e
SL
845if [ -n "$CFG_ENABLE_NINJA" ]
846then
847 probe CFG_NINJA ninja
848 if [ -z "$CFG_NINJA" ]
849 then
850 # On Debian and Fedora, the `ninja` binary is an IRC bot, so the build tool was
851 # renamed. Handle this case.
852 probe CFG_NINJA ninja-build
853 fi
854fi
855
3157f602 856# For building LLVM
476ff2be
SL
857if [ -z "$CFG_LLVM_ROOT" ]
858then
859 probe_need CFG_CMAKE cmake
860fi
3157f602 861
9346a6ac
AL
862# On MacOS X, invoking `javac` pops up a dialog if the JDK is not
863# installed. Since `javac` is only used if `antlr4` is available,
864# probe for it only in this case.
c1a9b12d 865if [ -n "$CFG_ANTLR4" ]
9346a6ac 866then
476ff2be
SL
867 CFG_ANTLR4_JAR="\"$(find /usr/ -name antlr-complete.jar 2>/dev/null | head -n 1)\""
868 if [ "x" = "x$CFG_ANTLR4_JAR" ]
869 then
870 CFG_ANTLR4_JAR="\"$(find ~ -name antlr-complete.jar 2>/dev/null | head -n 1)\""
871 fi
872 putvar CFG_ANTLR4_JAR $CFG_ANTLR4_JAR
9346a6ac
AL
873 probe CFG_JAVAC javac
874fi
875
d9579d0f
AL
876# the valgrind rpass tests will fail if you don't have a valgrind, but they're
877# only disabled if you opt out.
878if [ -z "$CFG_VALGRIND" ]
879then
880 # If the user has explicitly asked for valgrind tests, then fail
881 if [ -n "$CFG_ENABLE_VALGRIND" ] && [ -n "$CFG_ENABLE_VALGRIND_PROVIDED" ]
882 then
883 err "No valgrind present, but valgrind tests explicitly requested"
884 else
885 CFG_DISABLE_VALGRIND_RPASS=1
886 putvar CFG_DISABLE_VALGRIND_RPASS
887 fi
888fi
889
c1a9b12d 890if [ -n "$CFG_LLDB" ]
1a4d82fc
JJ
891then
892 # Store LLDB's version
893 CFG_LLDB_VERSION=$($CFG_LLDB --version 2>/dev/null | head -1)
894 putvar CFG_LLDB_VERSION
895
896 # If CFG_LLDB_PYTHON_DIR is not already set from the outside and valid, try to read it from
897 # LLDB via the -P commandline options.
898 if [ -z "$CFG_LLDB_PYTHON_DIR" ] || [ ! -d "$CFG_LLDB_PYTHON_DIR" ]
899 then
900 CFG_LLDB_PYTHON_DIR=$($CFG_LLDB -P)
901
902 # If CFG_LLDB_PYTHON_DIR is not a valid directory, set it to something more readable
903 if [ ! -d "$CFG_LLDB_PYTHON_DIR" ]
904 then
905 CFG_LLDB_PYTHON_DIR="LLDB_PYTHON_DIRECTORY_NOT_FOUND"
906 fi
907
908 putvar CFG_LLDB_PYTHON_DIR
909 fi
223e47cc
LB
910fi
911
a7813a04
XL
912# LLDB tests on OSX require /usr/bin/python, not something like Homebrew's
913# /usr/local/bin/python. We're loading a compiled module for LLDB tests which is
914# only compatible with the system.
915case $CFG_BUILD in
916 *-apple-darwin)
917 CFG_LLDB_PYTHON=/usr/bin/python
918 ;;
919 *)
920 CFG_LLDB_PYTHON=$CFG_PYTHON
921 ;;
922esac
923putvar CFG_LLDB_PYTHON
924
970d7e83
LB
925step_msg "looking for target specific programs"
926
927probe CFG_ADB adb
928
1a4d82fc 929BIN_SUF=
62682a34 930if [ "$CFG_OSTYPE" = "pc-windows-gnu" ] || [ "$CFG_OSTYPE" = "pc-windows-msvc" ]
223e47cc 931then
1a4d82fc 932 BIN_SUF=.exe
223e47cc
LB
933fi
934
3157f602
XL
935# --enable-local-rebuild implies --enable-local-rust too
936if [ -n "$CFG_ENABLE_LOCAL_REBUILD" ]
937then
938 if [ -z "$CFG_ENABLE_LOCAL_RUST" ]
939 then
940 CFG_ENABLE_LOCAL_RUST=1
941 putvar CFG_ENABLE_LOCAL_RUST
942 fi
943fi
944
c1a9b12d 945if [ -n "$CFG_ENABLE_LOCAL_RUST" ]
223e47cc 946then
1a4d82fc
JJ
947 system_rustc=$(which rustc)
948 if [ -f ${CFG_LOCAL_RUST_ROOT}/bin/rustc${BIN_SUF} ]
223e47cc 949 then
1a4d82fc
JJ
950 : # everything already configured
951 elif [ -n "$system_rustc" ]
952 then
953 # we assume that rustc is in a /bin directory
954 CFG_LOCAL_RUST_ROOT=${system_rustc%/bin/rustc}
223e47cc 955 else
1a4d82fc 956 err "no local rust to use"
223e47cc 957 fi
1a4d82fc
JJ
958
959 CMD="${CFG_LOCAL_RUST_ROOT}/bin/rustc${BIN_SUF}"
9e0c209e 960 LRV=`LD_LIBRARY_PATH=${CFG_LOCAL_RUST_ROOT}/lib $CMD --version`
1a4d82fc
JJ
961 if [ $? -ne 0 ]
962 then
963 step_msg "failure while running $CMD --version"
964 exit 1
965 fi
966 step_msg "using rustc at: ${CFG_LOCAL_RUST_ROOT} with version: $LRV"
967 putvar CFG_LOCAL_RUST_ROOT
223e47cc
LB
968fi
969
c34b1796
AL
970# Force bitrig to build with clang; gcc doesn't like us there
971if [ $CFG_OSTYPE = unknown-bitrig ]
972then
7453a54e 973 step_msg "on Bitrig, forcing use of clang"
c34b1796 974 CFG_ENABLE_CLANG=1
c34b1796
AL
975fi
976
e9174d1e
SL
977# default gcc version under OpenBSD maybe too old, try using egcc, which is a
978# gcc version from ports
979if [ $CFG_OSTYPE = unknown-openbsd ]
980then
981 if [ $("$CFG_GCC" --version 2>&1 | grep -c ' 4\.[0-6]') -ne 0 ]; then
982 step_msg "older GCC found, try with egcc instead"
983
984 # probe again but using egcc
985 probe CFG_GCC egcc
986
987 # and use egcc/eg++ for CC/CXX too if it was found
988 # (but user setting has priority)
989 if [ -n "$CFG_GCC" ]; then
990 CC="${CC:-egcc}"
991 CXX="${CXX:-eg++}"
992 fi
993 fi
e9174d1e
SL
994fi
995
1a4d82fc
JJ
996# OS X 10.9, gcc is actually clang. This can cause some confusion in the build
997# system, so if we find that gcc is clang, we should just use clang directly.
998if [ $CFG_OSTYPE = apple-darwin -a -z "$CFG_ENABLE_CLANG" ]
999then
1000 CFG_OSX_GCC_VERSION=$("$CFG_GCC" --version 2>&1 | grep "Apple LLVM version")
1001 if [ $? -eq 0 ]
1002 then
d9579d0f 1003 step_msg "on OS X >=10.9, forcing use of clang"
1a4d82fc
JJ
1004 CFG_ENABLE_CLANG=1
1005 else
1006 if [ $("$CFG_GCC" --version 2>&1 | grep -c ' 4\.[0-6]') -ne 0 ]; then
1007 step_msg "older GCC found, using clang instead"
1008 CFG_ENABLE_CLANG=1
1009 else
1010 # on OS X, with xcode 5 and newer, certain developers may have
1011 # cc, gcc and g++ point to a mixture of clang and gcc
1012 # if so, this will create very strange build errors
1013 # this last stanza is to detect some such problems and save the future rust
1014 # contributor some time solving that issue.
1015 # this detection could be generalized to other OSes aside from OS X
1016 # but the issue seems most likely to happen on OS X
1017
1018 chk_cc () {
1019 $1 --version 2> /dev/null | grep -q $2
1020 }
1021 # check that gcc, cc and g++ all point to the same compiler.
1022 # note that for xcode 5, g++ points to clang, not clang++
1023 if !((chk_cc gcc clang && chk_cc g++ clang) ||
1024 (chk_cc gcc gcc &&( chk_cc g++ g++ || chk g++ gcc))); then
1025 err "the gcc and g++ in your path point to different compilers.
1026 Check which versions are in your path with gcc --version and g++ --version.
1027 To resolve this problem, either fix your PATH or run configure with --enable-clang"
1028 fi
1029
1030 fi
1031 fi
1032fi
1033
c1a9b12d
SL
1034# If the clang isn't already enabled, check for GCC, and if it is missing, turn
1035# on clang as a backup.
1036if [ -z "$CFG_ENABLE_CLANG" ]
1037then
1038 CFG_GCC_VERSION=$("$CFG_GCC" --version 2>&1)
1039 if [ $? -ne 0 ]
1040 then
1041 step_msg "GCC not installed, will try using Clang"
1042 CFG_ENABLE_CLANG=1
1043 fi
1044fi
1045
1a4d82fc
JJ
1046# Okay, at this point, we have made up our minds about whether we are
1047# going to force CFG_ENABLE_CLANG or not; save the setting if so.
c1a9b12d 1048if [ -n "$CFG_ENABLE_CLANG" ]
1a4d82fc
JJ
1049then
1050 putvar CFG_ENABLE_CLANG
1051fi
1052
9cc50fc6
SL
1053if [ -z "$CFG_DISABLE_LIBCPP" -a -n "$CFG_ENABLE_CLANG" ]
1054then
1055 CFG_USING_LIBCPP="1"
1056else
1057 CFG_USING_LIBCPP="0"
1058fi
1059
9346a6ac 1060# Same with jemalloc. save the setting here.
c1a9b12d 1061if [ -n "$CFG_DISABLE_JEMALLOC" ]
9346a6ac
AL
1062then
1063 putvar CFG_DISABLE_JEMALLOC
1064fi
1065
c1a9b12d 1066if [ -n "$CFG_LLVM_ROOT" -a -z "$CFG_DISABLE_LLVM_VERSION_CHECK" -a -e "$CFG_LLVM_ROOT/bin/llvm-config" ]
223e47cc
LB
1067then
1068 step_msg "using custom LLVM at $CFG_LLVM_ROOT"
1069
1070 LLVM_CONFIG="$CFG_LLVM_ROOT/bin/llvm-config"
1071 LLVM_VERSION=$($LLVM_CONFIG --version)
1072
1073 case $LLVM_VERSION in
5bcae85e 1074 (3.[7-9]*)
1a4d82fc
JJ
1075 msg "found ok version of LLVM: $LLVM_VERSION"
1076 ;;
1077 (*)
3157f602 1078 err "bad LLVM version: $LLVM_VERSION, need >=3.7"
1a4d82fc 1079 ;;
223e47cc 1080 esac
5bcae85e
SL
1081
1082 if "$CFG_LLVM_ROOT/bin/llvm-mc" -help | grep -- "-relocation-model"; then
1083 msg "found older llvm-mc"
1084 CFG_LLVM_MC_HAS_RELOCATION_MODEL=1
1085 putvar CFG_LLVM_MC_HAS_RELOCATION_MODEL
1086 fi
223e47cc
LB
1087fi
1088
1a4d82fc
JJ
1089# Even when the user overrides the choice of CC, still try to detect
1090# clang to disable some clang-specific warnings. We here draw a
1091# distinction between:
1092#
1093# CFG_ENABLE_CLANG : passed --enable-clang, or host "requires" clang,
1094# CFG_USING_CLANG : compiler (clang / gcc / $CC) looks like clang.
1095#
1096# This distinction is important because there are some safeguards we
1097# would prefer to skip when merely CFG_USING_CLANG is set; but when
1098# CFG_ENABLE_CLANG is set, that indicates that we are opting into
1099# running such safeguards.
1100
c1a9b12d 1101if [ -n "$CC" ]
223e47cc 1102then
1a4d82fc
JJ
1103 msg "skipping compiler inference steps; using provided CC=$CC"
1104 CFG_CC="$CC"
1105
1106 CFG_OSX_CC_VERSION=$("$CFG_CC" --version 2>&1 | grep "clang")
1107 if [ $? -eq 0 ]
223e47cc 1108 then
1a4d82fc
JJ
1109 step_msg "note, user-provided CC looks like clang; CC=$CC."
1110 CFG_USING_CLANG=1
1111 putvar CFG_USING_CLANG
223e47cc 1112 fi
223e47cc 1113else
c1a9b12d 1114 if [ -n "$CFG_ENABLE_CLANG" ]
1a4d82fc
JJ
1115 then
1116 if [ -z "$CFG_CLANG" ]
1117 then
1118 err "clang requested but not found"
1119 fi
1120 CFG_CC="$CFG_CLANG"
1121 CFG_USING_CLANG=1
1122 putvar CFG_USING_CLANG
1123 else
1124 CFG_CC="gcc"
1125 fi
1126fi
1127
c1a9b12d 1128if [ -n "$CFG_ENABLE_CLANG" ]
1a4d82fc 1129then
62682a34
SL
1130 case "$CC" in
1131 (''|*clang)
62682a34
SL
1132 if [ -z "$CC" ]
1133 then
1134 CFG_CC="clang"
1135 CFG_CXX="clang++"
1136 fi
1137 esac
223e47cc
LB
1138fi
1139
c1a9b12d 1140if [ -n "$CFG_ENABLE_CCACHE" ]
970d7e83 1141then
c1a9b12d 1142 if [ -z "$CFG_CCACHE" ]
970d7e83 1143 then
c1a9b12d 1144 err "ccache requested but not found"
970d7e83 1145 fi
c1a9b12d
SL
1146
1147 CFG_CC="ccache $CFG_CC"
1a4d82fc 1148fi
970d7e83 1149
1a4d82fc
JJ
1150if [ -z "$CC" -a -z "$CFG_ENABLE_CLANG" -a -z "$CFG_GCC" ]
1151then
1152 err "either clang or gcc is required"
970d7e83
LB
1153fi
1154
1a4d82fc
JJ
1155# All safeguards based on $CFG_ENABLE_CLANG should occur before this
1156# point in the script; after this point, script logic should inspect
1157# $CFG_USING_CLANG rather than $CFG_ENABLE_CLANG.
1158
92a42be0 1159# Set CFG_{CC,CXX,CPP,CFLAGS,CXXFLAGS,LDFLAGS}
1a4d82fc
JJ
1160envopt CC
1161envopt CXX
1162envopt CPP
1163envopt CFLAGS
1164envopt CXXFLAGS
92a42be0 1165envopt LDFLAGS
223e47cc 1166
b039eaaf
SL
1167# stdc++ name in use
1168# used to manage non-standard name (on OpenBSD for example)
1169program_transform_name=$($CFG_CC -v 2>&1 | sed -n "s/.*--program-transform-name='\([^']*\)'.*/\1/p")
1170CFG_STDCPP_NAME=$(echo "stdc++" | sed "${program_transform_name}")
1171putvar CFG_STDCPP_NAME
1172
1a4d82fc 1173# a little post-processing of various config values
223e47cc 1174CFG_PREFIX=${CFG_PREFIX%/}
1a4d82fc 1175CFG_MANDIR=${CFG_MANDIR%/}
9e0c209e 1176CFG_DOCDIR=${CFG_DOCDIR%/}
1a4d82fc
JJ
1177CFG_HOST="$(echo $CFG_HOST | tr ',' ' ')"
1178CFG_TARGET="$(echo $CFG_TARGET | tr ',' ' ')"
1179CFG_SUPPORTED_TARGET=""
1180for target_file in ${CFG_SRC_DIR}mk/cfg/*.mk; do
1181 CFG_SUPPORTED_TARGET="${CFG_SUPPORTED_TARGET} $(basename "$target_file" .mk)"
1182done
223e47cc 1183
c1a9b12d
SL
1184# copy build-triples to host-triples so that builds are a subset of hosts
1185V_TEMP=""
1186for i in $CFG_BUILD $CFG_HOST;
1187do
1188 echo "$V_TEMP" | grep -qF $i || V_TEMP="$V_TEMP${V_TEMP:+ }$i"
1189done
1190CFG_HOST=$V_TEMP
1191
223e47cc
LB
1192# copy host-triples to target-triples so that hosts are a subset of targets
1193V_TEMP=""
1a4d82fc 1194for i in $CFG_HOST $CFG_TARGET;
223e47cc
LB
1195do
1196 echo "$V_TEMP" | grep -qF $i || V_TEMP="$V_TEMP${V_TEMP:+ }$i"
1197done
1a4d82fc 1198CFG_TARGET=$V_TEMP
223e47cc
LB
1199
1200# check target-specific tool-chains
1a4d82fc 1201for i in $CFG_TARGET
223e47cc
LB
1202do
1203 L_CHECK=false
1a4d82fc 1204 for j in $CFG_SUPPORTED_TARGET
223e47cc
LB
1205 do
1206 if [ $i = $j ]
1207 then
1208 L_CHECK=true
1209 fi
1210 done
1211
1212 if [ $L_CHECK = false ]
1213 then
1214 err "unsupported target triples \"$i\" found"
1215 fi
1216
1217 case $i in
c1a9b12d 1218 *android*)
a7813a04
XL
1219 case $i in
1220 armv7-linux-androideabi)
1221 cmd_prefix="arm-linux-androideabi"
1222 ;;
1223 *)
1224 cmd_prefix=$i
1225 ;;
1226 esac
1227
c1a9b12d
SL
1228 upper_snake_target=$(echo "$i" | tr '[:lower:]' '[:upper:]' | tr '\-' '\_')
1229 eval ndk=\$"CFG_${upper_snake_target}_NDK"
1230 if [ -z "$ndk" ]
223e47cc 1231 then
c1a9b12d
SL
1232 ndk=$CFG_ANDROID_CROSS_PATH
1233 eval "CFG_${upper_snake_target}_NDK"=$CFG_ANDROID_CROSS_PATH
1234 warn "generic/default Android NDK option is deprecated (use --$i-ndk option instead)"
223e47cc 1235 fi
c1a9b12d
SL
1236
1237 # Perform a basic sanity check of the NDK
a7813a04 1238 for android_ndk_tool in "$ndk/bin/$cmd_prefix-gcc" "$ndk/bin/$cmd_prefix-g++" "$ndk/bin/$cmd_prefix-ar"
c1a9b12d
SL
1239 do
1240 if [ ! -f $android_ndk_tool ]
1241 then
1242 err "NDK tool $android_ndk_tool not found (bad or missing --$i-ndk option?)"
1243 fi
1244 done
223e47cc 1245 ;;
9cc50fc6
SL
1246 *-unknown-nacl)
1247 if [ -z "$CFG_NACL_CROSS_PATH" ]
1248 then
1249 err "I need the NaCl SDK path! (use --nacl-cross-path)"
1250 fi
1251 ;;
1a4d82fc
JJ
1252 arm-apple-darwin)
1253 if [ $CFG_OSTYPE != apple-darwin ]
1254 then
1255 err "The iOS target is only supported on Mac OS X"
1256 fi
1257 ;;
1258
c1a9b12d 1259 *-msvc)
e9174d1e
SL
1260 # There are three builds of cmake on windows: MSVC, MinGW and Cygwin
1261 # The Cygwin build does not have generators for Visual Studio, so
1262 # detect that here and error.
1263 if ! "$CFG_CMAKE" --help | sed -n '/^Generators/,$p' | grep 'Visual Studio' > /dev/null
1264 then
1265 err "
1266
1267cmake does not support Visual Studio generators.
1268
1269This is likely due to it being an msys/cygwin build of cmake, \
1270rather than the required windows version, built using MinGW \
1271or Visual Studio.
1272
1273If you are building under msys2 try installing the mingw-w64-x86_64-cmake \
1274package instead of cmake:
1275
1276$ pacman -R cmake && pacman -S mingw-w64-x86_64-cmake
1277"
1278 fi
1279
62682a34
SL
1280 # Use the REG program to figure out where VS is installed
1281 # We need to figure out where cl.exe and link.exe are, so we do some
1282 # munging and some probing here. We also look for the default
1283 # INCLUDE and LIB variables for MSVC so we can set those in the
1284 # build system as well.
e9174d1e 1285 install=$(cmd //c reg QUERY \
c1a9b12d 1286 'HKLM\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\14.0' \
62682a34 1287 -v InstallDir)
c1a9b12d 1288 if [ -z "$install" ]; then
e9174d1e 1289 install=$(cmd //c reg QUERY \
c1a9b12d
SL
1290 'HKLM\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\12.0' \
1291 -v InstallDir)
1292 fi
62682a34
SL
1293 need_ok "couldn't find visual studio install root"
1294 CFG_MSVC_ROOT=$(echo "$install" | grep InstallDir | sed 's/.*REG_SZ[ ]*//')
1295 CFG_MSVC_ROOT=$(dirname "$CFG_MSVC_ROOT")
1296 CFG_MSVC_ROOT=$(dirname "$CFG_MSVC_ROOT")
c1a9b12d
SL
1297 putvar CFG_MSVC_ROOT
1298
1299 case $i in
1300 x86_64-*)
1301 bits=x86_64
1302 msvc_part=amd64
1303 ;;
54a0048b 1304 i*86-*)
c1a9b12d
SL
1305 bits=i386
1306 msvc_part=
1307 ;;
1308 *)
1309 err "can only target x86 targets for MSVC"
1310 ;;
1311 esac
1312 bindir="${CFG_MSVC_ROOT}/VC/bin"
1313 if [ -n "$msvc_part" ]; then
1314 bindir="$bindir/$msvc_part"
1315 fi
1316 eval CFG_MSVC_BINDIR_$bits="\"$bindir\""
1317 eval CFG_MSVC_CL_$bits="\"$bindir/cl.exe\""
1318 eval CFG_MSVC_LIB_$bits="\"$bindir/lib.exe\""
1319 eval CFG_MSVC_LINK_$bits="\"$bindir/link.exe\""
62682a34
SL
1320
1321 vcvarsall="${CFG_MSVC_ROOT}/VC/vcvarsall.bat"
e9174d1e 1322 include_path=$(cmd //V:ON //c "$vcvarsall" $msvc_part \& echo !INCLUDE!)
62682a34 1323 need_ok "failed to learn about MSVC's INCLUDE"
e9174d1e 1324 lib_path=$(cmd //V:ON //c "$vcvarsall" $msvc_part \& echo !LIB!)
62682a34
SL
1325 need_ok "failed to learn about MSVC's LIB"
1326
c1a9b12d
SL
1327 eval CFG_MSVC_INCLUDE_PATH_${bits}="\"$include_path\""
1328 eval CFG_MSVC_LIB_PATH_${bits}="\"$lib_path\""
1329
1330 putvar CFG_MSVC_BINDIR_${bits}
1331 putvar CFG_MSVC_CL_${bits}
1332 putvar CFG_MSVC_LIB_${bits}
1333 putvar CFG_MSVC_LINK_${bits}
1334 putvar CFG_MSVC_INCLUDE_PATH_${bits}
1335 putvar CFG_MSVC_LIB_PATH_${bits}
62682a34
SL
1336 ;;
1337
223e47cc
LB
1338 *)
1339 ;;
1340 esac
1341done
1342
3157f602
XL
1343if [ "$CFG_OSTYPE" = "pc-windows-gnu" ] || [ "$CFG_OSTYPE" = "pc-windows-msvc" ]
1344then
1345 # There are some MSYS python builds which will auto-translate
1346 # windows-style paths to MSYS-style paths in Python itself.
1347 # Unfortunately this breaks LLVM's build system as somewhere along
1348 # the line LLVM prints a path into a file from Python and then CMake
1349 # later tries to interpret that path. If Python prints a MSYS path
1350 # and CMake tries to use it as a Windows path, you're gonna have a
1351 # Bad Time.
1352 #
1353 # Consequently here we try to detect when that happens and print an
1354 # error if it does.
1355 if $CFG_PYTHON -c 'import sys; print sys.argv[1]' `pwd` | grep '^/' > /dev/null
1356 then
1357 err "
1358
1359python is silently translating windows paths to MSYS paths \
1360and the build will fail if this python is used.
1361
1362Either an official python install must be used or an \
1363alternative python package in MinGW must be used.
1364
1365If you are building under msys2 try installing the mingw-w64-x86_64-python2 \
1366package instead of python2:
1367
1368$ pacman -S mingw-w64-x86_64-python2
1369"
1370 fi
1371fi
1372
c1a9b12d 1373if [ -n "$CFG_PERF" ]
223e47cc
LB
1374then
1375 HAVE_PERF_LOGFD=`$CFG_PERF stat --log-fd 2>&1 | grep 'unknown option'`
1376 if [ -z "$HAVE_PERF_LOGFD" ];
1377 then
1378 CFG_PERF_WITH_LOGFD=1
1379 putvar CFG_PERF_WITH_LOGFD
1380 fi
1381fi
1382
476ff2be 1383if [ -n "$CFG_DISABLE_RUSTBUILD" ]; then
223e47cc 1384
7453a54e 1385 step_msg "making directories"
223e47cc 1386
7453a54e
SL
1387 for i in \
1388 doc doc/std doc/extra \
1389 dl tmp dist
1390 do
1391 make_dir $i
1392 done
223e47cc 1393
7453a54e
SL
1394 for t in $CFG_HOST
1395 do
1396 make_dir $t/llvm
1397 done
223e47cc 1398
7453a54e 1399 for t in $CFG_HOST
223e47cc 1400 do
7453a54e 1401 make_dir $t/rustllvm
223e47cc 1402 done
223e47cc 1403
7453a54e
SL
1404 for t in $CFG_TARGET
1405 do
1406 make_dir $t/rt
1407 for s in 0 1 2 3
223e47cc 1408 do
7453a54e
SL
1409 make_dir $t/rt/stage$s
1410 make_dir $t/rt/jemalloc
1411 make_dir $t/rt/compiler-rt
1412 for i in \
1413 isaac sync test \
1414 arch/i386 arch/x86_64 arch/arm arch/aarch64 arch/mips arch/powerpc
1415 do
1416 make_dir $t/rt/stage$s/$i
1417 done
223e47cc 1418 done
7453a54e 1419 done
223e47cc 1420
7453a54e
SL
1421 for h in $CFG_HOST
1422 do
1423 for t in $CFG_TARGET
1424 do
1425 # host bin dir stage0
1426 make_dir $h/stage0/bin
1427
1428 # host lib dir stage0
1429 make_dir $h/stage0/lib
1430
1431 # host test dir stage0
1432 make_dir $h/stage0/test
1433
1434 # target bin dir stage0
1435 make_dir $h/stage0/lib/rustlib/$t/bin
1436
1437 # target lib dir stage0
1438 make_dir $h/stage0/lib/rustlib/$t/lib
1439
1440 for i in 1 2 3
1441 do
1442 # host bin dir
1443 make_dir $h/stage$i/bin
1444
1445 # host lib dir
1446 make_dir $h/stage$i/$CFG_LIBDIR_RELATIVE
1447
1448 # host test dir
1449 make_dir $h/stage$i/test
1450
1451 # target bin dir
1452 make_dir $h/stage$i/$CFG_LIBDIR_RELATIVE/rustlib/$t/bin
1453
1454 # target lib dir
1455 make_dir $h/stage$i/$CFG_LIBDIR_RELATIVE/rustlib/$t/lib
1456 done
1457 done
1458
1459 make_dir $h/test/run-pass
1460 make_dir $h/test/run-pass-valgrind
1461 make_dir $h/test/run-pass-fulldeps
1462 make_dir $h/test/run-fail
1463 make_dir $h/test/run-fail-fulldeps
1464 make_dir $h/test/compile-fail
1465 make_dir $h/test/parse-fail
1466 make_dir $h/test/compile-fail-fulldeps
1467 make_dir $h/test/bench
1468 make_dir $h/test/perf
1469 make_dir $h/test/pretty
1470 make_dir $h/test/debuginfo-gdb
1471 make_dir $h/test/debuginfo-lldb
1472 make_dir $h/test/codegen
1473 make_dir $h/test/codegen-units
1474 make_dir $h/test/rustdoc
1475 done
1476
1477fi
223e47cc
LB
1478
1479# Configure submodules
1480step_msg "configuring submodules"
1481
1482# Have to be in the top of src directory for this
476ff2be 1483if [ -z "$CFG_DISABLE_MANAGE_SUBMODULES" ] && [ -n "$CFG_DISABLE_RUSTBUILD" ]
223e47cc
LB
1484then
1485 cd ${CFG_SRC_DIR}
1486
1487 msg "git: submodule sync"
1a4d82fc
JJ
1488 "${CFG_GIT}" submodule sync
1489
1490 msg "git: submodule init"
1491 "${CFG_GIT}" submodule init
1492
1493 # Disable submodules that we're not using
c1a9b12d 1494 if [ -n "${CFG_LLVM_ROOT}" ]; then
1a4d82fc
JJ
1495 msg "git: submodule deinit src/llvm"
1496 "${CFG_GIT}" submodule deinit src/llvm
1497 fi
c1a9b12d 1498 if [ -n "${CFG_JEMALLOC_ROOT}" ]; then
1a4d82fc
JJ
1499 msg "git: submodule deinit src/jemalloc"
1500 "${CFG_GIT}" submodule deinit src/jemalloc
1501 fi
223e47cc
LB
1502
1503 msg "git: submodule update"
1a4d82fc 1504 "${CFG_GIT}" submodule update
223e47cc
LB
1505 need_ok "git failed"
1506
1507 msg "git: submodule foreach sync"
1a4d82fc 1508 "${CFG_GIT}" submodule foreach --recursive 'if test -e .gitmodules; then git submodule sync; fi'
223e47cc
LB
1509 need_ok "git failed"
1510
1511 msg "git: submodule foreach update"
1a4d82fc 1512 "${CFG_GIT}" submodule update --recursive
223e47cc
LB
1513 need_ok "git failed"
1514
1515 # NB: this is just for the sake of getting the submodule SHA1 values
1516 # and status written into the build log.
1517 msg "git: submodule status"
1518 "${CFG_GIT}" submodule status --recursive
1519
1520 msg "git: submodule clobber"
1a4d82fc 1521 "${CFG_GIT}" submodule foreach --recursive git clean -dxf
223e47cc 1522 need_ok "git failed"
1a4d82fc 1523 "${CFG_GIT}" submodule foreach --recursive git checkout .
223e47cc
LB
1524 need_ok "git failed"
1525
1526 cd ${CFG_BUILD_DIR}
1527fi
1528
a7813a04
XL
1529# Do a sanity check that the submodule source exists. Because GitHub
1530# automatically publishes broken tarballs that can't be disabled, and
1531# people download them and try to use them.
1532if [ ! -e "${CFG_SRC_DIR}/src/liblibc" ]; then
1533 err "some submodules are missing. Is this a broken tarball?
1534
1535If you downloaded this tarball from the GitHub release pages at
1536https://github.com/rust-lang/rust/releases,
1537then please delete it and instead download the source from
1538https://www.rust-lang.org/downloads.html"
1539
1540fi
1541
223e47cc
LB
1542# Configure llvm, only if necessary
1543step_msg "looking at LLVM"
1544CFG_LLVM_SRC_DIR=${CFG_SRC_DIR}src/llvm/
1a4d82fc 1545for t in $CFG_HOST
223e47cc
LB
1546do
1547 do_reconfigure=1
62682a34
SL
1548 is_msvc=0
1549 case "$t" in
1550 (*-msvc)
1551 is_msvc=1
1552 ;;
1553 esac
223e47cc 1554
476ff2be 1555 if [ -z "$CFG_DISABLE_RUSTBUILD" ]
7453a54e
SL
1556 then
1557 msg "not configuring LLVM, rustbuild in use"
1558 do_reconfigure=0
476ff2be 1559 elif [ -z "$CFG_LLVM_ROOT" ]
223e47cc 1560 then
1a4d82fc 1561 LLVM_BUILD_DIR=${CFG_BUILD_DIR}$t/llvm
3157f602
XL
1562 LLVM_INST_DIR=$LLVM_BUILD_DIR
1563 # For some crazy reason the MSVC output dir is different than Unix
1564 if [ ${is_msvc} -ne 0 ]; then
1565 if [ -n "$CFG_DISABLE_OPTIMIZE_LLVM" ]
1566 then
1567 # Just use LLVM straight from its build directory to
1568 # avoid 'make install' time
1569 LLVM_INST_DIR=$LLVM_BUILD_DIR/Debug
1570 else
1571 LLVM_INST_DIR=$LLVM_BUILD_DIR/Release
62682a34 1572 fi
223e47cc
LB
1573 fi
1574 else
1575 msg "not reconfiguring LLVM, external LLVM root"
1576 # The user is using their own LLVM
1577 LLVM_BUILD_DIR=
1578 LLVM_INST_DIR=$CFG_LLVM_ROOT
1579 do_reconfigure=0
e9174d1e 1580 # Check that LLVm FileCheck is available. Needed for the tests
54a0048b
SL
1581 if [ -z "$CFG_DISABLE_CODEGEN_TESTS" ]; then
1582 need_cmd $LLVM_INST_DIR/bin/FileCheck
1583 fi
223e47cc
LB
1584 fi
1585
223e47cc
LB
1586 if [ ${do_reconfigure} -ne 0 ]
1587 then
1588 # because git is hilarious, it might have put the module index
1589 # in a couple places.
1590 index1="${CFG_SRC_DIR}.git/modules/src/llvm/index"
1591 index2="${CFG_SRC_DIR}src/llvm/.git/index"
1592 for index in ${index1} ${index2}
1593 do
1a4d82fc 1594 config_status="${LLVM_BUILD_DIR}/config.status"
223e47cc
LB
1595 if test -e ${index} -a \
1596 -e ${config_status} -a \
1597 ${config_status} -nt ${index}
1598 then
1599 msg "not reconfiguring LLVM, config.status is fresh"
1600 do_reconfigure=0
1601 fi
1602 done
1603 fi
1604
92a42be0 1605 # We need the generator later on for compiler-rt even if LLVM's not built
5bcae85e
SL
1606 if [ -n "$CFG_NINJA" ]
1607 then
1608 generator="Ninja"
1609 elif [ ${is_msvc} -ne 0 ]
62682a34 1610 then
c1a9b12d
SL
1611 case "$CFG_MSVC_ROOT" in
1612 *14.0*)
1613 generator="Visual Studio 14 2015"
1614 ;;
1615 *12.0*)
1616 generator="Visual Studio 12 2013"
1617 ;;
1618 *)
1619 err "can't determine generator for LLVM cmake"
1620 ;;
1621 esac
1622 case "$t" in
1623 x86_64-*)
1624 generator="$generator Win64"
1625 ;;
1626 i686-*)
1627 ;;
1628 *)
1629 err "can only build LLVM for x86 platforms"
1630 ;;
1631 esac
3157f602
XL
1632 else
1633 generator="Unix Makefiles"
62682a34 1634 fi
3157f602
XL
1635 CFG_CMAKE_GENERATOR=$generator
1636 putvar CFG_CMAKE_GENERATOR
1637
1638 msg "configuring LLVM for $t"
1639
1640 LLVM_CFLAGS_32=""
1641 LLVM_CXXFLAGS_32=""
1642 LLVM_LDFLAGS_32=""
1643 LLVM_CFLAGS_64=""
1644 LLVM_CXXFLAGS_64=""
1645 LLVM_LDFLAGS_64=""
1646
1647 case "$CFG_CC" in
1648 ("ccache clang")
1649 LLVM_CXX_32="ccache"
1650 LLVM_CC_32="ccache"
1651 LLVM_CXX_32_ARG1="clang++"
1652 LLVM_CC_32_ARG1="clang"
1653 LLVM_CFLAGS_32="-Qunused-arguments"
1654 LLVM_CXXFLAGS_32="-Qunused-arguments"
1655
1656 LLVM_CXX_64="ccache"
1657 LLVM_CC_64="ccache"
1658 LLVM_CXX_64_ARG1="clang++"
1659 LLVM_CC_64_ARG1="clang"
1660 LLVM_CFLAGS_64="-Qunused-arguments"
1661 LLVM_CXXFLAGS_64="-Qunused-arguments"
1a4d82fc 1662 ;;
3157f602
XL
1663 ("clang")
1664 LLVM_CXX_32="clang++"
1665 LLVM_CC_32="clang"
1666 LLVM_CFLAGS_32="-Qunused-arguments"
1667 LLVM_CXXFLAGS_32="-Qunused-arguments"
1668
1669 LLVM_CXX_64="clang++"
1670 LLVM_CC_64="clang"
1671 LLVM_CFLAGS_64="-Qunused-arguments"
1672 LLVM_CXXFLAGS_64="-Qunused-arguments"
970d7e83 1673 ;;
3157f602
XL
1674 ("ccache gcc")
1675 LLVM_CXX_32="ccache"
1676 LLVM_CC_32="ccache"
c30ab7b3
SL
1677 LLVM_CXX_32_ARG1="g++"
1678 LLVM_CC_32_ARG1="gcc"
3157f602
XL
1679
1680 LLVM_CXX_64="ccache"
1681 LLVM_CC_64="ccache"
1682 LLVM_CXX_64_ARG1="g++"
1683 LLVM_CC_64_ARG1="gcc"
970d7e83 1684 ;;
3157f602 1685 ("gcc")
476ff2be
SL
1686 if [ -z "$CFG_ENABLE_SCCACHE" ]; then
1687 LLVM_CXX_32="g++"
1688 LLVM_CC_32="gcc"
223e47cc 1689
476ff2be
SL
1690 LLVM_CXX_64="g++"
1691 LLVM_CC_64="gcc"
1692 else
1693 LLVM_CXX_32="sccache"
1694 LLVM_CC_32="sccache"
1695 LLVM_CXX_32_ARG1="g++"
1696 LLVM_CC_32_ARG1="gcc"
1697
1698 LLVM_CXX_64="sccache"
1699 LLVM_CC_64="sccache"
1700 LLVM_CXX_64_ARG1="g++"
1701 LLVM_CC_64_ARG1="gcc"
1702 fi
1a4d82fc
JJ
1703 ;;
1704
3157f602 1705 (*)
1a4d82fc 1706 msg "inferring LLVM_CXX/CC from CXX/CC = $CXX/$CC"
c1a9b12d
SL
1707 if [ -n "$CFG_ENABLE_CCACHE" ]
1708 then
1709 if [ -z "$CFG_CCACHE" ]
1710 then
1711 err "ccache requested but not found"
1712 fi
1713
3157f602
XL
1714 LLVM_CXX_32="ccache"
1715 LLVM_CC_32="ccache"
1716 LLVM_CXX_32_ARG1="$CXX"
1717 LLVM_CC_32_ARG1="$CC"
c1a9b12d 1718
3157f602
XL
1719 LLVM_CXX_64="ccache"
1720 LLVM_CC_64="ccache"
1721 LLVM_CXX_64_ARG1="$CXX"
1722 LLVM_CC_64_ARG1="$CC"
c1a9b12d
SL
1723 else
1724 LLVM_CXX_32="$CXX"
1725 LLVM_CC_32="$CC"
1726
1727 LLVM_CXX_64="$CXX"
1728 LLVM_CC_64="$CC"
1729 fi
1a4d82fc 1730
1a4d82fc 1731 ;;
3157f602
XL
1732 esac
1733
1734 case "$CFG_CPUTYPE" in
1735 (x86*)
1736 LLVM_CFLAGS_32="$LLVM_CFLAGS_32 -m32"
1737 LLVM_CXXFLAGS_32="$LLVM_CXXFLAGS_32 -m32"
1738 LLVM_LDFLAGS_32="$LLVM_LDFLAGS_32 -m32"
1739 ;;
1740 esac
223e47cc 1741
3157f602
XL
1742 if echo $t | grep -q x86_64
1743 then
1744 LLVM_CXX=$LLVM_CXX_64
1745 LLVM_CC=$LLVM_CC_64
1746 LLVM_CXX_ARG1=$LLVM_CXX_64_ARG1
1747 LLVM_CC_ARG1=$LLVM_CC_64_ARG1
1748 LLVM_CFLAGS=$LLVM_CFLAGS_64
1749 LLVM_CXXFLAGS=$LLVM_CXXFLAGS_64
1750 LLVM_LDFLAGS=$LLVM_LDFLAGS_64
1751 else
1752 LLVM_CXX=$LLVM_CXX_32
1753 LLVM_CC=$LLVM_CC_32
1754 LLVM_CXX_ARG1=$LLVM_CXX_32_ARG1
1755 LLVM_CC_ARG1=$LLVM_CC_32_ARG1
1756 LLVM_CFLAGS=$LLVM_CFLAGS_32
1757 LLVM_CXXFLAGS=$LLVM_CXXFLAGS_32
1758 LLVM_LDFLAGS=$LLVM_LDFLAGS_32
1759 fi
1a4d82fc 1760
3157f602
XL
1761 if [ "$CFG_USING_LIBCPP" != "0" ]; then
1762 CMAKE_ARGS="$CMAKE_ARGS -DLLVM_ENABLE_LIBCXX=ON"
1763 fi
223e47cc 1764
3157f602
XL
1765 # Turn off things we don't need
1766 CMAKE_ARGS="$CMAKE_ARGS -DLLVM_INCLUDE_TESTS=OFF"
1767 CMAKE_ARGS="$CMAKE_ARGS -DLLVM_INCLUDE_EXAMPLES=OFF"
1768 CMAKE_ARGS="$CMAKE_ARGS -DLLVM_INCLUDE_DOCS=OFF"
1769 CMAKE_ARGS="$CMAKE_ARGS -DLLVM_ENABLE_ZLIB=OFF"
1770 CMAKE_ARGS="$CMAKE_ARGS -DWITH_POLY=OFF"
1771 CMAKE_ARGS="$CMAKE_ARGS -DLLVM_ENABLE_TERMINFO=OFF"
1772 CMAKE_ARGS="$CMAKE_ARGS -DLLVM_ENABLE_LIBEDIT=OFF"
1a4d82fc 1773
3157f602 1774 arch="$(echo "$t" | cut -d - -f 1)"
1a4d82fc 1775
3157f602
XL
1776 if [ "$arch" = i686 ]; then
1777 CMAKE_ARGS="$CMAKE_ARGS -DLLVM_BUILD_32_BITS=ON"
1778 fi
1a4d82fc 1779
3157f602
XL
1780 if [ "$t" != "$CFG_BUILD" ]; then
1781 # see http://llvm.org/docs/HowToCrossCompileLLVM.html
1782 CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_CROSSCOMPILING=True"
1783 CMAKE_ARGS="$CMAKE_ARGS -DLLVM_TARGET_ARCH=$arch"
1784 CMAKE_ARGS="$CMAKE_ARGS -DLLVM_TABLEGEN=$CFG_BUILD_DIR/$CFG_BUILD/llvm/bin/llvm-tblgen"
1785 CMAKE_ARGS="$CMAKE_ARGS -DLLVM_DEFAULT_TARGET_TRIPLE=$t"
1786 fi
223e47cc 1787
3157f602
XL
1788 # MSVC handles compiler business itself
1789 if [ ${is_msvc} -eq 0 ]; then
1790 CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_C_COMPILER=$LLVM_CC"
1791 CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_CXX_COMPILER=$LLVM_CXX"
1792 CMAKE_ARGS="$CMAKE_ARGS '-DCMAKE_C_FLAGS=$LLVM_CFLAGS'"
1793 CMAKE_ARGS="$CMAKE_ARGS '-DCMAKE_CXX_FLAGS=$LLVM_CXXFLAGS'"
1794 if [ -n "$LLVM_CC_ARG1" ]; then
1795 CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_C_COMPILER_ARG1=$LLVM_CC_ARG1"
1796 fi
1797 if [ -n "$LLVM_CXX_ARG1" ]; then
1798 CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_CXX_COMPILER_ARG1=$LLVM_CXX_ARG1"
223e47cc 1799 fi
3157f602
XL
1800 # FIXME: What about LDFLAGS?
1801 fi
223e47cc 1802
3157f602
XL
1803 if [ -n "$CFG_DISABLE_OPTIMIZE_LLVM" ]; then
1804 CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_BUILD_TYPE=Debug"
476ff2be
SL
1805 elif [ -n "$CFG_ENABLE_LLVM_RELEASE_DEBUGINFO" ]; then
1806 CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_BUILD_TYPE=RelWithDebInfo"
3157f602
XL
1807 else
1808 CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_BUILD_TYPE=Release"
1809 fi
1810 if [ -z "$CFG_ENABLE_LLVM_ASSERTIONS" ]
1811 then
1812 CMAKE_ARGS="$CMAKE_ARGS -DLLVM_ENABLE_ASSERTIONS=OFF"
1813 else
1814 CMAKE_ARGS="$CMAKE_ARGS -DLLVM_ENABLE_ASSERTIONS=ON"
1815 fi
223e47cc 1816
476ff2be 1817 CMAKE_ARGS="$CMAKE_ARGS -DLLVM_TARGETS_TO_BUILD='X86;ARM;AArch64;Mips;PowerPC;SystemZ;JSBackend;MSP430'"
3157f602
XL
1818 CMAKE_ARGS="$CMAKE_ARGS -G '$CFG_CMAKE_GENERATOR'"
1819 CMAKE_ARGS="$CMAKE_ARGS $CFG_LLVM_SRC_DIR"
1a4d82fc 1820
3157f602
XL
1821 if [ ${do_reconfigure} -ne 0 ]
1822 then
1823 msg "configuring LLVM for $t with cmake"
223e47cc
LB
1824
1825 msg "configuring LLVM with:"
3157f602 1826 msg "$CMAKE_ARGS"
223e47cc 1827
3157f602
XL
1828 (cd $LLVM_BUILD_DIR && eval "\"$CFG_CMAKE\"" $CMAKE_ARGS)
1829 need_ok "LLVM cmake configure failed"
223e47cc
LB
1830 fi
1831
1832 # Construct variables for LLVM build and install directories for
1833 # each target. These will be named
1834 # CFG_LLVM_BUILD_DIR_${target_triple} but all the hyphens in
1835 # target_triple will be converted to underscore, because bash
1836 # variables can't contain hyphens. The makefile will then have to
1837 # convert back.
1838 CFG_LLVM_BUILD_DIR=$(echo CFG_LLVM_BUILD_DIR_${t} | tr - _)
1839 CFG_LLVM_INST_DIR=$(echo CFG_LLVM_INST_DIR_${t} | tr - _)
1840 eval ${CFG_LLVM_BUILD_DIR}="'$LLVM_BUILD_DIR'"
1841 eval ${CFG_LLVM_INST_DIR}="'$LLVM_INST_DIR'"
1842done
1843
1844
1845step_msg "writing configuration"
1846
1847putvar CFG_SRC_DIR
62682a34 1848putvar CFG_SRC_DIR_RELATIVE
223e47cc
LB
1849putvar CFG_BUILD_DIR
1850putvar CFG_OSTYPE
1851putvar CFG_CPUTYPE
1852putvar CFG_CONFIGURE_ARGS
1853putvar CFG_PREFIX
1a4d82fc
JJ
1854putvar CFG_HOST
1855putvar CFG_TARGET
1856putvar CFG_LIBDIR_RELATIVE
223e47cc 1857putvar CFG_DISABLE_MANAGE_SUBMODULES
c1a9b12d
SL
1858putvar CFG_AARCH64_LINUX_ANDROID_NDK
1859putvar CFG_ARM_LINUX_ANDROIDEABI_NDK
a7813a04 1860putvar CFG_ARMV7_LINUX_ANDROIDEABI_NDK
e9174d1e 1861putvar CFG_I686_LINUX_ANDROID_NDK
9cc50fc6 1862putvar CFG_NACL_CROSS_PATH
1a4d82fc 1863putvar CFG_MANDIR
9e0c209e 1864putvar CFG_DOCDIR
9cc50fc6 1865putvar CFG_USING_LIBCPP
223e47cc 1866
970d7e83
LB
1867# Avoid spurious warnings from clang by feeding it original source on
1868# ccache-miss rather than preprocessed input.
c1a9b12d 1869if [ -n "$CFG_ENABLE_CCACHE" ] && [ -n "$CFG_USING_CLANG" ]
970d7e83
LB
1870then
1871 CFG_CCACHE_CPP2=1
1872 putvar CFG_CCACHE_CPP2
1873fi
1874
c1a9b12d 1875if [ -n "$CFG_ENABLE_CCACHE" ]
970d7e83
LB
1876then
1877 CFG_CCACHE_BASEDIR=${CFG_SRC_DIR}
1878 putvar CFG_CCACHE_BASEDIR
1879fi
1880
1881
223e47cc
LB
1882putvar CFG_LLVM_SRC_DIR
1883
1a4d82fc 1884for t in $CFG_HOST
223e47cc
LB
1885do
1886 CFG_LLVM_BUILD_DIR=$(echo CFG_LLVM_BUILD_DIR_${t} | tr - _)
1887 CFG_LLVM_INST_DIR=$(echo CFG_LLVM_INST_DIR_${t} | tr - _)
1888 putvar $CFG_LLVM_BUILD_DIR
1889 putvar $CFG_LLVM_INST_DIR
1890done
1891
476ff2be 1892if [ -z "$CFG_DISABLE_RUSTBUILD" ]
7453a54e
SL
1893then
1894 INPUT_MAKEFILE=src/bootstrap/mk/Makefile.in
1895else
1896 INPUT_MAKEFILE=Makefile.in
1897fi
1898
223e47cc 1899msg
7453a54e 1900copy_if_changed ${CFG_SRC_DIR}${INPUT_MAKEFILE} ./Makefile
223e47cc
LB
1901move_if_changed config.tmp config.mk
1902rm -f config.tmp
1903touch config.stamp
1904
9346a6ac
AL
1905if [ -z "$CFG_ENABLE_DEBUG" ]; then
1906 step_msg "configured in release mode. for development consider --enable-debug"
1907else
1908 step_msg "complete"
1909fi
1910
476ff2be
SL
1911if [ "$CFG_SRC_DIR" = `pwd` ]; then
1912 X_PY=x.py
1913else
1914 X_PY=${CFG_SRC_DIR_RELATIVE}x.py
1915fi
1916
1917if [ -z "$CFG_DISABLE_RUSTBUILD" ]; then
1918 msg "NOTE you have now configured rust to use a rewritten build system"
1919 msg " called rustbuild, and as a result this may have bugs that "
1920 msg " you did not see before. If you experience any issues you can"
1921 msg " go back to the old build system with --disable-rustbuild and"
1922 msg " please feel free to report any bugs!"
1923 msg ""
1924 msg "run \`python ${X_PY} --help\`"
1925else
1926 warn "the makefile-based build system is deprecated in favor of rustbuild"
1927 msg ""
1928 msg "It is recommended you avoid passing --disable-rustbuild to get your"
1929 msg "build working as the makefiles will be deleted on 2017-02-02. If you"
1930 msg "encounter bugs with rustbuild please file issues against rust-lang/rust"
1931 msg ""
1932 msg "run \`make help\`"
1933fi
1934
1a4d82fc 1935msg