]> git.proxmox.com Git - rustc.git/blame - configure
Imported Upstream version 0.6
[rustc.git] / configure
CommitLineData
223e47cc
LB
1#!/bin/sh
2
3msg() {
4 echo "configure: $1"
5}
6
7step_msg() {
8 msg
9 msg "$1"
10 msg
11}
12
13warn() {
14 echo "configure: WARNING: $1"
15}
16
17err() {
18 echo "configure: error: $1"
19 exit 1
20}
21
22need_ok() {
23 if [ $? -ne 0 ]
24 then
25 err $1
26 fi
27}
28
29need_cmd() {
30 if which $1 >/dev/null 2>&1
31 then msg "found $1"
32 else err "need $1"
33 fi
34}
35
36make_dir() {
37 if [ ! -d $1 ]
38 then
39 msg "mkdir -p $1"
40 mkdir -p $1
41 fi
42}
43
44copy_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
55move_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
66putvar() {
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
79probe() {
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
107probe_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
117validate_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
154valopt() {
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
186opt() {
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
226msg "looking for configure programs"
227need_cmd cmp
228need_cmd mkdir
229need_cmd printf
230need_cmd cut
231need_cmd head
232need_cmd grep
233need_cmd xargs
234need_cmd cp
235need_cmd find
236need_cmd uname
237need_cmd date
238need_cmd tr
239need_cmd sed
240
241
242msg "inspecting environment"
243
244CFG_OSTYPE=$(uname -s)
245CFG_CPUTYPE=$(uname -m)
246
247if [ $CFG_OSTYPE = Darwin -a $CFG_CPUTYPE = i386 ]
248then
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
255fi
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
260case $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 ;;
308esac
309
310
311case $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"
327esac
328
329# Detect 64 bit linux systems with 32 bit userland and force 32 bit compilation
330if [ $CFG_OSTYPE = unknown-linux-gnu -a $CFG_CPUTYPE = x86_64 ]
331then
332 file -L "$SHELL" | grep -q "x86[_-]64"
333 if [ $? != 0 ]; then
334 CFG_CPUTYPE=i686
335 fi
336fi
337
338
339DEFAULT_BUILD_TRIPLE="${CFG_CPUTYPE}-${CFG_OSTYPE}"
340
341CFG_SRC_DIR="$(cd $(dirname $0) && pwd)/"
342CFG_BUILD_DIR="$(pwd)/"
343CFG_SELF=${CFG_SRC_DIR}$(basename $0)
344CFG_CONFIGURE_ARGS="$@"
345
346OPTIONS=""
347HELP=0
348if [ "$1" = "--help" ]
349then
350 HELP=1
351 shift
352 echo ""
353 echo "Usage: $CFG_SELF [options]"
354 echo ""
355 echo "Options:"
356 echo ""
357else
358 msg "recreating config.tmp"
359 echo '' >config.tmp
360
361 step_msg "processing $CFG_SELF args"
362fi
363
364BOOL_OPTIONS=""
365VAL_OPTIONS=""
366
367opt sharedstd 1 "build libstd as a shared library"
368opt valgrind 0 "run tests with valgrind (memcheck by default)"
369opt helgrind 0 "run tests with helgrind instead of memcheck"
370opt docs 1 "build documentation"
371opt optimize 1 "build optimized rust code"
372opt optimize-cxx 1 "build optimized C++ code"
373opt optimize-llvm 1 "build optimized LLVM"
374opt debug 0 "build with extra debug fun"
375opt fast-make 0 "use .gitmodules as timestamp for submodule deps"
376opt manage-submodules 1 "let the build manage the git submodules"
377opt mingw-cross 0 "cross-compile for win32 using mingw"
378opt clang 0 "prefer clang to gcc for building the runtime"
379opt local-rust 0 "use an installed rustc rather than downloading a snapshot"
380opt pax-flags 0 "apply PaX flags to rustc binaries (required for GRSecurity/PaX-patched kernels)"
381valopt prefix "/usr/local" "set installation prefix"
382valopt local-rust-root "/usr/local" "set prefix for local rust binary"
383valopt llvm-root "" "set LLVM root"
384valopt build-triple "${DEFAULT_BUILD_TRIPLE}" "LLVM build triple"
385valopt host-triples "${CFG_BUILD_TRIPLE}" "LLVM host triples"
386valopt target-triples "${CFG_HOST_TRIPLES}" "LLVM target triples"
387valopt android-cross-path "/opt/ndk_standalone" "Android NDK standalone path"
388valopt mingw32-cross-path "" "MinGW32 cross compiler path"
389
390# Validate Options
391step_msg "validating $CFG_SELF args"
392validate_opt
393
394if [ $HELP -eq 1 ]
395then
396 echo ""
397 exit 0
398fi
399
400
401step_msg "looking for build programs"
402
403probe_need CFG_PERL perl
404probe_need CFG_CURL curl
405probe_need CFG_PYTHON python2.7 python2.6 python2 python
406
407python_version=$($CFG_PYTHON -V 2>&1)
408if [ $(echo $python_version | grep -c '^Python 2\.[4567]') -ne 1 ]; then
409 err "Found $python_version, but LLVM requires Python 2.4-2.7"
410fi
411
412# If we have no git directory then we are probably a tarball distribution
413# and shouldn't attempt to load submodules
414if [ ! -e ${CFG_SRC_DIR}.git ]
415then
416 probe CFG_GIT git
417 msg "git: no git directory. disabling submodules"
418 CFG_DISABLE_MANAGE_SUBMODULES=1
419else
420 probe_need CFG_GIT git
421fi
422
423probe CFG_CLANG clang++
424probe CFG_GCC gcc
425probe CFG_LD ld
426probe CFG_VALGRIND valgrind
427probe CFG_PERF perf
428probe CFG_ISCC iscc
429probe CFG_LLNEXTGEN LLnextgen
430probe CFG_PANDOC pandoc
431probe CFG_PDFLATEX pdflatex
432probe CFG_XETEX xetex
433probe CFG_LUATEX luatex
434probe CFG_NODE nodejs node
435probe CFG_GDB gdb
436if [ "$CFG_OSTYPE" = "unknown-linux-gnu" ]
437then
438 probe CFG_PAXCTL paxctl /sbin/paxctl
439 probe CFG_ZCAT zcat
440fi
441
442if [ ! -z "$CFG_PANDOC" ]
443then
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
456fi
457
458if [ "$CFG_OSTYPE" = "unknown-linux-gnu" ]
459then
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
501fi
502
503if [ ! -z "$CFG_ENABLE_LOCAL_RUST" ]
504then
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
512fi
513
514# Force freebsd to build with clang; gcc doesn't like us there
515if [ $CFG_OSTYPE = unknown-freebsd ]
516then
517 step_msg "on FreeBSD, forcing use of clang"
518 CFG_ENABLE_CLANG=1
519 putvar CFG_ENABLE_CLANG
520fi
521
522
523if [ -z "$CFG_ENABLE_CLANG" -a -z "$CFG_GCC" ]
524then
525 err "either clang or gcc is required"
526fi
527
528if [ ! -z "$CFG_LLVM_ROOT" -a -e "$CFG_LLVM_ROOT/bin/llvm-config" ]
529then
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.2svn|3.2|3.1svn|3.1|3.0svn|3.0)
537 msg "found ok version of LLVM: $LLVM_VERSION"
538 ;;
539 (*)
540 err "bad LLVM version: $LLVM_VERSION, need >=3.0svn"
541 ;;
542 esac
543fi
544
545if [ ! -z "$CFG_ENABLE_CLANG" ]
546then
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
566else
567 CFG_C_COMPILER="gcc"
568fi
569
570# a little post-processing of various config values
571
572CFG_PREFIX=${CFG_PREFIX%/}
573CFG_HOST_TRIPLES="$(echo $CFG_HOST_TRIPLES | tr ',' ' ')"
574CFG_TARGET_TRIPLES="$(echo $CFG_TARGET_TRIPLES | tr ',' ' ')"
575CFG_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
578V_TEMP=""
579for i in $CFG_HOST_TRIPLES $CFG_TARGET_TRIPLES;
580do
581 echo "$V_TEMP" | grep -qF $i || V_TEMP="$V_TEMP${V_TEMP:+ }$i"
582done
583CFG_TARGET_TRIPLES=$V_TEMP
584
585# check target-specific tool-chains
586for i in $CFG_TARGET_TRIPLES
587do
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
622done
623
624if [ -z "$CFG_ENABLE_CLANG" -a -z "$CFG_GCC" ]
625then
626 err "either clang or gcc is required"
627fi
628
629if [ ! -z "$CFG_PERF" ]
630then
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
637fi
638
639step_msg "making directories"
640
641for i in \
642 doc doc/core doc/std \
643 dl tmp
644do
645 make_dir $i
646done
647
648make_dir llvm
649for t in $CFG_HOST_TRIPLES
650do
651 make_dir llvm/$t
652done
653
654make_dir rustllvm
655for t in $CFG_HOST_TRIPLES
656do
657 make_dir rustllvm/$t
658done
659
660make_dir rt
661for t in $CFG_TARGET_TRIPLES
662do
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
671done
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
676CFG_LIBDIR=lib
677if [ "$CFG_OSTYPE" = "pc-mingw32" ]
678then
679 CFG_LIBDIR=bin
680fi
681
682for h in $CFG_HOST_TRIPLES
683do
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
716done
717
718# Configure submodules
719step_msg "configuring submodules"
720
721# Have to be in the top of src directory for this
722if [ -z $CFG_DISABLE_MANAGE_SUBMODULES ]
723then
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}
753fi
754
755# Configure llvm, only if necessary
756step_msg "looking at LLVM"
757CFG_LLVM_SRC_DIR=${CFG_SRC_DIR}src/llvm/
758for t in $CFG_HOST_TRIPLES
759do
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"
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'"
901done
902
903
904step_msg "writing configuration"
905
906putvar CFG_SRC_DIR
907putvar CFG_BUILD_DIR
908putvar CFG_OSTYPE
909putvar CFG_CPUTYPE
910putvar CFG_CONFIGURE_ARGS
911putvar CFG_PREFIX
912putvar CFG_BUILD_TRIPLE
913putvar CFG_HOST_TRIPLES
914putvar CFG_TARGET_TRIPLES
915putvar CFG_C_COMPILER
916putvar CFG_LIBDIR
917putvar CFG_DISABLE_MANAGE_SUBMODULES
918putvar CFG_ANDROID_CROSS_PATH
919putvar CFG_MINGW32_CROSS_PATH
920
921if [ ! -z "$CFG_ENABLE_PAX_FLAGS" ]
922then
923 putvar CFG_ENABLE_PAX_FLAGS
924 putvar CFG_PAXCTL
925fi
926
927if [ ! -z $BAD_PANDOC ]
928then
929 CFG_PANDOC=
930 putvar CFG_PANDOC
931fi
932
933if head -n 1 ${CFG_SRC_DIR}src/snapshots.txt | grep -q '^T'
934then
935 CFG_IN_TRANSITION=1
936 putvar CFG_IN_TRANSITION
937fi
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.
942if [ $CFG_OSTYPE != unknown-linux-gnu ] && [ $CFG_OSTYPE != apple-darwin ]
943then
944 CFG_BAD_VALGRIND=1
945 putvar CFG_BAD_VALGRIND
946fi
947
948putvar CFG_LLVM_ROOT
949putvar CFG_LLVM_SRC_DIR
950
951for t in $CFG_HOST_TRIPLES
952do
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
957done
958
959# Munge any paths that appear in config.mk back to posix-y
960perl -i.bak -p -e 's@ ([a-zA-Z]):[/\\]@ /\1/@go;' \
961 -e 's@\\@/@go;' config.tmp
962rm -f config.tmp.bak
963
964msg
965copy_if_changed ${CFG_SRC_DIR}Makefile.in ./Makefile
966move_if_changed config.tmp config.mk
967rm -f config.tmp
968touch config.stamp
969
970step_msg "complete"