configure 23.2 KB
Newer Older
1 2
#!/bin/sh

3 4 5
msg() {
    echo "configure: $1"
}
6

7 8 9 10 11 12
step_msg() {
    msg
    msg "$1"
    msg
}

13 14 15 16
warn() {
    echo "configure: WARNING: $1"
}

17 18 19 20 21
err() {
    echo "configure: error: $1"
    exit 1
}

22 23 24 25 26 27
need_ok() {
    if [ $? -ne 0 ]
    then
        err $1
    fi
}
28 29 30 31 32 33 34 35

need_cmd() {
    if which $1 >/dev/null 2>&1
    then msg "found $1"
    else err "need $1"
    fi
}

36 37 38 39 40 41 42 43
make_dir() {
    if [ ! -d $1 ]
    then
        msg "mkdir -p $1"
        mkdir -p $1
    fi
}

44 45 46 47 48 49
copy_if_changed() {
    if cmp -s $1 $2
    then
        msg "leaving $2 unchanged"
    else
        msg "cp $1 $2"
50 51
        cp -f $1 $2
        chmod u-w $2 # make copied artifact read-only
52 53 54 55 56 57 58 59 60
    fi
}

move_if_changed() {
    if cmp -s $1 $2
    then
        msg "leaving $2 unchanged"
    else
        msg "mv $1 $2"
61 62
        mv -f $1 $2
        chmod u-w $2 # make moved artifact read-only
63
    fi
64
}
65

66 67 68
putvar() {
    local T
    eval T=\$$1
69 70 71 72 73
    eval TLEN=\${#$1}
    if [ $TLEN -gt 35 ]
    then
        printf "configure: %-20s := %.35s ...\n" $1 "$T"
    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 80
}

probe() {
    local V=$1
81 82
    shift
    local P
83
    local T
84 85 86 87 88
    for P
    do
        T=$(which $P 2>&1)
        if [ $? -eq 0 ]
        then
89 90 91 92 93 94 95 96
            VER0=$($P --version 2>/dev/null | head -1 \
                |  sed -e 's/[^0-9]*\([vV]\?[0-9.]\+[^ ]*\).*/\1/' )
            if [ $? -eq 0 -a "x${VER0}" != "x" ]
            then
              VER="($VER0)"
            else
              VER=""
            fi
97 98
            break
        else
99
            VER=""
100 101 102
            T=""
        fi
    done
103
    eval $V=\$T
104
    putvar $V "$VER"
105 106
}

107 108
probe_need() {
    local V=$1
109
    probe $*
110 111 112
    eval VV=\$$V
    if [ -z "$VV" ]
    then
113
        err "needed, but unable to find any of: $*"
114 115 116
    fi
}

117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
validate_opt () {
    for arg in $CFG_CONFIGURE_ARGS
    do
        isArgValid=0
        for option in $BOOL_OPTIONS
        do
            if test --disable-$option = $arg
            then
                isArgValid=1
            fi
            if test --enable-$option = $arg
            then
                isArgValid=1
            fi
        done
        for option in $VAL_OPTIONS
        do
            if echo "$arg" | grep -q -- "--$option="
            then
                isArgValid=1
            fi
        done
139
        if [ "$arg" = "--help" ]
140
        then
141 142 143 144 145 146 147 148 149
            echo ""
            echo "No more help available for Configure options,"
            echo "check the Wiki or join our IRC channel"
            break
        else
            if test $isArgValid -eq 0
            then
                err "Option '$arg' is not recognized"
            fi
150 151 152 153
        fi
    done
}

154
valopt() {
155 156
    VAL_OPTIONS="$VAL_OPTIONS $1"

157 158 159 160 161 162 163
    local OP=$1
    local DEFAULT=$2
    shift
    shift
    local DOC="$*"
    if [ $HELP -eq 0 ]
    then
164
        local UOP=$(echo $OP | tr '[:lower:]' '[:upper:]' | tr '\-' '\_')
E
Elly Jones 已提交
165 166
        local V="CFG_${UOP}"
        eval $V="$DEFAULT"
167 168 169 170 171 172 173 174 175 176
        for arg in $CFG_CONFIGURE_ARGS
        do
            if echo "$arg" | grep -q -- "--$OP="
            then
                val=$(echo "$arg" | cut -f2 -d=)
                eval $V=$val
            fi
        done
        putvar $V
    else
E
Elly Jones 已提交
177 178 179 180 181 182
        if [ -z "$DEFAULT" ]
        then
            DEFAULT="<none>"
        fi
        OP="${OP}=[${DEFAULT}]"
        printf "    --%-30s %s\n" "$OP" "$DOC"
183 184 185
    fi
}

186
opt() {
187 188
    BOOL_OPTIONS="$BOOL_OPTIONS $1"

189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209
    local OP=$1
    local DEFAULT=$2
    shift
    shift
    local DOC="$*"
    local FLAG=""

    if [ $DEFAULT -eq 0 ]
    then
        FLAG="enable"
    else
        FLAG="disable"
        DOC="don't $DOC"
    fi

    if [ $HELP -eq 0 ]
    then
        for arg in $CFG_CONFIGURE_ARGS
        do
            if [ "$arg" = "--${FLAG}-${OP}" ]
            then
210
                OP=$(echo $OP | tr 'a-z-' 'A-Z_')
211 212 213 214 215 216 217 218 219 220 221 222 223 224 225
                FLAG=$(echo $FLAG | tr 'a-z' 'A-Z')
                local V="CFG_${FLAG}_${OP}"
                eval $V=1
                putvar $V
            fi
        done
    else
        if [ ! -z "$META" ]
        then
            OP="$OP=<$META>"
        fi
        printf "    --%-30s %s\n" "$FLAG-$OP" "$DOC"
     fi
}

226
msg "looking for configure programs"
227
need_cmd cmp
228 229
need_cmd mkdir
need_cmd printf
230
need_cmd cut
G
Graydon Hoare 已提交
231
need_cmd head
232 233 234 235
need_cmd grep
need_cmd xargs
need_cmd cp
need_cmd find
236 237
need_cmd uname
need_cmd date
G
Graydon Hoare 已提交
238
need_cmd tr
P
Patrick Walton 已提交
239
need_cmd sed
240

B
Brian Anderson 已提交
241

242 243 244 245
msg "inspecting environment"

CFG_OSTYPE=$(uname -s)
CFG_CPUTYPE=$(uname -m)
246

247 248 249 250
if [ $CFG_OSTYPE = Darwin -a $CFG_CPUTYPE = i386 ]
then
    # Darwin's `uname -s` lies and always returns i386. We have to use sysctl
    # instead.
G
Graydon Hoare 已提交
251
    if sysctl hw.optional.x86_64 | grep -q ': 1'
252 253 254 255
    then
        CFG_CPUTYPE=x86_64
    fi
fi
256

257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276
# The goal here is to come up with the same triple as LLVM would,
# at least for the subset of platforms we're willing to target.

case $CFG_OSTYPE in

    Linux)
        CFG_OSTYPE=unknown-linux-gnu
        ;;

    FreeBSD)
        CFG_OSTYPE=unknown-freebsd
        ;;

    Darwin)
        CFG_OSTYPE=apple-darwin
        ;;

    MINGW32*)
        CFG_OSTYPE=pc-mingw32
        ;;
277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295
# Thad's Cygwin identifers below

#   Vista 32 bit
    CYGWIN_NT-6.0)
        CFG_OSTYPE=pc-mingw32
        CFG_CPUTYPE=i686
        ;;

#   Vista 64 bit
    CYGWIN_NT-6.0-WOW64)
        CFG_OSTYPE=w64-mingw32
        CFG_CPUTYPE=x86_64
        ;;

#   Win 7 32 bit
    CYGWIN_NT-6.1)
        CFG_OSTYPE=pc-mingw32
        CFG_CPUTYPE=i686
        ;;
296

297 298 299 300 301 302 303 304
#   Win 7 64 bit
    CYGWIN_NT-6.1-WOW64)
        CFG_OSTYPE=w64-mingw32
        CFG_CPUTYPE=x86_64
        ;;

# We do not detect other OS such as XP/2003 using 64 bit using uname.
# 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 307 308 309 310
    *)
        err "unknown OS type: $CFG_OSTYPE"
        ;;
esac


311 312
if [ -z "$CFG_CPUTYPE" ]
then
313 314 315
case $CFG_CPUTYPE in

    i386 | i486 | i686 | i786 | x86)
316
        CFG_CPUTYPE=i686
317 318 319 320 321 322
        ;;

    xscale | arm)
        CFG_CPUTYPE=arm
        ;;

U
User Jyyou 已提交
323
    x86_64 | x86-64 | x64 | amd64)
324
        CFG_CPUTYPE=x86_64
325 326 327 328 329
        ;;

    *)
        err "unknown CPU type: $CFG_CPUTYPE"
esac
330
fi
331

332 333 334 335 336 337 338 339 340 341
# Detect 64 bit linux systems with 32 bit userland and force 32 bit compilation
if [ $CFG_OSTYPE = unknown-linux-gnu -a $CFG_CPUTYPE = x86_64 ]
then
    file -L "$SHELL" | grep -q "x86[_-]64"
    if [ $? != 0 ]; then
        CFG_CPUTYPE=i686
    fi
fi


342
DEFAULT_BUILD_TRIPLE="${CFG_CPUTYPE}-${CFG_OSTYPE}"
343

344 345 346
CFG_SRC_DIR="$(cd $(dirname $0) && pwd)/"
CFG_BUILD_DIR="$(pwd)/"
CFG_SELF=${CFG_SRC_DIR}$(basename $0)
347 348
CFG_CONFIGURE_ARGS="$@"

349 350 351 352 353 354 355 356 357 358 359 360
OPTIONS=""
HELP=0
if [ "$1" = "--help" ]
then
    HELP=1
    shift
    echo ""
    echo "Usage: $CFG_SELF [options]"
    echo ""
    echo "Options:"
    echo ""
else
361 362
    msg "recreating config.tmp"
    echo '' >config.tmp
363 364 365

    step_msg "processing $CFG_SELF args"
fi
366

367 368 369
BOOL_OPTIONS=""
VAL_OPTIONS=""

370
opt sharedstd 1 "build libstd as a shared library"
M
Mahmut Bulut 已提交
371
opt valgrind 0 "run tests with valgrind (memcheck by default)"
372
opt helgrind 0 "run tests with helgrind instead of memcheck"
373
opt docs     1 "build documentation"
374
opt optimize 1 "build optimized rust code"
N
Niko Matsakis 已提交
375
opt optimize-cxx 1 "build optimized C++ code"
N
Niko Matsakis 已提交
376
opt optimize-llvm 1 "build optimized LLVM"
377
opt debug 0 "build with extra debug fun"
378
opt fast-make 0 "use .gitmodules as timestamp for submodule deps"
379
opt manage-submodules 1 "let the build manage the git submodules"
380
opt mingw-cross 0 "cross-compile for win32 using mingw"
381
opt clang 0 "prefer clang to gcc for building the runtime"
382
opt local-rust 0 "use an installed rustc rather than downloading a snapshot"
383
opt pax-flags 0 "apply PaX flags to rustc binaries (required for GRSecurity/PaX-patched kernels)"
384
valopt prefix "/usr/local" "set installation prefix"
385
valopt local-rust-root "/usr/local" "set prefix for local rust binary"
B
Brian Anderson 已提交
386
valopt llvm-root "" "set LLVM root"
387 388 389
valopt build-triple "${DEFAULT_BUILD_TRIPLE}" "LLVM build triple"
valopt host-triples "${CFG_BUILD_TRIPLE}" "LLVM host triples"
valopt target-triples "${CFG_HOST_TRIPLES}" "LLVM target triples"
390 391
valopt android-cross-path "/opt/ndk_standalone" "Android NDK standalone path"
valopt mingw32-cross-path "" "MinGW32 cross compiler path"
392

393 394 395 396
# Validate Options
step_msg "validating $CFG_SELF args"
validate_opt

B
Brian Anderson 已提交
397 398 399 400 401 402
if [ $HELP -eq 1 ]
then
    echo ""
    exit 0
fi

403

404
step_msg "looking for build programs"
B
Brian Anderson 已提交
405

406 407
probe_need CFG_PERL        perl
probe_need CFG_CURL        curl
408 409 410 411 412 413
probe_need CFG_PYTHON      python2.7 python2.6 python2 python

python_version=$($CFG_PYTHON -V 2>&1)
if [ $(echo $python_version | grep -c '^Python 2\.[4567]') -ne 1 ]; then
    err "Found $python_version, but LLVM requires Python 2.4-2.7"
fi
414 415 416 417 418

# If we have no git directory then we are probably a tarball distribution
# and shouldn't attempt to load submodules
if [ ! -e ${CFG_SRC_DIR}.git ]
then
B
Brian Anderson 已提交
419
    probe CFG_GIT          git
420 421 422
    msg "git: no git directory. disabling submodules"
    CFG_DISABLE_MANAGE_SUBMODULES=1
else
B
Brian Anderson 已提交
423
    probe_need CFG_GIT     git
424 425
fi

426
probe CFG_CLANG            clang++
427
probe CFG_GCC              gcc
428
probe CFG_LD               ld
429
probe CFG_VALGRIND         valgrind
430
probe CFG_PERF             perf
431
probe CFG_ISCC             iscc
432 433 434
probe CFG_LLNEXTGEN        LLnextgen
probe CFG_PANDOC           pandoc
probe CFG_PDFLATEX         pdflatex
435 436
probe CFG_XETEX            xetex
probe CFG_LUATEX           luatex
437
probe CFG_NODE             nodejs node
438
probe CFG_GDB              gdb
439 440 441 442 443
if [ "$CFG_OSTYPE" = "unknown-linux-gnu" ]
then
    probe CFG_PAXCTL           paxctl /sbin/paxctl
    probe CFG_ZCAT             zcat
fi
444

445 446
if [ ! -z "$CFG_PANDOC" ]
then
447 448 449 450 451 452 453
    PV_MAJOR_MINOR=$(pandoc --version | grep '^pandoc ' |
        # extract the first 2 version fields, ignore everything else
        sed 's/pandoc \([0-9]*\)\.\([0-9]*\).*/\1 \2/')

    # these patterns are shell globs, *not* regexps
    PV_MAJOR=${PV_MAJOR_MINOR% *}
    PV_MINOR=${PV_MAJOR_MINOR#* }
454
    if [ "$PV_MAJOR" -lt "1" ] || [ "$PV_MINOR" -lt "8" ]
455
    then
456 457
		step_msg "pandoc $PV_MAJOR.$PV_MINOR is too old. disabling"
		BAD_PANDOC=1
458 459 460
    fi
fi

461 462
if [ "$CFG_OSTYPE" = "unknown-linux-gnu" ]
then
463
    if [ ! -z "$CFG_ENABLE_PAX_FLAGS" -a -z "$CFG_PAXCTL" ]
464 465 466 467
    then
        err "enabled PaX markings but no paxctl binary found"
    fi

468
    if [ -z "$CFG_DISABLE_PAX_FLAGS" ]
469 470 471 472 473
    then
        # GRSecurity/PaX detection. This can be very flaky.
        GRSEC_DETECTED=

        # /dev/grsec only exists if CONFIG_GRKERNSEC_NO_RBAC is not set.
474
        # /proc/sys/kernel/grsecurity is not available if ÇONFIG_GRKERNSEC_SYSCTL is not set.
475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495
        if [ -e /dev/grsec -o -d /proc/sys/kernel/grsecurity ]
        then
            GRSEC_DETECTED=1
        # /proc/config.gz is normally only available to root, and only if CONFIG_IKCONFIG_PROC has been set.
        elif [ -r /proc/config.gz -a ! -z "$CFG_ZCAT" ]
        then
            if "$CFG_ZCAT" /proc/config.gz | grep --quiet "CONFIG_GRKERNSEC=y"
            then
                GRSEC_DETECTED=1
            fi
        # Flaky.
        elif grep --quiet grsec /proc/version
        then
            GRSEC_DETECTED=1
        fi

        if [ ! -z "$GRSEC_DETECTED" ]
        then
            step_msg "GRSecurity: yes"
            if [ ! -z "$CFG_PAXCTL" ]
            then
496
                CFG_ENABLE_PAX_FLAGS=1
497
            else
498
                warn "GRSecurity kernel detected but no paxctl binary found: not setting CFG_ENABLE_PAX_FLAGS"
499 500 501 502 503 504 505
            fi
        else
            step_msg "GRSecurity: no"
        fi
    fi
fi

506
if [ ! -z "$CFG_ENABLE_LOCAL_RUST" ]
507
then
508 509 510 511 512 513 514
    if [ ! -f ${CFG_LOCAL_RUST_ROOT}/bin/rustc ]
    then
        err "no local rust to use"
    else
        LRV=`${CFG_LOCAL_RUST_ROOT}/bin/rustc --version`
        step_msg "using rustc at: ${CFG_LOCAL_RUST_ROOT} with version: " $LRV
    fi
515 516
fi

517 518 519 520 521 522 523 524 525
# Force freebsd to build with clang; gcc doesn't like us there
if [ $CFG_OSTYPE = unknown-freebsd ]
then
    step_msg "on FreeBSD, forcing use of clang"
    CFG_ENABLE_CLANG=1
    putvar CFG_ENABLE_CLANG
fi


526
if [ -z "$CFG_ENABLE_CLANG" -a -z "$CFG_GCC" ]
527 528 529 530
then
    err "either clang or gcc is required"
fi

531 532
if [ ! -z "$CFG_LLVM_ROOT" -a -e "$CFG_LLVM_ROOT/bin/llvm-config" ]
then
533
    step_msg "using custom LLVM at $CFG_LLVM_ROOT"
534 535

    LLVM_CONFIG="$CFG_LLVM_ROOT/bin/llvm-config"
536
    LLVM_VERSION=$($LLVM_CONFIG --version)
537 538

    case $LLVM_VERSION in
539
	(3.1svn|3.1|3.0svn|3.0)
B
Brian Anderson 已提交
540
	    msg "found ok version of LLVM: $LLVM_VERSION"
541 542
	    ;;
	(*)
543
	    err "bad LLVM version: $LLVM_VERSION, need >=3.0svn"
544 545
	    ;;
    esac
546 547
fi

548
if [ ! -z "$CFG_ENABLE_CLANG" ]
549
then
550 551 552 553
    if [ -z "$CFG_CLANG" ]
    then
	err "clang requested but not found"
    fi
554 555 556
    CFG_CLANG_VERSION=$("$CFG_CLANG" \
                      --version \
                      | grep version \
J
Jyun-Yan You 已提交
557 558
                      | sed 's/.*\(version .*\)/\1/' \
                      | cut -d ' ' -f 2)
559 560

    case $CFG_CLANG_VERSION in
561
        (3.0svn | 3.0 | 3.1* | 3.2* | 3.3* | 4.0* | 4.1* | 4.2*)
562
        step_msg "found ok version of CLANG: $CFG_CLANG_VERSION"
563
        CFG_C_COMPILER="clang"
564 565
        ;;
        (*)
B
Brian Anderson 已提交
566
        err "bad CLANG version: $CFG_CLANG_VERSION, need >=3.0svn"
567 568
        ;;
    esac
569 570
else
    CFG_C_COMPILER="gcc"
571
fi
572

573
# a little post-processing of various config values
574

575
CFG_PREFIX=${CFG_PREFIX%/}
B
Brian Anderson 已提交
576
CFG_HOST_TRIPLES="$(echo $CFG_HOST_TRIPLES | tr ',' ' ')"
577
CFG_TARGET_TRIPLES="$(echo $CFG_TARGET_TRIPLES | tr ',' ' ')"
578
CFG_SUPPORTED_TARGET_TRIPLES="$(grep ^CC_*=* $CFG_SRC_DIR/mk/platform.mk | sed 's,^[^_]*_,,' | sed 's/\([^=]*\).*/\1/' | xargs)"
N
Niko Matsakis 已提交
579

580 581 582 583 584 585 586 587 588 589 590
# copy host-triples to target-triples so that hosts are a subset of targets
V_TEMP=""
for i in $CFG_HOST_TRIPLES $CFG_TARGET_TRIPLES;
do
   echo "$V_TEMP" | grep -qF $i || V_TEMP="$V_TEMP${V_TEMP:+ }$i"
done
CFG_TARGET_TRIPLES=$V_TEMP

# check target-specific tool-chains
for i in $CFG_TARGET_TRIPLES
do
591 592 593 594 595 596 597 598 599 600 601 602 603 604
    L_CHECK=false
    for j in $CFG_SUPPORTED_TARGET_TRIPLES
    do
        if [ $i = $j ]
        then
            L_CHECK=true
        fi
    done

    if [ $L_CHECK = false ]
    then
        err "unsupported target triples \"$i\" found"
    fi

605
    case $i in
606
        arm-linux-androideabi)
607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625

            if [ ! -f $CFG_ANDROID_CROSS_PATH/bin/arm-linux-androideabi-gcc ]
            then
                err "NDK $CFG_ANDROID_CROSS_PATH/bin/arm-linux-androideabi-gcc not found"
            fi
            if [ ! -f $CFG_ANDROID_CROSS_PATH/bin/arm-linux-androideabi-g++ ]
            then
                err "NDK $CFG_ANDROID_CROSS_PATH/bin/arm-linux-androideabi-g++ not found"
            fi
            if [ ! -f $CFG_ANDROID_CROSS_PATH/bin/arm-linux-androideabi-ar ]
            then
                err "NDK $CFG_ANDROID_CROSS_PATH/bin/arm-linux-androideabi-ar not found"
            fi
            ;;

        *)
            ;;
    esac
done
N
Niko Matsakis 已提交
626 627 628 629 630

if [ -z "$CFG_ENABLE_CLANG" -a -z "$CFG_GCC" ]
then
    err "either clang or gcc is required"
fi
631

632 633
if [ ! -z "$CFG_PERF" ]
then
G
Graydon Hoare 已提交
634
    HAVE_PERF_LOGFD=`$CFG_PERF stat --log-fd 2>&1 | grep 'unknown option'`
635 636 637 638 639 640 641
    if [ -z "$HAVE_PERF_LOGFD" ];
    then
        CFG_PERF_WITH_LOGFD=1
        putvar CFG_PERF_WITH_LOGFD
    fi
fi

642
step_msg "making directories"
643

644
for i in \
645
    doc doc/core doc/std \
646
    dl tmp
647 648 649 650
do
    make_dir $i
done

651
make_dir llvm
652
for t in $CFG_HOST_TRIPLES
653 654 655 656
do
    make_dir llvm/$t
done

657
make_dir rustllvm
658
for t in $CFG_HOST_TRIPLES
659 660 661 662
do
    make_dir rustllvm/$t
done

663 664 665 666 667
make_dir rt
for t in $CFG_TARGET_TRIPLES
do
  make_dir rt/$t
  for i in                                          \
668 669
    isaac linenoise sync test \
    arch/i386 arch/x86_64 arch/arm arch/mips  \
670
    libuv libuv/src/ares libuv/src/eio libuv/src/ev
671 672 673 674 675
  do
    make_dir rt/$t/$i
  done
done

676 677
# On windows we just store the libraries in the bin directory because
# there's no rpath
678
# FIXME: Thise needs to parameterized over target triples. Do it in platform.mk
679 680 681 682 683 684
CFG_LIBDIR=lib
if [ "$CFG_OSTYPE" = "pc-mingw32" ]
then
    CFG_LIBDIR=bin
fi

685
for h in $CFG_HOST_TRIPLES
686
do
N
Niko Matsakis 已提交
687
    for t in $CFG_TARGET_TRIPLES
688
    do
N
Niko Matsakis 已提交
689 690 691 692
        for i in 0 1 2 3
        do
            # host bin dir
            make_dir $h/stage$i/bin
693

N
Niko Matsakis 已提交
694
            # host lib dir
695
            make_dir $h/stage$i/$CFG_LIBDIR
696

N
Niko Matsakis 已提交
697
            # target bin dir
698
            make_dir $h/stage$i/$CFG_LIBDIR/rustc/$t/bin
699

N
Niko Matsakis 已提交
700
            # target lib dir
701
            make_dir $h/stage$i/$CFG_LIBDIR/rustc/$t/$CFG_LIBDIR
N
Niko Matsakis 已提交
702
        done
703
    done
N
Niko Matsakis 已提交
704 705

    make_dir $h/test/run-pass
706
    make_dir $h/test/run-pass-fulldeps
N
Niko Matsakis 已提交
707 708 709 710 711
    make_dir $h/test/run-fail
    make_dir $h/test/compile-fail
    make_dir $h/test/bench
    make_dir $h/test/perf
    make_dir $h/test/pretty
B
Brian Leibig 已提交
712
    make_dir $h/test/debug-info
B
Brian Anderson 已提交
713
    make_dir $h/test/doc-tutorial
714 715 716
    make_dir $h/test/doc-tutorial-ffi
    make_dir $h/test/doc-tutorial-macros
    make_dir $h/test/doc-tutorial-borrowed-ptr
717
    make_dir $h/test/doc-tutorial-tasks
718
    make_dir $h/test/doc-rust
719 720
done

721 722 723 724
# Configure submodules
step_msg "configuring submodules"

# Have to be in the top of src directory for this
725 726
if [ -z $CFG_DISABLE_MANAGE_SUBMODULES ]
then
727
    cd ${CFG_SRC_DIR}
728

729
    msg "git: submodule sync"
730 731 732
    "${CFG_GIT}" submodule --quiet sync

    msg "git: submodule update"
733
    "${CFG_GIT}" submodule --quiet update --init
734 735
    need_ok "git failed"

736
    msg "git: submodule foreach sync"
737
    "${CFG_GIT}" submodule --quiet foreach --recursive 'if test -e .gitmodules; then git submodule sync; fi'
738 739
    need_ok "git failed"

740 741 742 743 744 745 746 747 748
    msg "git: submodule foreach update"
    "${CFG_GIT}" submodule --quiet update --init --recursive
    need_ok "git failed"

    # NB: this is just for the sake of getting the submodule SHA1 values
    # and status written into the build log.
    msg "git: submodule status"
    "${CFG_GIT}" submodule status --recursive

749 750 751 752 753 754
    msg "git: submodule clobber"
    "${CFG_GIT}" submodule --quiet foreach --recursive git clean -dxf
    need_ok "git failed"
    "${CFG_GIT}" submodule --quiet foreach --recursive git checkout .
    need_ok "git failed"

755
    cd ${CFG_BUILD_DIR}
756 757
fi

758 759
# Configure llvm, only if necessary
step_msg "looking at LLVM"
760
CFG_LLVM_SRC_DIR=${CFG_SRC_DIR}src/llvm/
761
for t in $CFG_HOST_TRIPLES
762
do
763 764
    do_reconfigure=1

765 766
    if [ -z $CFG_LLVM_ROOT ]
    then
767
        LLVM_BUILD_DIR=${CFG_BUILD_DIR}llvm/$t
768 769
        if [ ! -z "$CFG_DISABLE_OPTIMIZE_LLVM" ]
        then
B
Brian Anderson 已提交
770
            LLVM_DBG_OPTS="--enable-debug-symbols --disable-optimized"
771 772 773 774 775 776 777 778 779 780 781 782 783 784
            # Just use LLVM straight from its build directory to
            # avoid 'make install' time
            LLVM_INST_DIR=$LLVM_BUILD_DIR/Debug+Asserts
        else
            LLVM_DBG_OPTS="--enable-optimized"
            LLVM_INST_DIR=$LLVM_BUILD_DIR/Release+Asserts
        fi
    else
        msg "not reconfiguring LLVM, external LLVM root"
        # The user is using their own LLVM
        LLVM_BUILD_DIR=
        LLVM_INST_DIR=$CFG_LLVM_ROOT
        do_reconfigure=0
    fi
785

N
Niko Matsakis 已提交
786

787
    if [ ${do_reconfigure} -ne 0 ]
N
Niko Matsakis 已提交
788
    then
789 790 791 792 793 794
    # because git is hilarious, it might have put the module index
    # in a couple places.
        index1="${CFG_SRC_DIR}.git/modules/src/llvm/index"
        index2="${CFG_SRC_DIR}src/llvm/.git/index"
        for index in ${index1} ${index2}
        do
795
            config_status="${CFG_BUILD_DIR}llvm/$t/config.status"
796 797 798 799 800 801 802 803
            if test -e ${index} -a \
                    -e ${config_status} -a \
                    ${config_status} -nt ${index}
            then
                msg "not reconfiguring LLVM, config.status is fresh"
                do_reconfigure=0
            fi
        done
N
Niko Matsakis 已提交
804
    fi
805 806 807 808 809

    if [ ${do_reconfigure} -ne 0 ]
    then
        msg "configuring LLVM for $t"

J
Jyun-Yan You 已提交
810
        LLVM_TARGETS="--enable-targets=x86,x86_64,arm,mips"
811 812 813 814 815
        LLVM_BUILD="--build=$t"
        LLVM_HOST="--host=$t"
        LLVM_TARGET="--target=$t"

        # Disable unused LLVM features
Z
Zack Corr 已提交
816
        LLVM_OPTS="$LLVM_DBG_OPTS --disable-docs \
817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878
                   --enable-bindings=none --disable-threads \
                   --disable-pthreads"

        if [ "$CFG_C_COMPILER" = "clang" ]
        then
            LLVM_CXX_32="clang++ -m32"
            LLVM_CC_32="clang -m32"

            LLVM_CXX_64="clang++"
            LLVM_CC_64="clang"
        else
            LLVM_CXX_32="g++ -m32"
            LLVM_CC_32="gcc -m32"

            LLVM_CXX_64="g++"
            LLVM_CC_64="gcc"
        fi

        LLVM_CFLAGS_32="-m32"
        LLVM_CXXFLAGS_32="-m32"
        LLVM_LDFLAGS_32="-m32"

        LLVM_CFLAGS_64=""
        LLVM_CXXFLAGS_64=""
        LLVM_LDFLAGS_64=""

        if echo $t | grep -q x86_64
        then
            LLVM_CXX=$LLVM_CXX_64
            LLVM_CC=$LLVM_CC_64
            LLVM_CFLAGS=$LLVM_CFLAGS_64
            LLVM_CXXFLAGS=$LLVM_CXXFLAGS_64
            LLVM_LDFLAGS=$LLVM_LDFLAGS_64
        else
            LLVM_CXX=$LLVM_CXX_32
            LLVM_CC=$LLVM_CC_32
            LLVM_CFLAGS=$LLVM_CFLAGS_32
            LLVM_CXXFLAGS=$LLVM_CXXFLAGS_32
            LLVM_LDFLAGS=$LLVM_LDFLAGS_32
        fi

        CXX=$LLVM_CXX
        CC=$LLVM_CC
        CFLAGS=$LLVM_CFLAGS
        CXXFLAGS=$LLVM_CXXFLAGS
        LDFLAGS=$LLVM_LDFLAGS

        LLVM_FLAGS="$LLVM_TARGETS $LLVM_OPTS $LLVM_BUILD \
                        $LLVM_HOST $LLVM_TARGET"

        msg "configuring LLVM with:"
        msg "$LLVM_FLAGS"

        export CXX
        export CC
        export CFLAGS
        export CXXFLAGS
        export LDFLAGS

        cd $LLVM_BUILD_DIR
        case $CFG_SRC_DIR in
            /* | [a-z]:* | [A-Z]:*)
879
                ${CFG_LLVM_SRC_DIR}configure $LLVM_FLAGS
880 881
                ;;
            *)
882
                ${CFG_BUILD_DIR}${CFG_LLVM_SRC_DIR}configure \
883 884 885 886 887
                    $LLVM_FLAGS
                ;;
        esac
        need_ok "LLVM configure failed"
        cd $CFG_BUILD_DIR
888
    fi
889

890 891 892 893 894 895 896 897 898 899
    # Construct variables for LLVM build and install directories for
    # each target. These will be named
    # CFG_LLVM_BUILD_DIR_${target_triple} but all the hyphens in
    # target_triple will be converted to underscore, because bash
    # variables can't contain hyphens. The makefile will then have to
    # convert back.
    CFG_LLVM_BUILD_DIR=$(echo CFG_LLVM_BUILD_DIR_${t} | tr - _)
    CFG_LLVM_INST_DIR=$(echo CFG_LLVM_INST_DIR_${t} | tr - _)
    eval ${CFG_LLVM_BUILD_DIR}="'$LLVM_BUILD_DIR'"
    eval ${CFG_LLVM_INST_DIR}="'$LLVM_INST_DIR'"
B
Brian Anderson 已提交
900 901 902 903 904 905 906 907 908 909
done


step_msg "writing configuration"

putvar CFG_SRC_DIR
putvar CFG_BUILD_DIR
putvar CFG_OSTYPE
putvar CFG_CPUTYPE
putvar CFG_CONFIGURE_ARGS
910
putvar CFG_PREFIX
911 912
putvar CFG_BUILD_TRIPLE
putvar CFG_HOST_TRIPLES
B
Brian Anderson 已提交
913 914
putvar CFG_TARGET_TRIPLES
putvar CFG_C_COMPILER
915
putvar CFG_LIBDIR
B
Brian Anderson 已提交
916
putvar CFG_DISABLE_MANAGE_SUBMODULES
917 918
putvar CFG_ANDROID_CROSS_PATH
putvar CFG_MINGW32_CROSS_PATH
B
Brian Anderson 已提交
919

920
if [ ! -z "$CFG_ENABLE_PAX_FLAGS" ]
921
then
922
    putvar CFG_ENABLE_PAX_FLAGS
923 924 925
    putvar CFG_PAXCTL
fi

926 927 928 929 930 931
if [ ! -z $BAD_PANDOC ]
then
    CFG_PANDOC=
    putvar CFG_PANDOC
fi

B
Brian Anderson 已提交
932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949
if head -n 1 ${CFG_SRC_DIR}src/snapshots.txt | grep -q '^T'
then
    CFG_IN_TRANSITION=1
    putvar CFG_IN_TRANSITION
fi

# Valgrind is only reliable on Linux. On Windows it doesn't work at all, and
# on the Mac the dynamic linker causes Valgrind to emit a huge stream of
# errors.
if [ $CFG_OSTYPE != unknown-linux-gnu ] && [ $CFG_OSTYPE != apple-darwin ]
then
    CFG_BAD_VALGRIND=1
    putvar CFG_BAD_VALGRIND
fi

putvar CFG_LLVM_ROOT
putvar CFG_LLVM_SRC_DIR

950
for t in $CFG_HOST_TRIPLES
B
Brian Anderson 已提交
951 952 953
do
    CFG_LLVM_BUILD_DIR=$(echo CFG_LLVM_BUILD_DIR_${t} | tr - _)
    CFG_LLVM_INST_DIR=$(echo CFG_LLVM_INST_DIR_${t} | tr - _)
954 955 956
    putvar $CFG_LLVM_BUILD_DIR
    putvar $CFG_LLVM_INST_DIR
done
957 958 959

# Munge any paths that appear in config.mk back to posix-y
perl -i.bak -p -e 's@ ([a-zA-Z]):[/\\]@ /\1/@go;' \
960 961
               -e 's@\\@/@go;' config.tmp
rm -f config.tmp.bak
962

B
Brian Anderson 已提交
963
msg
964 965 966
copy_if_changed ${CFG_SRC_DIR}Makefile.in ./Makefile
move_if_changed config.tmp config.mk
rm -f config.tmp
967
touch config.stamp
968

969
step_msg "complete"