]>
Commit | Line | Data |
---|---|---|
223e47cc LB |
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 | ||
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.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 | |
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" | |
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" |