configure 36.4 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
need_ok() {
    if [ $? -ne 0 ]
    then
25
        err "$1"
26 27
    fi
}
28 29

need_cmd() {
30
    if command -v $1 >/dev/null 2>&1
S
Steve Klabnik 已提交
31 32
    then msg "found program $1"
    else err "need program $1"
33 34 35
    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 81 82 83 84 85 86 87 88
putpathvar() {
    local T
    eval T=\$$1
    eval TLEN=\${#$1}
    if [ $TLEN -gt 35 ]
    then
        printf "configure: %-20s := %.35s ...\n" $1 "$T"
    else
        printf "configure: %-20s := %s %s\n" $1 "$T" "$2"
    fi
89 90 91 92 93 94
    if [ -z "$T" ]
    then
        printf "%-20s := \n" $1 >>config.tmp
    else
        printf "%-20s := \"%s\"\n" $1 "$T" >>config.tmp
    fi
95 96
}

97 98
probe() {
    local V=$1
99 100
    shift
    local P
101
    local T
102 103
    for P
    do
104
        T=$(command -v $P 2>&1)
105 106
        if [ $? -eq 0 ]
        then
107 108 109 110 111 112 113 114
            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
115 116
            break
        else
117
            VER=""
118 119 120
            T=""
        fi
    done
121
    eval $V=\$T
122
    putpathvar $V "$VER"
123 124
}

125 126
probe_need() {
    local V=$1
127
    probe $*
128 129 130
    eval VV=\$$V
    if [ -z "$VV" ]
    then
131
        err "needed, but unable to find any of: $*"
132 133 134
    fi
}

135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
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
157
        if [ "$arg" = "--help" ]
158
        then
159
            echo
160 161 162 163 164 165 166 167
            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
168 169 170 171
        fi
    done
}

172 173 174 175 176 177 178 179
# `valopt OPTION_NAME DEFAULT DOC` extracts a string-valued option
# from command line, using provided default value for the option if
# not present, and saves it to the generated config.mk.
#
# `valopt_nosave` is much the same, except that it does not save the
# result to config.mk (instead the script should use `putvar` itself
# later on to save it).  `valopt_core` is the core upon which the
# other two are built.
180

181 182 183 184 185 186 187
valopt_core() {
    VAL_OPTIONS="$VAL_OPTIONS $2"

    local SAVE=$1
    local OP=$2
    local DEFAULT=$3
    shift
188 189 190 191 192
    shift
    shift
    local DOC="$*"
    if [ $HELP -eq 0 ]
    then
193
        local UOP=$(echo $OP | tr '[:lower:]' '[:upper:]' | tr '\-' '\_')
E
Elly Jones 已提交
194 195
        local V="CFG_${UOP}"
        eval $V="$DEFAULT"
196 197 198 199 200 201 202 203
        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
204 205 206 207
        if [ "$SAVE" = "save" ]
        then
            putvar $V
        fi
208
    else
E
Elly Jones 已提交
209 210 211 212 213 214
        if [ -z "$DEFAULT" ]
        then
            DEFAULT="<none>"
        fi
        OP="${OP}=[${DEFAULT}]"
        printf "    --%-30s %s\n" "$OP" "$DOC"
215 216 217
    fi
}

218 219 220 221 222 223 224
valopt_nosave() {
    valopt_core nosave "$@"
}

valopt() {
    valopt_core save "$@"
}
225

226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241
# `opt OPTION_NAME DEFAULT DOC` extracts a boolean-valued option from
# command line, using the provided default value (0/1) for the option
# if not present, and saves it to the generated config.mk.
#
# `opt_nosave` is much the same, except that it does not save the
# result to config.mk (instead the script should use `putvar` itself
# later on to save it).  `opt_core` is the core upon which the other
# two are built.

opt_core() {
    BOOL_OPTIONS="$BOOL_OPTIONS $2"

    local SAVE=$1
    local OP=$2
    local DEFAULT=$3
    shift
242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260
    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
261
                OP=$(echo $OP | tr 'a-z-' 'A-Z_')
262 263 264
                FLAG=$(echo $FLAG | tr 'a-z' 'A-Z')
                local V="CFG_${FLAG}_${OP}"
                eval $V=1
265 266 267 268
                if [ "$SAVE" = "save" ]
                then
                   putvar $V
                fi
269 270 271 272 273 274 275 276 277 278 279
            fi
        done
    else
        if [ ! -z "$META" ]
        then
            OP="$OP=<$META>"
        fi
        printf "    --%-30s %s\n" "$FLAG-$OP" "$DOC"
     fi
}

280 281 282 283 284 285 286 287
opt_nosave() {
    opt_core nosave "$@"
}

opt() {
    opt_core save "$@"
}

288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311
envopt() {
    local NAME=$1
    local V="CFG_${NAME}"
    eval VV=\$$V

    # If configure didn't set a value already, then check environment.
    #
    # (It is recommended that the configure script always check the
    # environment before setting any values to envopt variables; see
    # e.g.  how CFG_CC is handled, where it first checks `-z "$CC"`,
    # and issues msg if it ends up employing that provided value.)
    if [ -z "$VV" ]
    then
        eval $V=\$$NAME
        eval VV=\$$V
    fi

    # If script or environment provided a value, save it.
    if [ ! -z "$VV" ]
    then
        putvar $V
    fi
}

312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327
to_llvm_triple() {
    case $1 in
        i686-w64-mingw32) echo i686-pc-windows-gnu ;;
        x86_64-w64-mingw32) echo x86_64-pc-windows-gnu ;;
        *) echo $1 ;;
    esac
}

to_gnu_triple() {
    case $1 in
        i686-pc-windows-gnu) echo i686-w64-mingw32 ;;
        x86_64-pc-windows-gnu) echo x86_64-w64-mingw32 ;;
        *) echo $1 ;;
    esac
}

328
msg "looking for configure programs"
329
need_cmd cmp
330 331
need_cmd mkdir
need_cmd printf
332
need_cmd cut
G
Graydon Hoare 已提交
333
need_cmd head
334 335 336 337
need_cmd grep
need_cmd xargs
need_cmd cp
need_cmd find
338 339
need_cmd uname
need_cmd date
G
Graydon Hoare 已提交
340
need_cmd tr
P
Patrick Walton 已提交
341
need_cmd sed
342
need_cmd file
S
Steve Klabnik 已提交
343
need_cmd make
B
Brian Anderson 已提交
344

345 346 347 348
msg "inspecting environment"

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

350 351 352 353
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 已提交
354
    if sysctl hw.optional.x86_64 | grep -q ': 1'
355 356 357 358
    then
        CFG_CPUTYPE=x86_64
    fi
fi
359

360 361 362 363 364 365 366 367 368 369 370 371 372
# 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
        ;;

M
Michael Neumann 已提交
373 374 375 376
    DragonFly)
        CFG_OSTYPE=unknown-dragonfly
        ;;

D
Dave Huseby 已提交
377 378 379 380
    Bitrig)
        CFG_OSTYPE=unknown-bitrig
        ;;

S
Sébastien Marie 已提交
381
    OpenBSD)
D
Dave Huseby 已提交
382
        CFG_OSTYPE=unknown-openbsd
S
Sébastien Marie 已提交
383 384
       ;;

385 386 387 388
    Darwin)
        CFG_OSTYPE=apple-darwin
        ;;

389 390 391 392 393 394 395
    MINGW*)
        # msys' `uname` does not print gcc configuration, but prints msys
        # configuration. so we cannot believe `uname -m`:
        # msys1 is always i686 and msys2 is always x86_64.
        # instead, msys defines $MSYSTEM which is MINGW32 on i686 and
        # MINGW64 on x86_64.
        CFG_CPUTYPE=i686
396
        CFG_OSTYPE=pc-windows-gnu
397 398 399 400
        if [ "$MSYSTEM" = MINGW64 ]
        then
            CFG_CPUTYPE=x86_64
        fi
K
klutzy 已提交
401 402
        ;;

403 404 405 406
    MSYS*)
        CFG_OSTYPE=pc-windows-gnu
        ;;

407 408 409 410
# Thad's Cygwin identifers below

#   Vista 32 bit
    CYGWIN_NT-6.0)
411
        CFG_OSTYPE=pc-windows-gnu
412 413 414 415 416
        CFG_CPUTYPE=i686
        ;;

#   Vista 64 bit
    CYGWIN_NT-6.0-WOW64)
417
        CFG_OSTYPE=pc-windows-gnu
418 419 420 421 422
        CFG_CPUTYPE=x86_64
        ;;

#   Win 7 32 bit
    CYGWIN_NT-6.1)
423
        CFG_OSTYPE=pc-windows-gnu
424 425
        CFG_CPUTYPE=i686
        ;;
426

427 428
#   Win 7 64 bit
    CYGWIN_NT-6.1-WOW64)
429
        CFG_OSTYPE=pc-windows-gnu
430 431 432 433 434
        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.
435 436 437 438 439 440 441 442 443
    *)
        err "unknown OS type: $CFG_OSTYPE"
        ;;
esac


case $CFG_CPUTYPE in

    i386 | i486 | i686 | i786 | x86)
444
        CFG_CPUTYPE=i686
445 446 447 448 449 450
        ;;

    xscale | arm)
        CFG_CPUTYPE=arm
        ;;

451 452 453 454 455
    armv7l)
        CFG_CPUTYPE=arm
        CFG_OSTYPE="${CFG_OSTYPE}eabihf"
        ;;

A
Akos Kiss 已提交
456 457 458 459
    aarch64)
        CFG_CPUTYPE=aarch64
        ;;

R
Richo Healey 已提交
460 461 462 463
    powerpc)
        CFG_CPUTYPE=powerpc
        ;;

U
User Jyyou 已提交
464
    x86_64 | x86-64 | x64 | amd64)
465
        CFG_CPUTYPE=x86_64
466 467 468 469 470 471
        ;;

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

472 473 474 475 476 477 478 479 480 481
# 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


H
Heather 已提交
482
DEFAULT_BUILD="${CFG_CPUTYPE}-${CFG_OSTYPE}"
483

484 485
CFG_SRC_DIR="$(cd $(dirname $0) && pwd)/"
CFG_BUILD_DIR="$(pwd)/"
486
CFG_SELF="$0"
487 488
CFG_CONFIGURE_ARGS="$@"

489 490 491 492 493 494
OPTIONS=""
HELP=0
if [ "$1" = "--help" ]
then
    HELP=1
    shift
495
    echo
496
    echo "Usage: $CFG_SELF [options]"
497
    echo
498
    echo "Options:"
499
    echo
500
else
501 502
    msg "recreating config.tmp"
    echo '' >config.tmp
503 504 505

    step_msg "processing $CFG_SELF args"
fi
506

507 508 509
BOOL_OPTIONS=""
VAL_OPTIONS=""

M
Mahmut Bulut 已提交
510
opt valgrind 0 "run tests with valgrind (memcheck by default)"
511
opt helgrind 0 "run tests with helgrind instead of memcheck"
512
opt valgrind-rpass 1 "run rpass-valgrind tests with valgrind"
513
opt docs     1 "build documentation"
514
opt optimize 1 "build optimized rust code"
N
Niko Matsakis 已提交
515
opt optimize-cxx 1 "build optimized C++ code"
N
Niko Matsakis 已提交
516
opt optimize-llvm 1 "build optimized LLVM"
517
opt optimize-tests 1 "build tests with optimizations"
518
opt libcpp 1 "build with llvm with libc++ instead of libstdc++ when using clang"
519
opt llvm-assertions 1 "build LLVM with assertions"
520
opt debug 1 "build with extra debug fun"
521
opt fast-make 0 "use .gitmodules as timestamp for submodule deps"
522
opt ccache 0 "invoke gcc/clang via ccache to reuse object files between builds"
523
opt local-rust 0 "use an installed rustc rather than downloading a snapshot"
524
opt llvm-static-stdcpp 0 "statically link to libstdc++ for LLVM"
525
opt rpath 0 "build rpaths into rustc itself"
526
opt nightly 0 "build nightly packages"
527
opt verify-install 1 "verify installed binaries work"
528 529
# This is used by the automation to produce single-target nightlies
opt dist-host-only 0 "only install bins for the host architecture"
530 531
opt inject-std-version 1 "inject the current compiler version of libstd into programs"
opt jemalloc 1 "build liballoc with jemalloc"
532
opt llvm-version-check 1 "don't check if the LLVM version is supported, build anyway"
H
Heather 已提交
533 534 535

valopt localstatedir "/var/lib" "local state directory"
valopt sysconfdir "/etc" "install system configuration files"
536 537 538

valopt datadir "${CFG_PREFIX}/share" "install data"
valopt infodir "${CFG_PREFIX}/share/info" "install additional info"
539 540 541 542 543 544 545 546 547
valopt llvm-root "" "set LLVM root"
valopt jemalloc-root "" "set directory where libjemalloc_pic.a is located"
valopt build "${DEFAULT_BUILD}" "GNUs ./configure syntax LLVM build triple"
valopt android-cross-path "/opt/ndk_standalone" "Android NDK standalone path"

# Many of these are saved below during the "writing configuration" step
# (others are conditionally saved).
opt_nosave manage-submodules 1 "let the build manage the git submodules"
opt_nosave clang 0 "prefer clang to gcc for building the runtime"
548

549 550 551 552 553 554
valopt_nosave prefix "/usr/local" "set installation prefix"
valopt_nosave local-rust-root "/usr/local" "set prefix for local rust binary"
valopt_nosave host "${CFG_BUILD}" "GNUs ./configure syntax LLVM host triples"
valopt_nosave target "${CFG_HOST}" "GNUs ./configure syntax LLVM target triples"
valopt_nosave mandir "${CFG_PREFIX}/share/man" "install man pages in PATH"
valopt_nosave release-channel "dev" "the name of the release channel to build"
555

556 557 558 559 560 561
# Temporarily support old triples until buildbots get updated
CFG_BUILD=$(to_llvm_triple $CFG_BUILD)
putvar CFG_BUILD # Yes, this creates a duplicate entry, but the last one wins.
CFG_HOST=$(to_llvm_triple $CFG_HOST)
CFG_TARGET=$(to_llvm_triple $CFG_TARGET)

562
# On windows we just store the libraries in the bin directory because
563 564
# there's no rpath. This is where the build system itself puts libraries;
# --libdir is used to configure the installation directory.
565
# FIXME: This needs to parameterized over target triples. Do it in platform.mk
566
if [ "$CFG_OSTYPE" = "pc-windows-gnu" ]
567
then
568
    CFG_LIBDIR_RELATIVE=bin
569
else
570 571
    CFG_LIBDIR_RELATIVE=lib
fi
572

573 574 575 576 577 578 579 580 581 582
valopt libdir "${CFG_PREFIX}/${CFG_LIBDIR_RELATIVE}" "install libraries (do not set it on windows platform)"

case "$CFG_LIBDIR" in
    "$CFG_PREFIX"/*) CAT_INC=2;;
    "$CFG_PREFIX"*)  CAT_INC=1;;
    *)
        err "libdir must begin with the prefix. Use --prefix to set it accordingly.";;
esac

CFG_LIBDIR_RELATIVE=`echo ${CFG_LIBDIR} | cut -c$((${#CFG_PREFIX}+${CAT_INC}))-`
583

584 585
if [ "$CFG_OSTYPE" = "pc-windows-gnu" ] && [ "$CFG_LIBDIR_RELATIVE" != "bin" ]; then
    err "libdir on windows should be set to 'bin'"
586
fi
H
Heather 已提交
587

B
Brian Anderson 已提交
588 589
if [ $HELP -eq 1 ]
then
590
    echo
B
Brian Anderson 已提交
591 592 593
    exit 0
fi

594 595 596
# Validate Options
step_msg "validating $CFG_SELF args"
validate_opt
597

598 599
# Validate the release channel
case "$CFG_RELEASE_CHANNEL" in
600
    (dev | nightly | beta | stable)
601 602
	;;
    (*)
603
        err "release channel must be 'dev', 'nightly', 'beta' or 'stable'"
604 605 606 607 608
        ;;
esac

# Continue supporting the old --enable-nightly flag to transition the bots
# XXX Remove me
609
if [ ! -z "$CFG_ENABLE_NIGHTLY" ]
610 611 612
then
    CFG_RELEASE_CHANNEL=nightly
fi
613
putvar CFG_RELEASE_CHANNEL
614

B
Brian Anderson 已提交
615 616 617 618 619 620 621 622 623
# A magic value that allows the compiler to use unstable features
# during the bootstrap even when doing so would normally be an error
# because of feature staging or because the build turns on
# warnings-as-errors and unstable features default to warnings.  The
# build has to match this key in an env var. Meant to be a mild
# deterrent from users just turning on unstable features on the stable
# channel.
# Basing CFG_BOOTSTRAP_KEY on CFG_BOOTSTRAP_KEY lets it get picked up
# during a Makefile reconfig.
624
CFG_BOOTSTRAP_KEY="${CFG_BOOTSTRAP_KEY-`date +%H:%M:%S`}"
B
Brian Anderson 已提交
625 626
putvar CFG_BOOTSTRAP_KEY

627
step_msg "looking for build programs"
B
Brian Anderson 已提交
628

629
probe_need CFG_CURLORWGET  curl wget
630 631 632 633 634 635
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
636 637 638 639 640

# 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 已提交
641
    probe CFG_GIT          git
642 643 644
    msg "git: no git directory. disabling submodules"
    CFG_DISABLE_MANAGE_SUBMODULES=1
else
B
Brian Anderson 已提交
645
    probe_need CFG_GIT     git
646 647
fi

648
probe CFG_CLANG            clang++
649
probe CFG_CCACHE           ccache
650
probe CFG_GCC              gcc
651
probe CFG_LD               ld
652
probe CFG_VALGRIND         valgrind
653
probe CFG_PERF             perf
654
probe CFG_ISCC             iscc
655 656 657
probe CFG_JAVAC            javac
probe CFG_ANTLR4           antlr4
probe CFG_GRUN             grun
658 659
probe CFG_FLEX             flex
probe CFG_BISON            bison
660
probe CFG_PANDOC           pandoc
661
probe CFG_XELATEX          xelatex
662
probe CFG_GDB              gdb
663 664
probe CFG_LLDB             lldb

665 666
if [ ! -z "$CFG_GDB" ]
then
667
    # Store GDB's version
668 669 670 671
    CFG_GDB_VERSION=$($CFG_GDB --version 2>/dev/null | head -1)
    putvar CFG_GDB_VERSION
fi

672 673
if [ ! -z "$CFG_LLDB" ]
then
674 675 676 677
    # Store LLDB's version
    CFG_LLDB_VERSION=$($CFG_LLDB --version 2>/dev/null | head -1)
    putvar CFG_LLDB_VERSION

678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693
    # If CFG_LLDB_PYTHON_DIR is not already set from the outside and valid, try to read it from
    # LLDB via the -P commandline options.
    if [ -z "$CFG_LLDB_PYTHON_DIR" ] || [ ! -d "$CFG_LLDB_PYTHON_DIR" ]
    then
        CFG_LLDB_PYTHON_DIR=$($CFG_LLDB -P)

        # If CFG_LLDB_PYTHON_DIR is not a valid directory, set it to something more readable
        if [ ! -d "$CFG_LLDB_PYTHON_DIR" ]
        then
            CFG_LLDB_PYTHON_DIR="LLDB_PYTHON_DIRECTORY_NOT_FOUND"
        fi

        putvar CFG_LLDB_PYTHON_DIR
    fi
fi

Y
Young-il Choi 已提交
694 695 696 697
step_msg "looking for target specific programs"

probe CFG_ADB        adb

698 699
if [ ! -z "$CFG_PANDOC" ]
then
700 701 702
    PV_MAJOR_MINOR=$(pandoc --version | grep '^pandoc' |
        # Extract "MAJOR MINOR" from Pandoc's version number
        sed -E 's/pandoc(.exe)? ([0-9]+)\.([0-9]+).*/\2 \3/')
703

704 705
    MIN_PV_MAJOR="1"
    MIN_PV_MINOR="9"
706

707 708 709
    # these patterns are shell globs, *not* regexps
    PV_MAJOR=${PV_MAJOR_MINOR% *}
    PV_MINOR=${PV_MAJOR_MINOR#* }
710

711
    if [ "$PV_MAJOR" -lt "$MIN_PV_MAJOR" ] || [ "$PV_MINOR" -lt "$MIN_PV_MINOR" ]
712
    then
713 714
        step_msg "pandoc $PV_MAJOR.$PV_MINOR is too old. Need at least $MIN_PV_MAJOR.$MIN_PV_MINOR. Disabling"
        BAD_PANDOC=1
715
    fi
716 717
fi

K
klutzy 已提交
718
BIN_SUF=
719
if [ "$CFG_OSTYPE" = "pc-windows-gnu" ]
K
klutzy 已提交
720 721 722 723
then
    BIN_SUF=.exe
fi

724
if [ ! -z "$CFG_ENABLE_LOCAL_RUST" ]
725
then
726 727
    system_rustc=$(which rustc)
    if [ -f ${CFG_LOCAL_RUST_ROOT}/bin/rustc${BIN_SUF} ]
728
    then
729 730 731 732 733
        : # everything already configured
    elif [ -n "$system_rustc" ]
    then
        # we assume that rustc is in a /bin directory
        CFG_LOCAL_RUST_ROOT=${system_rustc%/bin/rustc}
734
    else
735
        err "no local rust to use"
736
    fi
737

738 739 740 741 742 743 744
    CMD="${CFG_LOCAL_RUST_ROOT}/bin/rustc${BIN_SUF}"
    LRV=`$CMD --version`
    if [ $? -ne 0 ]
    then
        step_msg "failure while running $CMD --version"
        exit 1
    fi
745 746
    step_msg "using rustc at: ${CFG_LOCAL_RUST_ROOT} with version: $LRV"
    putvar CFG_LOCAL_RUST_ROOT
747 748
fi

749 750 751 752 753 754 755
# 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
fi

D
Dave Huseby 已提交
756 757 758 759 760 761 762
# Force bitrig to build with clang; gcc doesn't like us there
if [ $CFG_OSTYPE = unknown-bitrig ]
then
    step_msg "on Bitrig, forcing use of clang"
    CFG_ENABLE_CLANG=1
fi

763
if [ -z "$CFG_ENABLE_CLANG" -a -z "$CFG_GCC" ]
764 765 766 767
then
    err "either clang or gcc is required"
fi

768 769 770 771 772 773 774 775 776
# OS X 10.9, gcc is actually clang. This can cause some confusion in the build
# system, so if we find that gcc is clang, we should just use clang directly.
if [ $CFG_OSTYPE = apple-darwin -a -z "$CFG_ENABLE_CLANG" ]
then
    CFG_OSX_GCC_VERSION=$("$CFG_GCC" --version 2>&1 | grep "Apple LLVM version")
    if [ $? -eq 0 ]
    then
        step_msg "on OS X 10.9, forcing use of clang"
        CFG_ENABLE_CLANG=1
J
Jan Niklas Hasse 已提交
777
    else
778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795
        if [ $("$CFG_GCC" --version 2>&1 | grep -c ' 4\.[0-6]') -ne 0 ]; then
            step_msg "older GCC found, using clang instead"
            CFG_ENABLE_CLANG=1
        else
            # on OS X, with xcode 5 and newer, certain developers may have
            # cc, gcc and g++ point to a  mixture of clang and gcc
            # if so, this will create very strange build errors
            # this last stanza is to detect some such problems and save the future rust
            # contributor some time solving that issue.
            # this detection could be generalized to other OSes aside from OS X
            # but the issue seems most likely to happen on OS X

            chk_cc () {
                $1 --version 2> /dev/null | grep -q $2
            }
            # check that gcc, cc and g++ all point to the same compiler.
            # note that for xcode 5, g++ points to clang, not clang++
            if !((chk_cc gcc clang  && chk_cc g++ clang) ||
796
                (chk_cc gcc gcc  &&( chk_cc g++ g++ || chk g++ gcc))); then
797
                err "the gcc and g++ in your path point to different compilers.
798
    Check which versions are in your path with gcc --version and g++ --version.
799 800
    To resolve this problem, either fix your PATH  or run configure with --enable-clang"
            fi
801

802
        fi
803 804 805
    fi
fi

806 807 808 809 810 811 812
# Okay, at this point, we have made up our minds about whether we are
# going to force CFG_ENABLE_CLANG or not; save the setting if so.
if [ ! -z "$CFG_ENABLE_CLANG" ]
then
    putvar CFG_ENABLE_CLANG
fi

813
if [ ! -z "$CFG_LLVM_ROOT" -a -z "$CFG_DISABLE_LLVM_VERSION_CHECK" -a -e "$CFG_LLVM_ROOT/bin/llvm-config" ]
814
then
815
    step_msg "using custom LLVM at $CFG_LLVM_ROOT"
816 817

    LLVM_CONFIG="$CFG_LLVM_ROOT/bin/llvm-config"
818
    LLVM_VERSION=$($LLVM_CONFIG --version)
819 820

    case $LLVM_VERSION in
821
        (3.[2-6]*)
822 823 824 825 826
            msg "found ok version of LLVM: $LLVM_VERSION"
            ;;
        (*)
            err "bad LLVM version: $LLVM_VERSION, need >=3.0svn"
            ;;
827
    esac
828 829
fi

830 831 832 833 834 835 836 837 838 839 840 841 842
# Even when the user overrides the choice of CC, still try to detect
# clang to disable some clang-specific warnings.  We here draw a
# distinction between:
#
#  CFG_ENABLE_CLANG : passed --enable-clang, or host "requires" clang,
#  CFG_USING_CLANG : compiler (clang / gcc / $CC) looks like clang.
#
# This distinction is important because there are some safeguards we
# would prefer to skip when merely CFG_USING_CLANG is set; but when
# CFG_ENABLE_CLANG is set, that indicates that we are opting into
# running such safeguards.

if [ ! -z "$CC" ]
843
then
844 845 846 847 848
    msg "skipping compiler inference steps; using provided CC=$CC"
    CFG_CC="$CC"

    CFG_OSX_CC_VERSION=$("$CFG_CC" --version 2>&1 | grep "clang")
    if [ $? -eq 0 ]
849
    then
850 851 852
        step_msg "note, user-provided CC looks like clang; CC=$CC."
        CFG_USING_CLANG=1
        putvar CFG_USING_CLANG
853
    fi
854
else
855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879
    if [ ! -z "$CFG_ENABLE_CLANG" ]
    then
        if [ -z "$CFG_CLANG" ]
        then
            err "clang requested but not found"
        fi
        CFG_CC="$CFG_CLANG"
        CFG_USING_CLANG=1
        putvar CFG_USING_CLANG
    else
        CFG_CC="gcc"
    fi
fi

if [ ! -z "$CFG_ENABLE_CLANG" ]
then
    if [ -z "$CC" ] || [[ $CC == *clang ]]
    then
        CFG_CLANG_VERSION=$($CFG_CC \
            --version \
            | grep version \
            | sed 's/.*\(version .*\)/\1/; s/.*based on \(LLVM .*\))/\1/' \
            | cut -d ' ' -f 2)

        case $CFG_CLANG_VERSION in
B
Björn Steinbrink 已提交
880
            (3.2* | 3.3* | 3.4* | 3.5* | 3.6*)
881 882 883 884
            step_msg "found ok version of CLANG: $CFG_CLANG_VERSION"
            if [ -z "$CC" ]
            then
                CFG_CC="clang"
885
                CFG_CXX="clang++"
886 887 888 889 890 891 892 893 894
            fi
            ;;
            (*)
            err "bad CLANG version: $CFG_CLANG_VERSION, need >=3.0svn"
            ;;
        esac
    else
        msg "skipping CFG_ENABLE_CLANG version check; provided CC=$CC"
    fi
895
fi
896

897 898
if [ ! -z "$CFG_ENABLE_CCACHE" ]
then
899
    if [ -z "$CC" ]
900
    then
901 902 903 904 905 906
        if [ -z "$CFG_CCACHE" ]
        then
            err "ccache requested but not found"
        fi

        CFG_CC="ccache $CFG_CC"
907
    fi
908
fi
909

910 911 912
if [ -z "$CC" -a -z "$CFG_ENABLE_CLANG" -a -z "$CFG_GCC" ]
then
    err "either clang or gcc is required"
913 914
fi

915 916 917 918 919 920 921 922 923 924 925
# All safeguards based on $CFG_ENABLE_CLANG should occur before this
# point in the script; after this point, script logic should inspect
# $CFG_USING_CLANG rather than $CFG_ENABLE_CLANG.

# Set CFG_{CC,CXX,CPP,CFLAGS,CXXFLAGS}
envopt CC
envopt CXX
envopt CPP
envopt CFLAGS
envopt CXXFLAGS

926 927
# a little post-processing of various config values
CFG_PREFIX=${CFG_PREFIX%/}
H
Heather 已提交
928 929 930
CFG_MANDIR=${CFG_MANDIR%/}
CFG_HOST="$(echo $CFG_HOST | tr ',' ' ')"
CFG_TARGET="$(echo $CFG_TARGET | tr ',' ' ')"
931 932 933 934
CFG_SUPPORTED_TARGET=""
for target_file in ${CFG_SRC_DIR}mk/cfg/*.mk; do
  CFG_SUPPORTED_TARGET="${CFG_SUPPORTED_TARGET} $(basename "$target_file" .mk)"
done
N
Niko Matsakis 已提交
935

936 937
# copy host-triples to target-triples so that hosts are a subset of targets
V_TEMP=""
H
Heather 已提交
938
for i in $CFG_HOST $CFG_TARGET;
939 940 941
do
   echo "$V_TEMP" | grep -qF $i || V_TEMP="$V_TEMP${V_TEMP:+ }$i"
done
H
Heather 已提交
942
CFG_TARGET=$V_TEMP
943 944

# check target-specific tool-chains
H
Heather 已提交
945
for i in $CFG_TARGET
946
do
947
    L_CHECK=false
H
Heather 已提交
948
    for j in $CFG_SUPPORTED_TARGET
949 950 951 952 953 954 955 956 957 958 959 960
    do
        if [ $i = $j ]
        then
            L_CHECK=true
        fi
    done

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

961
    case $i in
962
        arm-linux-androideabi)
963 964 965 966 967 968 969 970 971 972 973 974 975 976 977

            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
            ;;

K
kud1ing 已提交
978 979 980 981 982 983 984
        arm-apple-darwin)
            if [ $CFG_OSTYPE != apple-darwin ]
            then
                err "The iOS target is only supported on Mac OS X"
            fi
            ;;

985 986 987 988
        *)
            ;;
    esac
done
N
Niko Matsakis 已提交
989

990 991
if [ ! -z "$CFG_PERF" ]
then
G
Graydon Hoare 已提交
992
    HAVE_PERF_LOGFD=`$CFG_PERF stat --log-fd 2>&1 | grep 'unknown option'`
993 994 995 996 997 998 999
    if [ -z "$HAVE_PERF_LOGFD" ];
    then
        CFG_PERF_WITH_LOGFD=1
        putvar CFG_PERF_WITH_LOGFD
    fi
fi

1000
step_msg "making directories"
1001

1002
for i in \
1003
    doc doc/std doc/extra \
1004
    dl tmp dist
1005 1006 1007 1008
do
    make_dir $i
done

H
Heather 已提交
1009
for t in $CFG_HOST
1010
do
1011
    make_dir $t/llvm
1012 1013
done

H
Heather 已提交
1014
for t in $CFG_HOST
1015
do
1016
    make_dir $t/rustllvm
1017 1018
done

H
Heather 已提交
1019
for t in $CFG_TARGET
1020
do
1021
  make_dir $t/rt
1022
  for s in 0 1 2 3
1023
  do
1024
    make_dir $t/rt/stage$s
D
Daniel Micay 已提交
1025
    make_dir $t/rt/jemalloc
1026
    for i in                                          \
D
Daniel Micay 已提交
1027
      isaac sync test \
R
Richo Healey 已提交
1028
      arch/i386 arch/x86_64 arch/arm arch/aarch64 arch/mips arch/powerpc
1029
    do
1030
      make_dir $t/rt/stage$s/$i
1031
    done
1032 1033 1034
  done
done

1035
for h in $CFG_HOST
1036
do
H
Heather 已提交
1037
    for t in $CFG_TARGET
1038
    do
1039 1040 1041 1042 1043 1044 1045 1046 1047
        # host lib dir stage0
        make_dir $h/stage0/lib

        # target bin dir stage0
        make_dir $h/stage0/lib/rustlib/$t/bin

        # target lib dir stage0
        make_dir $h/stage0/lib/rustlib/$t/lib

N
Niko Matsakis 已提交
1048 1049 1050 1051
        for i in 0 1 2 3
        do
            # host bin dir
            make_dir $h/stage$i/bin
1052

N
Niko Matsakis 已提交
1053
            # host lib dir
1054
            make_dir $h/stage$i/$CFG_LIBDIR_RELATIVE
1055

A
Alex Crichton 已提交
1056 1057 1058
            # host test dir
            make_dir $h/stage$i/test

N
Niko Matsakis 已提交
1059
            # target bin dir
1060
            make_dir $h/stage$i/$CFG_LIBDIR_RELATIVE/rustlib/$t/bin
1061

N
Niko Matsakis 已提交
1062
            # target lib dir
1063
            make_dir $h/stage$i/$CFG_LIBDIR_RELATIVE/rustlib/$t/lib
N
Niko Matsakis 已提交
1064
        done
1065
    done
N
Niko Matsakis 已提交
1066 1067

    make_dir $h/test/run-pass
N
Nick Cameron 已提交
1068
    make_dir $h/test/run-pass-valgrind
1069
    make_dir $h/test/run-pass-fulldeps
N
Niko Matsakis 已提交
1070 1071
    make_dir $h/test/run-fail
    make_dir $h/test/compile-fail
1072
    make_dir $h/test/parse-fail
1073
    make_dir $h/test/compile-fail-fulldeps
N
Niko Matsakis 已提交
1074 1075 1076
    make_dir $h/test/bench
    make_dir $h/test/perf
    make_dir $h/test/pretty
1077 1078
    make_dir $h/test/debuginfo-gdb
    make_dir $h/test/debuginfo-lldb
1079
    make_dir $h/test/codegen
1080 1081
done

1082 1083 1084 1085
# Configure submodules
step_msg "configuring submodules"

# Have to be in the top of src directory for this
1086 1087
if [ -z $CFG_DISABLE_MANAGE_SUBMODULES ]
then
1088
    cd ${CFG_SRC_DIR}
1089

1090
    msg "git: submodule sync"
1091
    "${CFG_GIT}" submodule sync
1092

1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105
    msg "git: submodule init"
    "${CFG_GIT}" submodule init

    # Disable submodules that we're not using
    if [ ! -z "${CFG_LLVM_ROOT}" ]; then
        msg "git: submodule deinit src/llvm"
        "${CFG_GIT}" submodule deinit src/llvm
    fi
    if [ ! -z "${CFG_JEMALLOC_ROOT}" ]; then
        msg "git: submodule deinit src/jemalloc"
        "${CFG_GIT}" submodule deinit src/jemalloc
    fi

1106
    msg "git: submodule update"
1107
    "${CFG_GIT}" submodule update
1108 1109
    need_ok "git failed"

1110
    msg "git: submodule foreach sync"
1111
    "${CFG_GIT}" submodule foreach --recursive 'if test -e .gitmodules; then git submodule sync; fi'
1112 1113
    need_ok "git failed"

1114
    msg "git: submodule foreach update"
1115
    "${CFG_GIT}" submodule update --recursive
1116 1117 1118 1119 1120 1121 1122
    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

1123
    msg "git: submodule clobber"
1124
    "${CFG_GIT}" submodule foreach --recursive git clean -dxf
1125
    need_ok "git failed"
1126
    "${CFG_GIT}" submodule foreach --recursive git checkout .
1127 1128
    need_ok "git failed"

1129
    cd ${CFG_BUILD_DIR}
1130 1131
fi

1132 1133
# Configure llvm, only if necessary
step_msg "looking at LLVM"
1134
CFG_LLVM_SRC_DIR=${CFG_SRC_DIR}src/llvm/
H
Heather 已提交
1135
for t in $CFG_HOST
1136
do
1137 1138
    do_reconfigure=1

1139 1140
    if [ -z $CFG_LLVM_ROOT ]
    then
1141
        LLVM_BUILD_DIR=${CFG_BUILD_DIR}$t/llvm
1142 1143
        if [ ! -z "$CFG_DISABLE_OPTIMIZE_LLVM" ]
        then
B
Brian Anderson 已提交
1144
            LLVM_DBG_OPTS="--enable-debug-symbols --disable-optimized"
1145 1146
            # Just use LLVM straight from its build directory to
            # avoid 'make install' time
1147
            LLVM_INST_DIR=$LLVM_BUILD_DIR/Debug
1148 1149
        else
            LLVM_DBG_OPTS="--enable-optimized"
1150 1151 1152 1153 1154 1155 1156 1157
            LLVM_INST_DIR=$LLVM_BUILD_DIR/Release
        fi
        if [ ! -z "$CFG_DISABLE_LLVM_ASSERTIONS" ]
        then
            LLVM_ASSERTION_OPTS="--disable-assertions"
        else
            LLVM_ASSERTION_OPTS="--enable-assertions"
            LLVM_INST_DIR=${LLVM_INST_DIR}+Asserts
1158 1159 1160 1161 1162 1163 1164 1165
        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
1166

N
Niko Matsakis 已提交
1167

1168
    if [ ${do_reconfigure} -ne 0 ]
N
Niko Matsakis 已提交
1169
    then
1170 1171 1172 1173 1174 1175
    # 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
1176
            config_status="${LLVM_BUILD_DIR}/config.status"
1177 1178 1179 1180 1181 1182 1183 1184
            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 已提交
1185
    fi
1186 1187 1188

    if [ ${do_reconfigure} -ne 0 ]
    then
1189 1190 1191 1192
        # LLVM's configure doesn't recognize the new Windows triples yet
        gnu_t=$(to_gnu_triple $t)

        msg "configuring LLVM for $gnu_t"
1193

R
Richo Healey 已提交
1194
        LLVM_TARGETS="--enable-targets=x86,x86_64,arm,aarch64,mips,powerpc"
1195 1196 1197
        LLVM_BUILD="--build=$gnu_t"
        LLVM_HOST="--host=$gnu_t"
        LLVM_TARGET="--target=$gnu_t"
1198 1199

        # Disable unused LLVM features
1200
        LLVM_OPTS="$LLVM_DBG_OPTS $LLVM_ASSERTION_OPTS --disable-docs --enable-bindings=none"
1201 1202 1203
        # Disable term-info, linkage of which comes in multiple forms,
        # making our snapshots incompatible (#9334)
        LLVM_OPTS="$LLVM_OPTS --disable-terminfo"
1204 1205
        # Try to have LLVM pull in as few dependencies as possible (#9397)
        LLVM_OPTS="$LLVM_OPTS --disable-zlib --disable-libffi"
1206

K
klutzy 已提交
1207 1208 1209
        # Use win32 native thread/lock apis instead of pthread wrapper.
        # (llvm's configure tries to find pthread first, so we have to disable it explicitly.)
        # Also note that pthreads works badly on mingw-w64 systems: #8996
1210
        case "$CFG_BUILD" in
1211
            (*-windows-*)
1212 1213 1214 1215
            LLVM_OPTS="$LLVM_OPTS --disable-pthreads"
            ;;
        esac

1216
        case "$CFG_CC" in
1217
            ("ccache clang")
1218 1219
            LLVM_CXX_32="ccache clang++ -Qunused-arguments"
            LLVM_CC_32="ccache clang -Qunused-arguments"
1220 1221 1222 1223 1224

            LLVM_CXX_64="ccache clang++ -Qunused-arguments"
            LLVM_CC_64="ccache clang -Qunused-arguments"
            ;;
            ("clang")
1225 1226
            LLVM_CXX_32="clang++ -Qunused-arguments"
            LLVM_CC_32="clang -Qunused-arguments"
1227

1228 1229
            LLVM_CXX_64="clang++ -Qunused-arguments"
            LLVM_CC_64="clang -Qunused-arguments"
1230 1231
            ;;
            ("ccache gcc")
1232 1233
            LLVM_CXX_32="ccache g++"
            LLVM_CC_32="ccache gcc"
1234 1235 1236 1237 1238

            LLVM_CXX_64="ccache g++"
            LLVM_CC_64="ccache gcc"
            ;;
            ("gcc")
1239 1240
            LLVM_CXX_32="g++"
            LLVM_CC_32="gcc"
1241 1242 1243

            LLVM_CXX_64="g++"
            LLVM_CC_64="gcc"
1244 1245 1246 1247
            ;;

            (*)
            msg "inferring LLVM_CXX/CC from CXX/CC = $CXX/$CC"
1248 1249
            LLVM_CXX_32="$CXX"
            LLVM_CC_32="$CC"
1250 1251 1252 1253

            LLVM_CXX_64="$CXX"
            LLVM_CC_64="$CC"
            ;;
1254
        esac
1255

1256 1257 1258 1259
        case "$CFG_CPUTYPE" in
            (x86*)
                LLVM_CXX_32="$LLVM_CXX_32 -m32"
                LLVM_CC_32="$LLVM_CC_32 -m32"
1260

1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276
                LLVM_CFLAGS_32="-m32"
                LLVM_CXXFLAGS_32="-m32"
                LLVM_LDFLAGS_32="-m32"

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

                LLVM_CXX_32="$LLVM_CXX_32 -m32"
                LLVM_CC_32="$LLVM_CC_32 -m32"
                ;;

            (*)
                LLVM_CFLAGS_32=""
                LLVM_CXXFLAGS_32=""
                LLVM_LDFLAGS_32=""
1277

1278 1279 1280 1281 1282
                LLVM_CFLAGS_64=""
                LLVM_CXXFLAGS_64=""
                LLVM_LDFLAGS_64=""
                ;;
        esac
1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304

        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

1305
        if [ -z "$CFG_DISABLE_LIBCPP" ] && [ -n "$CFG_USING_CLANG" ]; then
1306 1307 1308
            LLVM_OPTS="$LLVM_OPTS --enable-libcpp"
        fi

1309
        LLVM_FLAGS="$LLVM_TARGETS $LLVM_OPTS $LLVM_BUILD \
1310
                        $LLVM_HOST $LLVM_TARGET --with-python=$CFG_PYTHON"
1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323

        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]:*)
1324
                ${CFG_LLVM_SRC_DIR}configure $LLVM_FLAGS
1325 1326
                ;;
            *)
1327
                ${CFG_BUILD_DIR}${CFG_LLVM_SRC_DIR}configure \
1328 1329 1330 1331
                    $LLVM_FLAGS
                ;;
        esac
        need_ok "LLVM configure failed"
B
Brian Anderson 已提交
1332

1333
        cd $CFG_BUILD_DIR
1334
    fi
1335

1336 1337 1338 1339 1340 1341 1342 1343 1344 1345
    # 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 已提交
1346 1347 1348 1349 1350 1351 1352 1353 1354 1355
done


step_msg "writing configuration"

putvar CFG_SRC_DIR
putvar CFG_BUILD_DIR
putvar CFG_OSTYPE
putvar CFG_CPUTYPE
putvar CFG_CONFIGURE_ARGS
1356
putvar CFG_PREFIX
H
Heather 已提交
1357 1358
putvar CFG_HOST
putvar CFG_TARGET
1359
putvar CFG_LIBDIR_RELATIVE
B
Brian Anderson 已提交
1360
putvar CFG_DISABLE_MANAGE_SUBMODULES
1361
putvar CFG_ANDROID_CROSS_PATH
H
Heather 已提交
1362 1363
putvar CFG_MANDIR

1364 1365
# Avoid spurious warnings from clang by feeding it original source on
# ccache-miss rather than preprocessed input.
1366
if [ ! -z "$CFG_ENABLE_CCACHE" ] && [ ! -z "$CFG_USING_CLANG" ]
1367 1368 1369 1370 1371
then
    CFG_CCACHE_CPP2=1
    putvar CFG_CCACHE_CPP2
fi

1372 1373 1374 1375 1376 1377 1378
if [ ! -z "$CFG_ENABLE_CCACHE" ]
then
    CFG_CCACHE_BASEDIR=${CFG_SRC_DIR}
    putvar CFG_CCACHE_BASEDIR
fi


1379 1380 1381 1382 1383 1384
if [ ! -z $BAD_PANDOC ]
then
    CFG_PANDOC=
    putvar CFG_PANDOC
fi

B
Brian Anderson 已提交
1385 1386
putvar CFG_LLVM_SRC_DIR

H
Heather 已提交
1387
for t in $CFG_HOST
B
Brian Anderson 已提交
1388 1389 1390
do
    CFG_LLVM_BUILD_DIR=$(echo CFG_LLVM_BUILD_DIR_${t} | tr - _)
    CFG_LLVM_INST_DIR=$(echo CFG_LLVM_INST_DIR_${t} | tr - _)
1391 1392 1393
    putvar $CFG_LLVM_BUILD_DIR
    putvar $CFG_LLVM_INST_DIR
done
1394 1395

# Munge any paths that appear in config.mk back to posix-y
S
Sébastien Marie 已提交
1396 1397
cp config.tmp config.tmp.bak
sed -e 's@ \([a-zA-Z]\):[/\\]@ /\1/@g;' <config.tmp.bak >config.tmp
1398
rm -f config.tmp.bak
1399

B
Brian Anderson 已提交
1400
msg
1401 1402 1403
copy_if_changed ${CFG_SRC_DIR}Makefile.in ./Makefile
move_if_changed config.tmp config.mk
rm -f config.tmp
1404
touch config.stamp
1405

1406
step_msg "complete"
B
Brian Anderson 已提交
1407
msg "run \`make help\`"
1408
msg