configure 20.5 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 139 140 141 142 143 144 145
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
        if test $isArgValid -eq 0
        then
            err "Option '$arg' is not recognized"
        fi
    done
}

146
valopt() {
147 148
    VAL_OPTIONS="$VAL_OPTIONS $1"

149 150 151 152 153 154 155
    local OP=$1
    local DEFAULT=$2
    shift
    shift
    local DOC="$*"
    if [ $HELP -eq 0 ]
    then
156
        local UOP=$(echo $OP | tr '[:lower:]' '[:upper:]' | tr '\-' '\_')
E
Elly Jones 已提交
157 158
        local V="CFG_${UOP}"
        eval $V="$DEFAULT"
159 160 161 162 163 164 165 166 167 168
        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 已提交
169 170 171 172 173 174
        if [ -z "$DEFAULT" ]
        then
            DEFAULT="<none>"
        fi
        OP="${OP}=[${DEFAULT}]"
        printf "    --%-30s %s\n" "$OP" "$DOC"
175 176 177
    fi
}

178
opt() {
179 180
    BOOL_OPTIONS="$BOOL_OPTIONS $1"

181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201
    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
202
                OP=$(echo $OP | tr 'a-z-' 'A-Z_')
203 204 205 206 207 208 209 210 211 212 213 214 215 216 217
                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
}

218
msg "looking for configure programs"
219
need_cmd cmp
220 221
need_cmd mkdir
need_cmd printf
222
need_cmd cut
G
Graydon Hoare 已提交
223
need_cmd head
224 225 226 227
need_cmd grep
need_cmd xargs
need_cmd cp
need_cmd find
228 229
need_cmd uname
need_cmd date
G
Graydon Hoare 已提交
230
need_cmd tr
P
Patrick Walton 已提交
231
need_cmd sed
232

B
Brian Anderson 已提交
233

234 235 236 237
msg "inspecting environment"

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

239 240 241 242
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 已提交
243
    if sysctl hw.optional.x86_64 | grep -q ': 1'
244 245 246 247
    then
        CFG_CPUTYPE=x86_64
    fi
fi
248

249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278
# 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
        ;;

    *)
        err "unknown OS type: $CFG_OSTYPE"
        ;;
esac


case $CFG_CPUTYPE in

    i386 | i486 | i686 | i786 | x86)
279
        CFG_CPUTYPE=i686
280 281 282 283 284 285
        ;;

    xscale | arm)
        CFG_CPUTYPE=arm
        ;;

U
User Jyyou 已提交
286
    x86_64 | x86-64 | x64 | amd64)
287
        CFG_CPUTYPE=x86_64
288 289 290 291 292 293
        ;;

    *)
        err "unknown CPU type: $CFG_CPUTYPE"
esac

294 295 296 297 298 299 300 301 302 303
# 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


N
Niko Matsakis 已提交
304
DEFAULT_HOST_TRIPLE="${CFG_CPUTYPE}-${CFG_OSTYPE}"
305

306 307 308
CFG_SRC_DIR="$(cd $(dirname $0) && pwd)/"
CFG_BUILD_DIR="$(pwd)/"
CFG_SELF=${CFG_SRC_DIR}$(basename $0)
309 310
CFG_CONFIGURE_ARGS="$@"

311 312 313 314 315 316 317 318 319 320 321 322
OPTIONS=""
HELP=0
if [ "$1" = "--help" ]
then
    HELP=1
    shift
    echo ""
    echo "Usage: $CFG_SELF [options]"
    echo ""
    echo "Options:"
    echo ""
else
323 324
    msg "recreating config.tmp"
    echo '' >config.tmp
325 326 327

    step_msg "processing $CFG_SELF args"
fi
328

329 330 331
BOOL_OPTIONS=""
VAL_OPTIONS=""

332
opt sharedstd 1 "build libstd as a shared library"
M
Mahmut Bulut 已提交
333
opt valgrind 0 "run tests with valgrind (memcheck by default)"
334
opt helgrind 0 "run tests with helgrind instead of memcheck"
335
opt docs     1 "build documentation"
336
opt optimize 1 "build optimized rust code"
N
Niko Matsakis 已提交
337
opt optimize-cxx 1 "build optimized C++ code"
N
Niko Matsakis 已提交
338
opt optimize-llvm 1 "build optimized LLVM"
339
opt debug 0 "build with extra debug fun"
340
opt fast-make 0 "use .gitmodules as timestamp for submodule deps"
341
opt manage-submodules 1 "let the build manage the git submodules"
342
opt mingw-cross 0 "cross-compile for win32 using mingw"
343
opt clang 0 "prefer clang to gcc for building the runtime"
344
opt local-rust 0 "use an installed rustc rather than downloading a snapshot"
345
opt pax-flags 0 "apply PaX flags to rustc binaries (required for GRSecurity/PaX-patched kernels)"
346
valopt prefix "/usr/local" "set installation prefix"
347
valopt local-rust-root "/usr/local" "set prefix for local rust binary"
B
Brian Anderson 已提交
348
valopt llvm-root "" "set LLVM root"
349 350
valopt host-triple "${DEFAULT_HOST_TRIPLE}" "LLVM host triple"
valopt target-triples "${CFG_HOST_TRIPLE}" "LLVM target triples"
351

352 353 354 355
# Validate Options
step_msg "validating $CFG_SELF args"
validate_opt

B
Brian Anderson 已提交
356 357 358 359 360 361
if [ $HELP -eq 1 ]
then
    echo ""
    exit 0
fi

362

363
step_msg "looking for build programs"
B
Brian Anderson 已提交
364

365 366
probe_need CFG_PERL        perl
probe_need CFG_CURL        curl
367 368 369 370 371 372
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
373 374 375 376 377

# 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 已提交
378
    probe CFG_GIT          git
379 380 381
    msg "git: no git directory. disabling submodules"
    CFG_DISABLE_MANAGE_SUBMODULES=1
else
B
Brian Anderson 已提交
382
    probe_need CFG_GIT     git
383 384
fi

385
probe CFG_CLANG            clang++
386
probe CFG_GCC              gcc
387
probe CFG_LD               ld
388
probe CFG_VALGRIND         valgrind
389
probe CFG_PERF             perf
390
probe CFG_ISCC             iscc
391 392 393
probe CFG_LLNEXTGEN        LLnextgen
probe CFG_PANDOC           pandoc
probe CFG_PDFLATEX         pdflatex
394 395
probe CFG_XETEX            xetex
probe CFG_LUATEX           luatex
396
probe CFG_NODE             nodejs node
397
probe CFG_GDB              gdb
398 399 400 401 402
if [ "$CFG_OSTYPE" = "unknown-linux-gnu" ]
then
    probe CFG_PAXCTL           paxctl /sbin/paxctl
    probe CFG_ZCAT             zcat
fi
403

404 405
if [ ! -z "$CFG_PANDOC" ]
then
406 407 408 409 410 411
    PANDOC_VER_LINE=$(pandoc --version | grep '^pandoc ')
    PANDOC_VER=${PANDOC_VER_LINE#pandoc }
    PV_MAJOR_MINOR=${PANDOC_VER%.[0-9]*}
    PV_MAJOR=${PV_MAJOR_MINOR%%[.][0-9]*}
    PV_MINOR=${PV_MAJOR_MINOR#[0-9]*[.]}
    PV_MINOR=${PV_MINOR%%[.][0-9]*}
412
    if [ "$PV_MAJOR" -lt "1" ] || [ "$PV_MINOR" -lt "8" ]
413
    then
414 415
		step_msg "pandoc $PV_MAJOR.$PV_MINOR is too old. disabling"
		BAD_PANDOC=1
416 417 418
    fi
fi

419 420
if [ "$CFG_OSTYPE" = "unknown-linux-gnu" ]
then
421
    if [ ! -z "$CFG_ENABLE_PAX_FLAGS" -a -z "$CFG_PAXCTL" ]
422 423 424 425
    then
        err "enabled PaX markings but no paxctl binary found"
    fi

426
    if [ -z "$CFG_DISABLE_PAX_FLAGS" ]
427 428 429 430 431
    then
        # GRSecurity/PaX detection. This can be very flaky.
        GRSEC_DETECTED=

        # /dev/grsec only exists if CONFIG_GRKERNSEC_NO_RBAC is not set.
432
        # /proc/sys/kernel/grsecurity is not available if ÇONFIG_GRKERNSEC_SYSCTL is not set.
433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453
        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
454
                CFG_ENABLE_PAX_FLAGS=1
455
            else
456
                warn "GRSecurity kernel detected but no paxctl binary found: not setting CFG_ENABLE_PAX_FLAGS"
457 458 459 460 461 462 463
            fi
        else
            step_msg "GRSecurity: no"
        fi
    fi
fi

464
if [ ! -z "$CFG_ENABLE_LOCAL_RUST" ]
465
then
466 467 468 469 470 471 472
    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
473 474
fi

475 476 477 478 479 480 481 482 483
# 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


484
if [ -z "$CFG_ENABLE_CLANG" -a -z "$CFG_GCC" ]
485 486 487 488
then
    err "either clang or gcc is required"
fi

489 490
if [ ! -z "$CFG_LLVM_ROOT" -a -e "$CFG_LLVM_ROOT/bin/llvm-config" ]
then
491
    step_msg "using custom LLVM at $CFG_LLVM_ROOT"
492 493

    LLVM_CONFIG="$CFG_LLVM_ROOT/bin/llvm-config"
494
    LLVM_VERSION=$($LLVM_CONFIG --version)
495 496

    case $LLVM_VERSION in
497
	(3.1svn|3.1|3.0svn|3.0)
B
Brian Anderson 已提交
498
	    msg "found ok version of LLVM: $LLVM_VERSION"
499 500
	    ;;
	(*)
501
	    err "bad LLVM version: $LLVM_VERSION, need >=3.0svn"
502 503
	    ;;
    esac
504 505
fi

506
if [ ! -z "$CFG_ENABLE_CLANG" ]
507
then
508 509 510 511
    if [ -z "$CFG_CLANG" ]
    then
	err "clang requested but not found"
    fi
512 513 514
    CFG_CLANG_VERSION=$("$CFG_CLANG" \
                      --version \
                      | grep version \
J
Jyun-Yan You 已提交
515 516
                      | sed 's/.*\(version .*\)/\1/' \
                      | cut -d ' ' -f 2)
517 518

    case $CFG_CLANG_VERSION in
519
        (3.0svn | 3.0 | 3.1* | 3.2* | 4.0* | 4.1* | 4.2*)
520
        step_msg "found ok version of CLANG: $CFG_CLANG_VERSION"
521
        CFG_C_COMPILER="clang"
522 523
        ;;
        (*)
B
Brian Anderson 已提交
524
        err "bad CLANG version: $CFG_CLANG_VERSION, need >=3.0svn"
525 526
        ;;
    esac
527 528
else
    CFG_C_COMPILER="gcc"
529
fi
530

531
# a little post-processing of various config values
532

533 534
CFG_PREFIX=${CFG_PREFIX%/}
CFG_TARGET_TRIPLES="$(echo $CFG_TARGET_TRIPLES | tr ',' ' ')"
N
Niko Matsakis 已提交
535 536 537 538 539 540 541 542 543
case $CFG_TARGET_TRIPLES in
    (*$CFG_HOST_TRIPLE*) ;;
    (*) err "Host triple is not among the target triples." ;;
esac

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

545 546
if [ ! -z "$CFG_PERF" ]
then
G
Graydon Hoare 已提交
547
    HAVE_PERF_LOGFD=`$CFG_PERF stat --log-fd 2>&1 | grep 'unknown option'`
548 549 550 551 552 553 554
    if [ -z "$HAVE_PERF_LOGFD" ];
    then
        CFG_PERF_WITH_LOGFD=1
        putvar CFG_PERF_WITH_LOGFD
    fi
fi

555
step_msg "making directories"
556

557
for i in \
558
    doc doc/core doc/std \
559
    dl tmp
560 561 562 563
do
    make_dir $i
done

564 565 566 567 568 569
make_dir llvm
for t in $CFG_TARGET_TRIPLES
do
    make_dir llvm/$t
done

570 571 572 573 574 575
make_dir rustllvm
for t in $CFG_TARGET_TRIPLES
do
    make_dir rustllvm/$t
done

576 577 578 579
make_dir rt
for t in $CFG_TARGET_TRIPLES
do
  make_dir rt/$t
G
Graydon Hoare 已提交
580 581
  for i in                                    \
    isaac linenoise sync test libuv libuv/src \
J
Jyun-Yan You 已提交
582
    arch/i386 arch/x86_64 arch/arm arch/mips
583 584 585 586 587
  do
    make_dir rt/$t/$i
  done
done

588 589 590 591 592 593 594 595
# On windows we just store the libraries in the bin directory because
# there's no rpath
CFG_LIBDIR=lib
if [ "$CFG_OSTYPE" = "pc-mingw32" ]
then
    CFG_LIBDIR=bin
fi

N
Niko Matsakis 已提交
596
for h in $CFG_TARGET_TRIPLES
597
do
N
Niko Matsakis 已提交
598
    for t in $CFG_TARGET_TRIPLES
599
    do
N
Niko Matsakis 已提交
600 601 602 603
        for i in 0 1 2 3
        do
            # host bin dir
            make_dir $h/stage$i/bin
604

N
Niko Matsakis 已提交
605
            # host lib dir
606
            make_dir $h/stage$i/$CFG_LIBDIR
607

N
Niko Matsakis 已提交
608
            # target bin dir
609
            make_dir $h/stage$i/$CFG_LIBDIR/rustc/$t/bin
610

N
Niko Matsakis 已提交
611
            # target lib dir
612
            make_dir $h/stage$i/$CFG_LIBDIR/rustc/$t/$CFG_LIBDIR
N
Niko Matsakis 已提交
613
        done
614
    done
N
Niko Matsakis 已提交
615 616

    make_dir $h/test/run-pass
617
    make_dir $h/test/run-pass-fulldeps
N
Niko Matsakis 已提交
618 619 620 621 622
    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 已提交
623
    make_dir $h/test/debug-info
B
Brian Anderson 已提交
624
    make_dir $h/test/doc-tutorial
625 626 627
    make_dir $h/test/doc-tutorial-ffi
    make_dir $h/test/doc-tutorial-macros
    make_dir $h/test/doc-tutorial-borrowed-ptr
628
    make_dir $h/test/doc-tutorial-tasks
629
    make_dir $h/test/doc-rust
630 631
done

632 633 634 635
# Configure submodules
step_msg "configuring submodules"

# Have to be in the top of src directory for this
636 637
if [ -z $CFG_DISABLE_MANAGE_SUBMODULES ]
then
638
    cd ${CFG_SRC_DIR}
639

640
    msg "git: submodule sync"
641 642 643
    "${CFG_GIT}" submodule --quiet sync

    msg "git: submodule update"
644
    "${CFG_GIT}" submodule --quiet update --init
645 646
    need_ok "git failed"

647
    msg "git: submodule foreach sync"
648
    "${CFG_GIT}" submodule --quiet foreach --recursive 'if test -e .gitmodules; then git submodule sync; fi'
649 650
    need_ok "git failed"

651 652 653 654 655 656 657 658 659
    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

660 661 662 663 664 665
    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"

666
    cd ${CFG_BUILD_DIR}
667 668
fi

669 670
# Configure llvm, only if necessary
step_msg "looking at LLVM"
671
CFG_LLVM_SRC_DIR=${CFG_SRC_DIR}src/llvm/
672 673
for t in $CFG_TARGET_TRIPLES
do
674 675
    do_reconfigure=1

676 677
    if [ -z $CFG_LLVM_ROOT ]
    then
678
        LLVM_BUILD_DIR=${CFG_BUILD_DIR}llvm/$t
679 680
        if [ ! -z "$CFG_DISABLE_OPTIMIZE_LLVM" ]
        then
B
Brian Anderson 已提交
681
            LLVM_DBG_OPTS="--enable-debug-symbols --disable-optimized"
682 683 684 685 686 687 688 689 690 691 692 693 694 695
            # 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
696

N
Niko Matsakis 已提交
697

698
    if [ ${do_reconfigure} -ne 0 ]
N
Niko Matsakis 已提交
699
    then
700 701 702 703 704 705
    # 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
706
            config_status="${CFG_BUILD_DIR}llvm/$t/config.status"
707 708 709 710 711 712 713 714
            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 已提交
715
    fi
716 717 718 719 720

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

J
Jyun-Yan You 已提交
721
        LLVM_TARGETS="--enable-targets=x86,x86_64,arm,mips"
722 723 724 725 726
        LLVM_BUILD="--build=$t"
        LLVM_HOST="--host=$t"
        LLVM_TARGET="--target=$t"

        # Disable unused LLVM features
Z
Zack Corr 已提交
727
        LLVM_OPTS="$LLVM_DBG_OPTS --disable-docs \
728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789
                   --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]:*)
790
                ${CFG_LLVM_SRC_DIR}configure $LLVM_FLAGS
791 792
                ;;
            *)
793
                ${CFG_BUILD_DIR}${CFG_LLVM_SRC_DIR}configure \
794 795 796 797 798
                    $LLVM_FLAGS
                ;;
        esac
        need_ok "LLVM configure failed"
        cd $CFG_BUILD_DIR
799
    fi
800

801 802 803 804 805 806 807 808 809 810
    # 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 已提交
811 812 813 814 815 816 817 818 819 820
done


step_msg "writing configuration"

putvar CFG_SRC_DIR
putvar CFG_BUILD_DIR
putvar CFG_OSTYPE
putvar CFG_CPUTYPE
putvar CFG_CONFIGURE_ARGS
821
putvar CFG_PREFIX
B
Brian Anderson 已提交
822 823
putvar CFG_TARGET_TRIPLES
putvar CFG_C_COMPILER
824
putvar CFG_LIBDIR
B
Brian Anderson 已提交
825
putvar CFG_DISABLE_MANAGE_SUBMODULES
B
Brian Anderson 已提交
826

827
if [ ! -z "$CFG_ENABLE_PAX_FLAGS" ]
828
then
829
    putvar CFG_ENABLE_PAX_FLAGS
830 831 832
    putvar CFG_PAXCTL
fi

833 834 835 836 837 838
if [ ! -z $BAD_PANDOC ]
then
    CFG_PANDOC=
    putvar CFG_PANDOC
fi

B
Brian Anderson 已提交
839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860
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

for t in $CFG_TARGET_TRIPLES
do
    CFG_LLVM_BUILD_DIR=$(echo CFG_LLVM_BUILD_DIR_${t} | tr - _)
    CFG_LLVM_INST_DIR=$(echo CFG_LLVM_INST_DIR_${t} | tr - _)
861 862 863
    putvar $CFG_LLVM_BUILD_DIR
    putvar $CFG_LLVM_INST_DIR
done
864 865 866

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

B
Brian Anderson 已提交
870
msg
871 872 873
copy_if_changed ${CFG_SRC_DIR}Makefile.in ./Makefile
move_if_changed config.tmp config.mk
rm -f config.tmp
874
touch config.stamp
875

876
step_msg "complete"