]> git.lizzy.rs Git - rust.git/blob - configure
librustc: Update the serializer to work properly with INHTWAMA, removing mutable...
[rust.git] / configure
1 #!/bin/sh
2
3 msg() {
4     echo "configure: $1"
5 }
6
7 step_msg() {
8     msg
9     msg "$1"
10     msg
11 }
12
13 warn() {
14     echo "configure: WARNING: $1"
15 }
16
17 err() {
18     echo "configure: error: $1"
19     exit 1
20 }
21
22 need_ok() {
23     if [ $? -ne 0 ]
24     then
25         err $1
26     fi
27 }
28
29 need_cmd() {
30     if which $1 >/dev/null 2>&1
31     then msg "found $1"
32     else err "need $1"
33     fi
34 }
35
36 make_dir() {
37     if [ ! -d $1 ]
38     then
39         msg "mkdir -p $1"
40         mkdir -p $1
41     fi
42 }
43
44 copy_if_changed() {
45     if cmp -s $1 $2
46     then
47         msg "leaving $2 unchanged"
48     else
49         msg "cp $1 $2"
50         cp -f $1 $2
51         chmod u-w $2 # make copied artifact read-only
52     fi
53 }
54
55 move_if_changed() {
56     if cmp -s $1 $2
57     then
58         msg "leaving $2 unchanged"
59     else
60         msg "mv $1 $2"
61         mv -f $1 $2
62         chmod u-w $2 # make moved artifact read-only
63     fi
64 }
65
66 putvar() {
67     local T
68     eval T=\$$1
69     eval TLEN=\${#$1}
70     if [ $TLEN -gt 35 ]
71     then
72         printf "configure: %-20s := %.35s ...\n" $1 "$T"
73     else
74         printf "configure: %-20s := %s %s\n" $1 "$T" "$2"
75     fi
76     printf "%-20s := %s\n" $1 "$T" >>config.tmp
77 }
78
79 probe() {
80     local V=$1
81     shift
82     local P
83     local T
84     for P
85     do
86         T=$(which $P 2>&1)
87         if [ $? -eq 0 ]
88         then
89             VER0=$($P --version 2>/dev/null | head -1 \
90                 |  sed -e 's/[^0-9]*\([vV]\?[0-9.]\+[^ ]*\).*/\1/' )
91             if [ $? -eq 0 -a "x${VER0}" != "x" ]
92             then
93               VER="($VER0)"
94             else
95               VER=""
96             fi
97             break
98         else
99             VER=""
100             T=""
101         fi
102     done
103     eval $V=\$T
104     putvar $V "$VER"
105 }
106
107 probe_need() {
108     local V=$1
109     probe $*
110     eval VV=\$$V
111     if [ -z "$VV" ]
112     then
113         err "needed, but unable to find any of: $*"
114     fi
115 }
116
117 validate_opt () {
118     for arg in $CFG_CONFIGURE_ARGS
119     do
120         isArgValid=0
121         for option in $BOOL_OPTIONS
122         do
123             if test --disable-$option = $arg
124             then
125                 isArgValid=1
126             fi
127             if test --enable-$option = $arg
128             then
129                 isArgValid=1
130             fi
131         done
132         for option in $VAL_OPTIONS
133         do
134             if echo "$arg" | grep -q -- "--$option="
135             then
136                 isArgValid=1
137             fi
138         done
139         if [ "$arg" = "--help" ]
140         then
141             echo ""
142             echo "No more help available for Configure options,"
143             echo "check the Wiki or join our IRC channel"
144             break
145         else
146             if test $isArgValid -eq 0
147             then
148                 err "Option '$arg' is not recognized"
149             fi
150         fi
151     done
152 }
153
154 valopt() {
155     VAL_OPTIONS="$VAL_OPTIONS $1"
156
157     local OP=$1
158     local DEFAULT=$2
159     shift
160     shift
161     local DOC="$*"
162     if [ $HELP -eq 0 ]
163     then
164         local UOP=$(echo $OP | tr '[:lower:]' '[:upper:]' | tr '\-' '\_')
165         local V="CFG_${UOP}"
166         eval $V="$DEFAULT"
167         for arg in $CFG_CONFIGURE_ARGS
168         do
169             if echo "$arg" | grep -q -- "--$OP="
170             then
171                 val=$(echo "$arg" | cut -f2 -d=)
172                 eval $V=$val
173             fi
174         done
175         putvar $V
176     else
177         if [ -z "$DEFAULT" ]
178         then
179             DEFAULT="<none>"
180         fi
181         OP="${OP}=[${DEFAULT}]"
182         printf "    --%-30s %s\n" "$OP" "$DOC"
183     fi
184 }
185
186 opt() {
187     BOOL_OPTIONS="$BOOL_OPTIONS $1"
188
189     local OP=$1
190     local DEFAULT=$2
191     shift
192     shift
193     local DOC="$*"
194     local FLAG=""
195
196     if [ $DEFAULT -eq 0 ]
197     then
198         FLAG="enable"
199     else
200         FLAG="disable"
201         DOC="don't $DOC"
202     fi
203
204     if [ $HELP -eq 0 ]
205     then
206         for arg in $CFG_CONFIGURE_ARGS
207         do
208             if [ "$arg" = "--${FLAG}-${OP}" ]
209             then
210                 OP=$(echo $OP | tr 'a-z-' 'A-Z_')
211                 FLAG=$(echo $FLAG | tr 'a-z' 'A-Z')
212                 local V="CFG_${FLAG}_${OP}"
213                 eval $V=1
214                 putvar $V
215             fi
216         done
217     else
218         if [ ! -z "$META" ]
219         then
220             OP="$OP=<$META>"
221         fi
222         printf "    --%-30s %s\n" "$FLAG-$OP" "$DOC"
223      fi
224 }
225
226 msg "looking for configure programs"
227 need_cmd cmp
228 need_cmd mkdir
229 need_cmd printf
230 need_cmd cut
231 need_cmd head
232 need_cmd grep
233 need_cmd xargs
234 need_cmd cp
235 need_cmd find
236 need_cmd uname
237 need_cmd date
238 need_cmd tr
239 need_cmd sed
240 need_cmd file
241
242 msg "inspecting environment"
243
244 CFG_OSTYPE=$(uname -s)
245 CFG_CPUTYPE=$(uname -m)
246
247 if [ $CFG_OSTYPE = Darwin -a $CFG_CPUTYPE = i386 ]
248 then
249     # Darwin's `uname -s` lies and always returns i386. We have to use sysctl
250     # instead.
251     if sysctl hw.optional.x86_64 | grep -q ': 1'
252     then
253         CFG_CPUTYPE=x86_64
254     fi
255 fi
256
257 # The goal here is to come up with the same triple as LLVM would,
258 # at least for the subset of platforms we're willing to target.
259
260 case $CFG_OSTYPE in
261
262     Linux)
263         CFG_OSTYPE=unknown-linux-gnu
264         ;;
265
266     FreeBSD)
267         CFG_OSTYPE=unknown-freebsd
268         ;;
269
270     Darwin)
271         CFG_OSTYPE=apple-darwin
272         ;;
273
274     MINGW32*)
275         CFG_OSTYPE=pc-mingw32
276         ;;
277 # Thad's Cygwin identifers below
278
279 #   Vista 32 bit
280     CYGWIN_NT-6.0)
281         CFG_OSTYPE=pc-mingw32
282         CFG_CPUTYPE=i686
283         ;;
284
285 #   Vista 64 bit
286     CYGWIN_NT-6.0-WOW64)
287         CFG_OSTYPE=w64-mingw32
288         CFG_CPUTYPE=x86_64
289         ;;
290
291 #   Win 7 32 bit
292     CYGWIN_NT-6.1)
293         CFG_OSTYPE=pc-mingw32
294         CFG_CPUTYPE=i686
295         ;;
296
297 #   Win 7 64 bit
298     CYGWIN_NT-6.1-WOW64)
299         CFG_OSTYPE=w64-mingw32
300         CFG_CPUTYPE=x86_64
301         ;;
302
303 # We do not detect other OS such as XP/2003 using 64 bit using uname.
304 # 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.
305     *)
306         err "unknown OS type: $CFG_OSTYPE"
307         ;;
308 esac
309
310
311 case $CFG_CPUTYPE in
312
313     i386 | i486 | i686 | i786 | x86)
314         CFG_CPUTYPE=i686
315         ;;
316
317     xscale | arm)
318         CFG_CPUTYPE=arm
319         ;;
320
321     x86_64 | x86-64 | x64 | amd64)
322         CFG_CPUTYPE=x86_64
323         ;;
324
325     *)
326         err "unknown CPU type: $CFG_CPUTYPE"
327 esac
328
329 # Detect 64 bit linux systems with 32 bit userland and force 32 bit compilation
330 if [ $CFG_OSTYPE = unknown-linux-gnu -a $CFG_CPUTYPE = x86_64 ]
331 then
332     file -L "$SHELL" | grep -q "x86[_-]64"
333     if [ $? != 0 ]; then
334         CFG_CPUTYPE=i686
335     fi
336 fi
337
338
339 DEFAULT_BUILD_TRIPLE="${CFG_CPUTYPE}-${CFG_OSTYPE}"
340
341 CFG_SRC_DIR="$(cd $(dirname $0) && pwd)/"
342 CFG_BUILD_DIR="$(pwd)/"
343 CFG_SELF=${CFG_SRC_DIR}$(basename $0)
344 CFG_CONFIGURE_ARGS="$@"
345
346 OPTIONS=""
347 HELP=0
348 if [ "$1" = "--help" ]
349 then
350     HELP=1
351     shift
352     echo ""
353     echo "Usage: $CFG_SELF [options]"
354     echo ""
355     echo "Options:"
356     echo ""
357 else
358     msg "recreating config.tmp"
359     echo '' >config.tmp
360
361     step_msg "processing $CFG_SELF args"
362 fi
363
364 BOOL_OPTIONS=""
365 VAL_OPTIONS=""
366
367 opt sharedstd 1 "build libstd as a shared library"
368 opt valgrind 0 "run tests with valgrind (memcheck by default)"
369 opt helgrind 0 "run tests with helgrind instead of memcheck"
370 opt docs     1 "build documentation"
371 opt optimize 1 "build optimized rust code"
372 opt optimize-cxx 1 "build optimized C++ code"
373 opt optimize-llvm 1 "build optimized LLVM"
374 opt debug 0 "build with extra debug fun"
375 opt fast-make 0 "use .gitmodules as timestamp for submodule deps"
376 opt manage-submodules 1 "let the build manage the git submodules"
377 opt mingw-cross 0 "cross-compile for win32 using mingw"
378 opt clang 0 "prefer clang to gcc for building the runtime"
379 opt local-rust 0 "use an installed rustc rather than downloading a snapshot"
380 opt pax-flags 0 "apply PaX flags to rustc binaries (required for GRSecurity/PaX-patched kernels)"
381 valopt prefix "/usr/local" "set installation prefix"
382 valopt local-rust-root "/usr/local" "set prefix for local rust binary"
383 valopt llvm-root "" "set LLVM root"
384 valopt build-triple "${DEFAULT_BUILD_TRIPLE}" "LLVM build triple"
385 valopt host-triples "${CFG_BUILD_TRIPLE}" "LLVM host triples"
386 valopt target-triples "${CFG_HOST_TRIPLES}" "LLVM target triples"
387 valopt android-cross-path "/opt/ndk_standalone" "Android NDK standalone path"
388 valopt mingw32-cross-path "" "MinGW32 cross compiler path"
389
390 # Validate Options
391 step_msg "validating $CFG_SELF args"
392 validate_opt
393
394 if [ $HELP -eq 1 ]
395 then
396     echo ""
397     exit 0
398 fi
399
400
401 step_msg "looking for build programs"
402
403 probe_need CFG_PERL        perl
404 probe_need CFG_CURL        curl
405 probe_need CFG_PYTHON      python2.7 python2.6 python2 python
406
407 python_version=$($CFG_PYTHON -V 2>&1)
408 if [ $(echo $python_version | grep -c '^Python 2\.[4567]') -ne 1 ]; then
409     err "Found $python_version, but LLVM requires Python 2.4-2.7"
410 fi
411
412 # If we have no git directory then we are probably a tarball distribution
413 # and shouldn't attempt to load submodules
414 if [ ! -e ${CFG_SRC_DIR}.git ]
415 then
416     probe CFG_GIT          git
417     msg "git: no git directory. disabling submodules"
418     CFG_DISABLE_MANAGE_SUBMODULES=1
419 else
420     probe_need CFG_GIT     git
421 fi
422
423 probe CFG_CLANG            clang++
424 probe CFG_GCC              gcc
425 probe CFG_LD               ld
426 probe CFG_VALGRIND         valgrind
427 probe CFG_PERF             perf
428 probe CFG_ISCC             iscc
429 probe CFG_LLNEXTGEN        LLnextgen
430 probe CFG_PANDOC           pandoc
431 probe CFG_PDFLATEX         pdflatex
432 probe CFG_XETEX            xetex
433 probe CFG_LUATEX           luatex
434 probe CFG_NODE             nodejs node
435 probe CFG_GDB              gdb
436 if [ "$CFG_OSTYPE" = "unknown-linux-gnu" ]
437 then
438     probe CFG_PAXCTL           paxctl /sbin/paxctl
439     probe CFG_ZCAT             zcat
440 fi
441
442 if [ ! -z "$CFG_PANDOC" ]
443 then
444     PV_MAJOR_MINOR=$(pandoc --version | grep '^pandoc ' |
445         # extract the first 2 version fields, ignore everything else
446         sed 's/pandoc \([0-9]*\)\.\([0-9]*\).*/\1 \2/')
447
448     # these patterns are shell globs, *not* regexps
449     PV_MAJOR=${PV_MAJOR_MINOR% *}
450     PV_MINOR=${PV_MAJOR_MINOR#* }
451     if [ "$PV_MAJOR" -lt "1" ] || [ "$PV_MINOR" -lt "8" ]
452     then
453                 step_msg "pandoc $PV_MAJOR.$PV_MINOR is too old. disabling"
454                 BAD_PANDOC=1
455     fi
456 fi
457
458 if [ "$CFG_OSTYPE" = "unknown-linux-gnu" ]
459 then
460     if [ ! -z "$CFG_ENABLE_PAX_FLAGS" -a -z "$CFG_PAXCTL" ]
461     then
462         err "enabled PaX markings but no paxctl binary found"
463     fi
464
465     if [ -z "$CFG_DISABLE_PAX_FLAGS" ]
466     then
467         # GRSecurity/PaX detection. This can be very flaky.
468         GRSEC_DETECTED=
469
470         # /dev/grsec only exists if CONFIG_GRKERNSEC_NO_RBAC is not set.
471         # /proc/sys/kernel/grsecurity is not available if Ã‡ONFIG_GRKERNSEC_SYSCTL is not set.
472         if [ -e /dev/grsec -o -d /proc/sys/kernel/grsecurity ]
473         then
474             GRSEC_DETECTED=1
475         # /proc/config.gz is normally only available to root, and only if CONFIG_IKCONFIG_PROC has been set.
476         elif [ -r /proc/config.gz -a ! -z "$CFG_ZCAT" ]
477         then
478             if "$CFG_ZCAT" /proc/config.gz | grep --quiet "CONFIG_GRKERNSEC=y"
479             then
480                 GRSEC_DETECTED=1
481             fi
482         # Flaky.
483         elif grep --quiet grsec /proc/version
484         then
485             GRSEC_DETECTED=1
486         fi
487
488         if [ ! -z "$GRSEC_DETECTED" ]
489         then
490             step_msg "GRSecurity: yes"
491             if [ ! -z "$CFG_PAXCTL" ]
492             then
493                 CFG_ENABLE_PAX_FLAGS=1
494             else
495                 warn "GRSecurity kernel detected but no paxctl binary found: not setting CFG_ENABLE_PAX_FLAGS"
496             fi
497         else
498             step_msg "GRSecurity: no"
499         fi
500     fi
501 fi
502
503 if [ ! -z "$CFG_ENABLE_LOCAL_RUST" ]
504 then
505     if [ ! -f ${CFG_LOCAL_RUST_ROOT}/bin/rustc ]
506     then
507         err "no local rust to use"
508     else
509         LRV=`${CFG_LOCAL_RUST_ROOT}/bin/rustc --version`
510         step_msg "using rustc at: ${CFG_LOCAL_RUST_ROOT} with version: " $LRV
511     fi
512 fi
513
514 # Force freebsd to build with clang; gcc doesn't like us there
515 if [ $CFG_OSTYPE = unknown-freebsd ]
516 then
517     step_msg "on FreeBSD, forcing use of clang"
518     CFG_ENABLE_CLANG=1
519     putvar CFG_ENABLE_CLANG
520 fi
521
522
523 if [ -z "$CFG_ENABLE_CLANG" -a -z "$CFG_GCC" ]
524 then
525     err "either clang or gcc is required"
526 fi
527
528 if [ ! -z "$CFG_LLVM_ROOT" -a -e "$CFG_LLVM_ROOT/bin/llvm-config" ]
529 then
530     step_msg "using custom LLVM at $CFG_LLVM_ROOT"
531
532     LLVM_CONFIG="$CFG_LLVM_ROOT/bin/llvm-config"
533     LLVM_VERSION=$($LLVM_CONFIG --version)
534
535     case $LLVM_VERSION in
536         (3.3|3.3svn|3.2|3.2svn)
537             msg "found ok version of LLVM: $LLVM_VERSION"
538             ;;
539         (*)
540             err "bad LLVM version: $LLVM_VERSION, need >=3.0svn"
541             ;;
542     esac
543 fi
544
545 if [ ! -z "$CFG_ENABLE_CLANG" ]
546 then
547     if [ -z "$CFG_CLANG" ]
548     then
549         err "clang requested but not found"
550     fi
551     CFG_CLANG_VERSION=$("$CFG_CLANG" \
552                       --version \
553                       | grep version \
554                       | sed 's/.*\(version .*\)/\1/' \
555                       | cut -d ' ' -f 2)
556
557     case $CFG_CLANG_VERSION in
558         (3.0svn | 3.0 | 3.1* | 3.2* | 3.3* | 4.0* | 4.1* | 4.2*)
559         step_msg "found ok version of CLANG: $CFG_CLANG_VERSION"
560         CFG_C_COMPILER="clang"
561         ;;
562         (*)
563         err "bad CLANG version: $CFG_CLANG_VERSION, need >=3.0svn"
564         ;;
565     esac
566 else
567     CFG_C_COMPILER="gcc"
568 fi
569
570 # a little post-processing of various config values
571
572 CFG_PREFIX=${CFG_PREFIX%/}
573 CFG_HOST_TRIPLES="$(echo $CFG_HOST_TRIPLES | tr ',' ' ')"
574 CFG_TARGET_TRIPLES="$(echo $CFG_TARGET_TRIPLES | tr ',' ' ')"
575 CFG_SUPPORTED_TARGET_TRIPLES="$(grep ^CC_*=* $CFG_SRC_DIR/mk/platform.mk | sed -e 's/^CC_//' -e 's/\([^=]*\).*/\1/' | xargs)"
576
577 # copy host-triples to target-triples so that hosts are a subset of targets
578 V_TEMP=""
579 for i in $CFG_HOST_TRIPLES $CFG_TARGET_TRIPLES;
580 do
581    echo "$V_TEMP" | grep -qF $i || V_TEMP="$V_TEMP${V_TEMP:+ }$i"
582 done
583 CFG_TARGET_TRIPLES=$V_TEMP
584
585 # check target-specific tool-chains
586 for i in $CFG_TARGET_TRIPLES
587 do
588     L_CHECK=false
589     for j in $CFG_SUPPORTED_TARGET_TRIPLES
590     do
591         if [ $i = $j ]
592         then
593             L_CHECK=true
594         fi
595     done
596
597     if [ $L_CHECK = false ]
598     then
599         err "unsupported target triples \"$i\" found"
600     fi
601
602     case $i in
603         arm-linux-androideabi)
604
605             if [ ! -f $CFG_ANDROID_CROSS_PATH/bin/arm-linux-androideabi-gcc ]
606             then
607                 err "NDK $CFG_ANDROID_CROSS_PATH/bin/arm-linux-androideabi-gcc not found"
608             fi
609             if [ ! -f $CFG_ANDROID_CROSS_PATH/bin/arm-linux-androideabi-g++ ]
610             then
611                 err "NDK $CFG_ANDROID_CROSS_PATH/bin/arm-linux-androideabi-g++ not found"
612             fi
613             if [ ! -f $CFG_ANDROID_CROSS_PATH/bin/arm-linux-androideabi-ar ]
614             then
615                 err "NDK $CFG_ANDROID_CROSS_PATH/bin/arm-linux-androideabi-ar not found"
616             fi
617             ;;
618
619         *)
620             ;;
621     esac
622 done
623
624 if [ -z "$CFG_ENABLE_CLANG" -a -z "$CFG_GCC" ]
625 then
626     err "either clang or gcc is required"
627 fi
628
629 if [ ! -z "$CFG_PERF" ]
630 then
631     HAVE_PERF_LOGFD=`$CFG_PERF stat --log-fd 2>&1 | grep 'unknown option'`
632     if [ -z "$HAVE_PERF_LOGFD" ];
633     then
634         CFG_PERF_WITH_LOGFD=1
635         putvar CFG_PERF_WITH_LOGFD
636     fi
637 fi
638
639 step_msg "making directories"
640
641 for i in \
642     doc doc/core doc/std \
643     dl tmp
644 do
645     make_dir $i
646 done
647
648 make_dir llvm
649 for t in $CFG_HOST_TRIPLES
650 do
651     make_dir llvm/$t
652 done
653
654 make_dir rustllvm
655 for t in $CFG_HOST_TRIPLES
656 do
657     make_dir rustllvm/$t
658 done
659
660 make_dir rt
661 for t in $CFG_TARGET_TRIPLES
662 do
663   make_dir rt/$t
664   for i in                                          \
665     isaac linenoise sync test \
666     arch/i386 arch/x86_64 arch/arm arch/mips  \
667     libuv libuv/src/ares libuv/src/eio libuv/src/ev
668   do
669     make_dir rt/$t/$i
670   done
671 done
672
673 # On windows we just store the libraries in the bin directory because
674 # there's no rpath
675 # FIXME: Thise needs to parameterized over target triples. Do it in platform.mk
676 CFG_LIBDIR=lib
677 if [ "$CFG_OSTYPE" = "pc-mingw32" ]
678 then
679     CFG_LIBDIR=bin
680 fi
681
682 for h in $CFG_HOST_TRIPLES
683 do
684     for t in $CFG_TARGET_TRIPLES
685     do
686         for i in 0 1 2 3
687         do
688             # host bin dir
689             make_dir $h/stage$i/bin
690
691             # host lib dir
692             make_dir $h/stage$i/$CFG_LIBDIR
693
694             # target bin dir
695             make_dir $h/stage$i/$CFG_LIBDIR/rustc/$t/bin
696
697             # target lib dir
698             make_dir $h/stage$i/$CFG_LIBDIR/rustc/$t/$CFG_LIBDIR
699         done
700     done
701
702     make_dir $h/test/run-pass
703     make_dir $h/test/run-pass-fulldeps
704     make_dir $h/test/run-fail
705     make_dir $h/test/compile-fail
706     make_dir $h/test/bench
707     make_dir $h/test/perf
708     make_dir $h/test/pretty
709     make_dir $h/test/debug-info
710     make_dir $h/test/doc-tutorial
711     make_dir $h/test/doc-tutorial-ffi
712     make_dir $h/test/doc-tutorial-macros
713     make_dir $h/test/doc-tutorial-borrowed-ptr
714     make_dir $h/test/doc-tutorial-tasks
715     make_dir $h/test/doc-rust
716 done
717
718 # Configure submodules
719 step_msg "configuring submodules"
720
721 # Have to be in the top of src directory for this
722 if [ -z $CFG_DISABLE_MANAGE_SUBMODULES ]
723 then
724     cd ${CFG_SRC_DIR}
725
726     msg "git: submodule sync"
727     "${CFG_GIT}" submodule --quiet sync
728
729     msg "git: submodule update"
730     "${CFG_GIT}" submodule --quiet update --init
731     need_ok "git failed"
732
733     msg "git: submodule foreach sync"
734     "${CFG_GIT}" submodule --quiet foreach --recursive 'if test -e .gitmodules; then git submodule sync; fi'
735     need_ok "git failed"
736
737     msg "git: submodule foreach update"
738     "${CFG_GIT}" submodule --quiet update --init --recursive
739     need_ok "git failed"
740
741     # NB: this is just for the sake of getting the submodule SHA1 values
742     # and status written into the build log.
743     msg "git: submodule status"
744     "${CFG_GIT}" submodule status --recursive
745
746     msg "git: submodule clobber"
747     "${CFG_GIT}" submodule --quiet foreach --recursive git clean -dxf
748     need_ok "git failed"
749     "${CFG_GIT}" submodule --quiet foreach --recursive git checkout .
750     need_ok "git failed"
751
752     cd ${CFG_BUILD_DIR}
753 fi
754
755 # Configure llvm, only if necessary
756 step_msg "looking at LLVM"
757 CFG_LLVM_SRC_DIR=${CFG_SRC_DIR}src/llvm/
758 for t in $CFG_HOST_TRIPLES
759 do
760     do_reconfigure=1
761
762     if [ -z $CFG_LLVM_ROOT ]
763     then
764         LLVM_BUILD_DIR=${CFG_BUILD_DIR}llvm/$t
765         if [ ! -z "$CFG_DISABLE_OPTIMIZE_LLVM" ]
766         then
767             LLVM_DBG_OPTS="--enable-debug-symbols --disable-optimized"
768             # Just use LLVM straight from its build directory to
769             # avoid 'make install' time
770             LLVM_INST_DIR=$LLVM_BUILD_DIR/Debug+Asserts
771         else
772             LLVM_DBG_OPTS="--enable-optimized"
773             LLVM_INST_DIR=$LLVM_BUILD_DIR/Release+Asserts
774         fi
775     else
776         msg "not reconfiguring LLVM, external LLVM root"
777         # The user is using their own LLVM
778         LLVM_BUILD_DIR=
779         LLVM_INST_DIR=$CFG_LLVM_ROOT
780         do_reconfigure=0
781     fi
782
783
784     if [ ${do_reconfigure} -ne 0 ]
785     then
786     # because git is hilarious, it might have put the module index
787     # in a couple places.
788         index1="${CFG_SRC_DIR}.git/modules/src/llvm/index"
789         index2="${CFG_SRC_DIR}src/llvm/.git/index"
790         for index in ${index1} ${index2}
791         do
792             config_status="${CFG_BUILD_DIR}llvm/$t/config.status"
793             if test -e ${index} -a \
794                     -e ${config_status} -a \
795                     ${config_status} -nt ${index}
796             then
797                 msg "not reconfiguring LLVM, config.status is fresh"
798                 do_reconfigure=0
799             fi
800         done
801     fi
802
803     if [ ${do_reconfigure} -ne 0 ]
804     then
805         msg "configuring LLVM for $t"
806
807         LLVM_TARGETS="--enable-targets=x86,x86_64,arm,mips"
808         LLVM_BUILD="--build=$t"
809         LLVM_HOST="--host=$t"
810         LLVM_TARGET="--target=$t"
811
812         # Disable unused LLVM features
813         LLVM_OPTS="$LLVM_DBG_OPTS --disable-docs \
814                    --enable-bindings=none --disable-threads \
815                    --disable-pthreads"
816
817         if [ "$CFG_C_COMPILER" = "clang" ]
818         then
819             LLVM_CXX_32="clang++ -m32"
820             LLVM_CC_32="clang -m32"
821
822             LLVM_CXX_64="clang++"
823             LLVM_CC_64="clang"
824         else
825             LLVM_CXX_32="g++ -m32"
826             LLVM_CC_32="gcc -m32"
827
828             LLVM_CXX_64="g++"
829             LLVM_CC_64="gcc"
830         fi
831
832         LLVM_CFLAGS_32="-m32"
833         LLVM_CXXFLAGS_32="-m32"
834         LLVM_LDFLAGS_32="-m32"
835
836         LLVM_CFLAGS_64=""
837         LLVM_CXXFLAGS_64=""
838         LLVM_LDFLAGS_64=""
839
840         if echo $t | grep -q x86_64
841         then
842             LLVM_CXX=$LLVM_CXX_64
843             LLVM_CC=$LLVM_CC_64
844             LLVM_CFLAGS=$LLVM_CFLAGS_64
845             LLVM_CXXFLAGS=$LLVM_CXXFLAGS_64
846             LLVM_LDFLAGS=$LLVM_LDFLAGS_64
847         else
848             LLVM_CXX=$LLVM_CXX_32
849             LLVM_CC=$LLVM_CC_32
850             LLVM_CFLAGS=$LLVM_CFLAGS_32
851             LLVM_CXXFLAGS=$LLVM_CXXFLAGS_32
852             LLVM_LDFLAGS=$LLVM_LDFLAGS_32
853         fi
854
855         CXX=$LLVM_CXX
856         CC=$LLVM_CC
857         CFLAGS=$LLVM_CFLAGS
858         CXXFLAGS=$LLVM_CXXFLAGS
859         LDFLAGS=$LLVM_LDFLAGS
860
861         LLVM_FLAGS="$LLVM_TARGETS $LLVM_OPTS $LLVM_BUILD \
862                         $LLVM_HOST $LLVM_TARGET --with-python=$CFG_PYTHON"
863
864         msg "configuring LLVM with:"
865         msg "$LLVM_FLAGS"
866
867         export CXX
868         export CC
869         export CFLAGS
870         export CXXFLAGS
871         export LDFLAGS
872
873         cd $LLVM_BUILD_DIR
874         case $CFG_SRC_DIR in
875             /* | [a-z]:* | [A-Z]:*)
876                 ${CFG_LLVM_SRC_DIR}configure $LLVM_FLAGS
877                 ;;
878             *)
879                 ${CFG_BUILD_DIR}${CFG_LLVM_SRC_DIR}configure \
880                     $LLVM_FLAGS
881                 ;;
882         esac
883         need_ok "LLVM configure failed"
884
885         # Hack the tools Makefile to turn off the clang build
886         sed -i 's/clang//g' tools/Makefile
887
888         cd $CFG_BUILD_DIR
889     fi
890
891     # Construct variables for LLVM build and install directories for
892     # each target. These will be named
893     # CFG_LLVM_BUILD_DIR_${target_triple} but all the hyphens in
894     # target_triple will be converted to underscore, because bash
895     # variables can't contain hyphens. The makefile will then have to
896     # convert back.
897     CFG_LLVM_BUILD_DIR=$(echo CFG_LLVM_BUILD_DIR_${t} | tr - _)
898     CFG_LLVM_INST_DIR=$(echo CFG_LLVM_INST_DIR_${t} | tr - _)
899     eval ${CFG_LLVM_BUILD_DIR}="'$LLVM_BUILD_DIR'"
900     eval ${CFG_LLVM_INST_DIR}="'$LLVM_INST_DIR'"
901 done
902
903
904 step_msg "writing configuration"
905
906 putvar CFG_SRC_DIR
907 putvar CFG_BUILD_DIR
908 putvar CFG_OSTYPE
909 putvar CFG_CPUTYPE
910 putvar CFG_CONFIGURE_ARGS
911 putvar CFG_PREFIX
912 putvar CFG_BUILD_TRIPLE
913 putvar CFG_HOST_TRIPLES
914 putvar CFG_TARGET_TRIPLES
915 putvar CFG_C_COMPILER
916 putvar CFG_LIBDIR
917 putvar CFG_DISABLE_MANAGE_SUBMODULES
918 putvar CFG_ANDROID_CROSS_PATH
919 putvar CFG_MINGW32_CROSS_PATH
920
921 if [ ! -z "$CFG_ENABLE_PAX_FLAGS" ]
922 then
923     putvar CFG_ENABLE_PAX_FLAGS
924     putvar CFG_PAXCTL
925 fi
926
927 if [ ! -z $BAD_PANDOC ]
928 then
929     CFG_PANDOC=
930     putvar CFG_PANDOC
931 fi
932
933 if head -n 1 ${CFG_SRC_DIR}src/snapshots.txt | grep -q '^T'
934 then
935     CFG_IN_TRANSITION=1
936     putvar CFG_IN_TRANSITION
937 fi
938
939 # Valgrind is only reliable on Linux. On Windows it doesn't work at all, and
940 # on the Mac the dynamic linker causes Valgrind to emit a huge stream of
941 # errors.
942 if [ $CFG_OSTYPE != unknown-linux-gnu ] && [ $CFG_OSTYPE != apple-darwin ]
943 then
944     CFG_BAD_VALGRIND=1
945     putvar CFG_BAD_VALGRIND
946 fi
947
948 putvar CFG_LLVM_ROOT
949 putvar CFG_LLVM_SRC_DIR
950
951 for t in $CFG_HOST_TRIPLES
952 do
953     CFG_LLVM_BUILD_DIR=$(echo CFG_LLVM_BUILD_DIR_${t} | tr - _)
954     CFG_LLVM_INST_DIR=$(echo CFG_LLVM_INST_DIR_${t} | tr - _)
955     putvar $CFG_LLVM_BUILD_DIR
956     putvar $CFG_LLVM_INST_DIR
957 done
958
959 # Munge any paths that appear in config.mk back to posix-y
960 perl -i.bak -p -e 's@ ([a-zA-Z]):[/\\]@ /\1/@go;' \
961                -e 's@\\@/@go;' config.tmp
962 rm -f config.tmp.bak
963
964 msg
965 copy_if_changed ${CFG_SRC_DIR}Makefile.in ./Makefile
966 move_if_changed config.tmp config.mk
967 rm -f config.tmp
968 touch config.stamp
969
970 step_msg "complete"