]> git.lizzy.rs Git - rust.git/blob - configure
Change all uses of 'when' in alt-patterns to 'if'
[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() {
45     msg "cp $1 $2"
46     cp $1 $2
47 }
48
49 putvar() {
50     local T
51     eval T=\$$1
52     eval TLEN=\${#$1}
53     if [ $TLEN -gt 35 ]
54     then
55         printf "configure: %-20s := %.35s ...\n" $1 "$T"
56     else
57         printf "configure: %-20s := %s\n" $1 "$T"
58     fi
59     printf "%-20s := %s\n" $1 "$T" >>config.mk
60 }
61
62 probe() {
63     local V=$1
64     local P=$2
65     local T
66     T=$(which $P 2>&1)
67     if [ $? -ne 0 ]
68     then
69         T=""
70     fi
71     eval $V=\$T
72     putvar $V
73 }
74
75 probe_need() {
76     local V=$1
77     local P=$2
78     probe $V $P
79     eval VV=\$$V
80     if [ -z "$VV" ]
81     then
82         err "required program '$P' not found"
83     fi
84 }
85
86 valopt() {
87     local OP=$1
88     local DEFAULT=$2
89     shift
90     shift
91     local DOC="$*"
92     if [ $HELP -eq 0 ]
93     then
94         local UOP=$(echo $OP | tr '[:lower:]' '[:upper:]' | tr '\-' '\_')
95         local V="CFG_${UOP}"
96         eval $V="$DEFAULT"
97         for arg in $CFG_CONFIGURE_ARGS
98         do
99             if echo "$arg" | grep -q -- "--$OP="
100             then
101                 val=$(echo "$arg" | cut -f2 -d=)
102                 eval $V=$val
103             fi
104         done
105         putvar $V
106     else
107         if [ -z "$DEFAULT" ]
108         then
109             DEFAULT="<none>"
110         fi
111         OP="${OP}=[${DEFAULT}]"
112         printf "    --%-30s %s\n" "$OP" "$DOC"
113     fi
114 }
115
116 opt() {
117     local OP=$1
118     local DEFAULT=$2
119     shift
120     shift
121     local DOC="$*"
122     local FLAG=""
123
124     if [ $DEFAULT -eq 0 ]
125     then
126         FLAG="enable"
127     else
128         FLAG="disable"
129         DOC="don't $DOC"
130     fi
131
132     if [ $HELP -eq 0 ]
133     then
134         for arg in $CFG_CONFIGURE_ARGS
135         do
136             if [ "$arg" = "--${FLAG}-${OP}" ]
137             then
138                 OP=$(echo $OP | tr 'a-z-' 'A-Z_')
139                 FLAG=$(echo $FLAG | tr 'a-z' 'A-Z')
140                 local V="CFG_${FLAG}_${OP}"
141                 eval $V=1
142                 putvar $V
143             fi
144         done
145     else
146         if [ ! -z "$META" ]
147         then
148             OP="$OP=<$META>"
149         fi
150         printf "    --%-30s %s\n" "$FLAG-$OP" "$DOC"
151      fi
152 }
153
154
155 msg "looking for configure programs"
156 need_cmd mkdir
157 need_cmd printf
158 need_cmd cut
159 need_cmd grep
160 need_cmd xargs
161 need_cmd cp
162 need_cmd find
163 need_cmd uname
164 need_cmd date
165 need_cmd tr
166 need_cmd sed
167
168
169 msg "inspecting environment"
170
171 CFG_OSTYPE=$(uname -s)
172 CFG_CPUTYPE=$(uname -m)
173
174 if [ $CFG_OSTYPE = Darwin -a $CFG_CPUTYPE = i386 ]
175 then
176     # Darwin's `uname -s` lies and always returns i386. We have to use sysctl
177     # instead.
178     if sysctl hw.optional.x86_64 | grep ': 1'
179     then
180         CFG_CPUTYPE=x86_64
181     fi
182 fi
183
184 # The goal here is to come up with the same triple as LLVM would,
185 # at least for the subset of platforms we're willing to target.
186
187 case $CFG_OSTYPE in
188
189     Linux)
190         CFG_OSTYPE=unknown-linux-gnu
191         ;;
192
193     FreeBSD)
194         CFG_OSTYPE=unknown-freebsd
195         ;;
196
197     Darwin)
198         CFG_OSTYPE=apple-darwin
199         ;;
200
201     MINGW32*)
202         CFG_OSTYPE=pc-mingw32
203         ;;
204
205     *)
206         err "unknown OS type: $CFG_OSTYPE"
207         ;;
208 esac
209
210
211 case $CFG_CPUTYPE in
212
213     i386 | i486 | i686 | i786 | x86)
214         CFG_CPUTYPE=i686
215         ;;
216
217     xscale | arm)
218         CFG_CPUTYPE=arm
219         ;;
220
221     x86_64 | x86-64 | x64 | amd64)
222         CFG_CPUTYPE=x86_64
223         ;;
224
225     *)
226         err "unknown CPU type: $CFG_CPUTYPE"
227 esac
228
229 DEFAULT_HOST_TRIPLE="${CFG_CPUTYPE}-${CFG_OSTYPE}"
230
231 CFG_SELF=$(echo $0 | tr '\\' '/')
232 CFG_SRC_DIR=${CFG_SELF%${CFG_SELF##*/}}
233 CFG_BUILD_DIR=$(echo $PWD | tr '\\' '/')
234 CFG_CONFIGURE_ARGS="$@"
235
236 OPTIONS=""
237 HELP=0
238 if [ "$1" = "--help" ]
239 then
240     HELP=1
241     shift
242     echo ""
243     echo "Usage: $CFG_SELF [options]"
244     echo ""
245     echo "Options:"
246     echo ""
247 else
248     msg "recreating config.mk"
249     echo '' >config.mk
250
251     step_msg "processing $CFG_SELF args"
252 fi
253
254 opt sharedstd 1 "build libstd as a shared library"
255 opt valgrind 1 "run tests with valgrind"
256 opt docs     1 "build documentation"
257 opt optimize 1 "build optimized rust code"
258 opt optimize-cxx 1 "build optimized C++ code"
259 opt optimize-llvm 1 "build optimized LLVM"
260 opt manage-submodules 1 "let the build manage the git submodules"
261 opt mingw-cross 0 "cross-compile for win32 using mingw"
262 opt clang 0 "prefer gcc to clang for building the runtime"
263 valopt prefix "/usr/local" "set installation prefix"
264 valopt llvm-root "" "set LLVM root"
265 valopt host-triple "$DEFAULT_HOST_TRIPLE" "primary LLVM host triple"
266 valopt target-triples "" "LLVM target triples (defaults to host if unset)"
267
268 if [ $HELP -eq 1 ]
269 then
270     echo ""
271     exit 0
272 fi
273
274
275 step_msg "looking for build programs"
276
277 probe_need CFG_PERL         perl
278 probe_need CFG_PYTHON       python
279 probe_need CFG_CURL         curl
280
281 probe CFG_GIT              git
282 probe CFG_CLANG            clang++
283 probe CFG_GCC              gcc
284 probe CFG_LLVM_CONFIG      llvm-config
285 probe CFG_VALGRIND         valgrind
286 probe CFG_PERF             perf
287 probe CFG_MAKEINFO         makeinfo
288 probe CFG_TEXI2PDF         texi2pdf
289 probe CFG_TEX              tex
290 probe CFG_MAKENSIS         makensis
291 probe CFG_NATURALDOCS      naturaldocs
292
293 if [ -z "$CFG_ENABLE_CLANG" -a -z "$CFG_GCC" ]
294 then
295     err "either clang or gcc is required"
296 fi
297
298 if [ ! -z "$CFG_LLVM_ROOT" -a -e "$CFG_LLVM_ROOT/bin/llvm-config" ]
299 then
300     step_msg "using custom LLVM at $CFG_LLVM_ROOT"
301
302     LLVM_CONFIG="$CFG_LLVM_ROOT/bin/llvm-config"
303     LLVM_VERSION=$($LLVM_CONFIG --version)
304
305     case $LLVM_VERSION in
306         (3.1svn)
307             msg "found ok version of LLVM: $LLVM_VERSION"
308             ;;
309         (*)
310             err "bad LLVM version: $LLVM_VERSION, need >=3.0svn"
311             ;;
312     esac
313 fi
314
315 if [ ! -z "$CFG_ENABLE_CLANG" ]
316 then
317     if [ -z "$CFG_CLANG" ]
318     then
319         err "clang requested but not found"
320     fi
321     CFG_CLANG_VERSION=$("$CFG_CLANG" \
322                       --version \
323                       | grep version \
324                       | cut -d ' ' -f 3)
325
326     case $CFG_CLANG_VERSION in
327         (3.0svn | 3.0 | 3.1)
328         step_msg "found ok version of CLANG: $CFG_CLANG_VERSION"
329         CFG_C_COMPILER="clang"
330         ;;
331         (*)
332         err "bad CLANG version: $CFG_CLANG_VERSION, need >=3.0svn"
333         ;;
334     esac
335 else
336     CFG_C_COMPILER="gcc"
337 fi
338
339 if [ -z "$CFG_PREFIX" ]
340 then
341     CFG_PREFIX=/usr/local
342 fi
343
344 if [ -z "$CFG_HOST_TRIPLE" ]
345 then
346     CFG_HOST_TRIPLE="$DEFAULT_HOST_TRIPLE"
347 fi
348
349 if [ -z "$CFG_TARGET_TRIPLES" ]
350 then
351     CFG_TARGET_TRIPLES="${CFG_HOST_TRIPLE}"
352 else
353     CFG_TARGET_TRIPLES="$(echo $CFG_TARGET_TRIPLES | tr ',' ' ')"
354 fi
355
356 case $CFG_TARGET_TRIPLES in
357     (*$CFG_HOST_TRIPLE*) ;;
358     (*) err "Host triple is not among the target triples." ;;
359 esac
360
361 if [ -z "$CFG_ENABLE_CLANG" -a -z "$CFG_GCC" ]
362 then
363     err "either clang or gcc is required"
364 fi
365
366 step_msg "making directories"
367
368 for i in \
369     doc doc/core doc/std \
370     nd nd/core nd/std \
371     dl tmp
372 do
373     make_dir $i
374 done
375
376 make_dir llvm
377 for t in $CFG_TARGET_TRIPLES
378 do
379     make_dir llvm/$t
380 done
381
382 make_dir rustllvm
383 for t in $CFG_TARGET_TRIPLES
384 do
385     make_dir rustllvm/$t
386 done
387
388 make_dir rt
389 for t in $CFG_TARGET_TRIPLES
390 do
391   make_dir rt/$t
392   for i in                                          \
393     isaac bigint sync test arch/i386 arch/x86_64    \
394     libuv libuv/src/ares libuv/src/eio libuv/src/ev
395   do
396     make_dir rt/$t/$i
397   done
398 done
399
400 for h in $CFG_TARGET_TRIPLES
401 do
402     for t in $CFG_TARGET_TRIPLES
403     do
404         for i in 0 1 2 3
405         do
406             # host bin dir
407             make_dir $h/stage$i/bin
408
409             # host lib dir
410             make_dir $h/stage$i/lib
411
412             # target bin dir
413             make_dir $h/stage$i/lib/rustc/$t/bin
414
415             # target lib dir
416             make_dir $h/stage$i/lib/rustc/$t/lib
417         done
418     done
419
420     make_dir $h/test/run-pass
421     make_dir $h/test/run-fail
422     make_dir $h/test/compile-fail
423     make_dir $h/test/bench
424     make_dir $h/test/perf
425     make_dir $h/test/pretty
426 done
427
428 # Configure submodules
429 step_msg "configuring submodules"
430
431 # If we have no git directory then we are probably a tarball distribution
432 # and shouldn't attempt to load submodules
433 if [ ! -e ${CFG_SRC_DIR}.git ]
434 then
435     msg "git: no git directory. disabling submodules"
436     CFG_DISABLE_MANAGE_SUBMODULES=1
437 fi
438
439 # Have to be in the top of src directory for this
440 cd ${CFG_SRC_DIR}
441
442 if [ -z $CFG_DISABLE_MANAGE_SUBMODULES ]
443 then
444 SUBMODULE_STATUS=$("${CFG_GIT}" submodule status)
445 NEED_INIT_COUNT=$(echo "$SUBMODULE_STATUS" | grep -c "^-")
446 NEED_UPDATE_COUNT=$(echo "$SUBMODULE_STATUS" | grep -c "^+")
447 NEED_INIT=$(test $NEED_INIT_COUNT -gt 0)$?
448 NEED_UPDATE=$(test "($NEED_INIT)" -o "$NEED_UPDATE_COUNT" -gt 0)$?
449 else
450 NEED_INIT=
451 NEED_UPDATE=
452 fi
453
454 if [ $NEED_INIT ]
455 then
456     msg "git: submodule init"
457     "${CFG_GIT}" submodule init --quiet
458     need_ok "git failed"
459 fi
460
461 if [ $NEED_UPDATE ]
462 then
463     msg "git: submodule update"
464     "${CFG_GIT}" submodule update --quiet
465     need_ok "git failed"
466 fi
467
468 cd ${CFG_BUILD_DIR}
469
470
471 # Configure llvm. Here we go...
472 CFG_LLVM_SRC_DIR=${CFG_SRC_DIR}src/llvm
473
474 for t in $CFG_TARGET_TRIPLES
475 do
476     if [ -z $CFG_LLVM_ROOT ]
477     then
478         step_msg "configuring LLVM for $t"
479
480         LLVM_BUILD_DIR=$CFG_BUILD_DIR/llvm/$t
481
482         LLVM_TARGETS="--enable-targets=x86,x86_64"
483         LLVM_BUILD="--build=$t"
484         LLVM_HOST="--host=$t"
485         LLVM_TARGET="--target=$t"
486
487     if [ ! -z "$CFG_DISABLE_OPTIMIZE_LLVM" ]
488     then
489         LLVM_DBG_OPTS=""
490         # Just use LLVM straight from its build directory to
491         # avoid 'make install' time
492             LLVM_INST_DIR=$LLVM_BUILD_DIR/Debug+Asserts
493     else
494         LLVM_DBG_OPTS="--enable-optimized"
495             LLVM_INST_DIR=$LLVM_BUILD_DIR/Release+Asserts
496     fi
497         # Disable unused LLVM features
498         LLVM_OPTS="$LLVM_DBG_OPTS --disable-docs --disable-jit --enable-bindings=none --disable-threads --disable-pthreads"
499
500         LLVM_CXX_32="g++ -m32"
501         LLVM_CC_32="gcc -m32"
502         LLVM_CFLAGS_32="-m32"
503         LLVM_CXXFLAGS_32="-m32"
504         LLVM_LDFLAGS_32="-m32"
505
506         LLVM_CXX_64="g++"
507         LLVM_CC_64="gcc"
508         LLVM_CFLAGS_64=""
509         LLVM_CXXFLAGS_64=""
510         LLVM_LDFLAGS_64=""
511
512         if echo $t | grep x86_64
513         then
514             LLVM_CXX=$LLVM_CXX_64
515             LLVM_CC=$LLVM_CC_64
516             LLVM_CFLAGS=$LLVM_CFLAGS_64
517             LLVM_CXXFLAGS=$LLVM_CXXFLAGS_64
518             LLVM_LDFLAGS=$LLVM_LDFLAGS_64
519         else
520             LLVM_CXX=$LLVM_CXX_32
521             LLVM_CC=$LLVM_CC_32
522             LLVM_CFLAGS=$LLVM_CFLAGS_32
523             LLVM_CXXFLAGS=$LLVM_CXXFLAGS_32
524             LLVM_LDFLAGS=$LLVM_LDFLAGS_32
525         fi
526
527         CXX=$LLVM_CXX
528         CC=$LLVM_CC
529         CFLAGS=$LLVM_CFLAGS
530         CXXFLAGS=$LLVM_CXXFLAGS
531         LDFLAGS=$LLVM_LDFLAGS
532
533         LLVM_FLAGS="$LLVM_TARGETS $LLVM_OPTS $LLVM_BUILD $LLVM_HOST $LLVM_TARGET"
534
535         msg "configuring LLVM with:"
536         msg "$LLVM_FLAGS"
537
538         export CXX
539         export CC
540         export CFLAGS
541         export CXXFLAGS
542         export LDFLAGS
543
544         cd $LLVM_BUILD_DIR
545         case $CFG_SRC_DIR in
546             /* | [a-z]:* | [A-Z]:*)
547                 ${CFG_LLVM_SRC_DIR}/configure $LLVM_FLAGS
548                 ;;
549             *)
550                 ${CFG_BUILD_DIR}/${CFG_LLVM_SRC_DIR}/configure $LLVM_FLAGS
551                 ;;
552         esac
553     need_ok "LLVM configure failed"
554         cd $CFG_BUILD_DIR
555     else
556         LLVM_BUILD_DIR=
557         # The user is using their own LLVM
558         LLVM_INST_DIR=$CFG_LLVM_ROOT
559     fi
560
561     # Construct variables for LLVM build and install directories for
562     # each target. These will be named
563     # CFG_LLVM_BUILD_DIR_${target_triple} but all the hyphens in
564     # target_triple will be converted to underscore, because bash
565     # variables can't contain hyphens. The makefile will then have to
566     # convert back.
567     CFG_LLVM_BUILD_DIR=$(echo CFG_LLVM_BUILD_DIR_${t} | tr - _)
568     CFG_LLVM_INST_DIR=$(echo CFG_LLVM_INST_DIR_${t} | tr - _)
569     eval ${CFG_LLVM_BUILD_DIR}="'$LLVM_BUILD_DIR'"
570     eval ${CFG_LLVM_INST_DIR}="'$LLVM_INST_DIR'"
571 done
572
573
574 step_msg "writing configuration"
575
576 putvar CFG_SRC_DIR
577 putvar CFG_BUILD_DIR
578 putvar CFG_OSTYPE
579 putvar CFG_CPUTYPE
580 putvar CFG_CONFIGURE_ARGS
581 putvar CFG_HOST_TRIPLE
582 putvar CFG_TARGET_TRIPLES
583 putvar CFG_C_COMPILER
584 putvar CFG_PREFIX
585
586 # Setting this again because it may have been changed
587 if [ $CFG_DISABLE_MANAGE_SUBMODULES ]
588 then
589     putvar CFG_DISABLE_MANAGE_SUBMODULES
590 fi
591
592 if head -n 1 ${CFG_SRC_DIR}src/snapshots.txt | grep -q '^T'
593 then
594     CFG_IN_TRANSITION=1
595     putvar CFG_IN_TRANSITION
596 fi
597
598 # Valgrind is only reliable on Linux. On Windows it doesn't work at all, and
599 # on the Mac the dynamic linker causes Valgrind to emit a huge stream of
600 # errors.
601 if [ $CFG_OSTYPE != unknown-linux-gnu ] && [ $CFG_OSTYPE != apple-darwin ]
602 then
603     CFG_BAD_VALGRIND=1
604     putvar CFG_BAD_VALGRIND
605 fi
606
607 putvar CFG_LLVM_ROOT
608 putvar CFG_LLVM_SRC_DIR
609
610 for t in $CFG_TARGET_TRIPLES
611 do
612     CFG_LLVM_BUILD_DIR=$(echo CFG_LLVM_BUILD_DIR_${t} | tr - _)
613     CFG_LLVM_INST_DIR=$(echo CFG_LLVM_INST_DIR_${t} | tr - _)
614     putvar $CFG_LLVM_BUILD_DIR
615     putvar $CFG_LLVM_INST_DIR
616 done
617
618
619 # Munge any paths that appear in config.mk back to posix-y
620 perl -i.bak -p -e 's@ ([a-zA-Z]):[/\\]@ /\1/@go;' \
621                -e 's@\\@/@go;' config.mk
622 rm -f config.mk.bak
623
624 msg
625 copy ${CFG_SRC_DIR}Makefile.in ./Makefile
626
627 step_msg "complete"