configure 37.3 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
        CFG_CPUTYPE=x86_64
        ;;

433 434 435 436
#   Win 8 # uname -s on 64-bit cygwin does not contain WOW64, so simply use uname -m to detect arch (works in my install)
    CYGWIN_NT-6.3)
    	CFG_OSTYPE=pc-windows-gnu
    	;;
437 438
# 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.
439 440 441 442 443 444 445 446 447
    *)
        err "unknown OS type: $CFG_OSTYPE"
        ;;
esac


case $CFG_CPUTYPE in

    i386 | i486 | i686 | i786 | x86)
448
        CFG_CPUTYPE=i686
449 450 451 452 453 454
        ;;

    xscale | arm)
        CFG_CPUTYPE=arm
        ;;

455 456 457 458 459
    armv7l)
        CFG_CPUTYPE=arm
        CFG_OSTYPE="${CFG_OSTYPE}eabihf"
        ;;

A
Akos Kiss 已提交
460 461 462 463
    aarch64)
        CFG_CPUTYPE=aarch64
        ;;

464 465 466 467
    # At some point, when ppc64[le] support happens, this will need to do
    # something clever. For now it's safe to assume that we're only ever
    # interested in building 32 bit.
    powerpc | ppc | ppc64)
R
Richo Healey 已提交
468 469 470
        CFG_CPUTYPE=powerpc
        ;;

U
User Jyyou 已提交
471
    x86_64 | x86-64 | x64 | amd64)
472
        CFG_CPUTYPE=x86_64
473 474 475 476 477 478
        ;;

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

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
482 483 484 485 486 487
    # $SHELL does not exist in standard 'sh', so probably only exists
    # if configure is running in an interactive bash shell. /usr/bin/env
    # exists *everywhere*.
    BIN_TO_PROBE="$SHELL"
    if [ -z "$BIN_TO_PROBE" -a -e "/usr/bin/env" ]; then
       BIN_TO_PROBE="/usr/bin/env"
488
    fi
489 490 491 492 493 494
    if [ -n "$BIN_TO_PROBE" ]; then
       file -L "$BIN_TO_PROBE" | grep -q "x86[_-]64"
       if [ $? != 0 ]; then
            CFG_CPUTYPE=i686
       fi
     fi
495 496 497
fi


H
Heather 已提交
498
DEFAULT_BUILD="${CFG_CPUTYPE}-${CFG_OSTYPE}"
499

500 501
CFG_SRC_DIR="$(cd $(dirname $0) && pwd)/"
CFG_BUILD_DIR="$(pwd)/"
502
CFG_SELF="$0"
503 504
CFG_CONFIGURE_ARGS="$@"

505 506 507 508 509 510
OPTIONS=""
HELP=0
if [ "$1" = "--help" ]
then
    HELP=1
    shift
511
    echo
512
    echo "Usage: $CFG_SELF [options]"
513
    echo
514
    echo "Options:"
515
    echo
516
else
517 518
    msg "recreating config.tmp"
    echo '' >config.tmp
519 520 521

    step_msg "processing $CFG_SELF args"
fi
522

523 524 525
BOOL_OPTIONS=""
VAL_OPTIONS=""

M
Mahmut Bulut 已提交
526
opt valgrind 0 "run tests with valgrind (memcheck by default)"
527
opt helgrind 0 "run tests with helgrind instead of memcheck"
528
opt valgrind-rpass 1 "run rpass-valgrind tests with valgrind"
529 530
opt docs     1 "build standard library documentation"
opt compiler-docs     0 "build compiler documentation"
531
opt optimize 1 "build optimized rust code"
N
Niko Matsakis 已提交
532
opt optimize-cxx 1 "build optimized C++ code"
N
Niko Matsakis 已提交
533
opt optimize-llvm 1 "build optimized LLVM"
534
opt optimize-tests 1 "build tests with optimizations"
535
opt libcpp 1 "build with llvm with libc++ instead of libstdc++ when using clang"
536
opt llvm-assertions 1 "build LLVM with assertions"
537
opt debug 1 "build with extra debug fun"
538
opt fast-make 0 "use .gitmodules as timestamp for submodule deps"
539
opt ccache 0 "invoke gcc/clang via ccache to reuse object files between builds"
540
opt local-rust 0 "use an installed rustc rather than downloading a snapshot"
541
opt llvm-static-stdcpp 0 "statically link to libstdc++ for LLVM"
542
opt rpath 0 "build rpaths into rustc itself"
543
opt nightly 0 "build nightly packages"
544
opt verify-install 1 "verify installed binaries work"
545 546
# This is used by the automation to produce single-target nightlies
opt dist-host-only 0 "only install bins for the host architecture"
547 548
opt inject-std-version 1 "inject the current compiler version of libstd into programs"
opt jemalloc 1 "build liballoc with jemalloc"
549
opt llvm-version-check 1 "don't check if the LLVM version is supported, build anyway"
H
Heather 已提交
550 551 552

valopt localstatedir "/var/lib" "local state directory"
valopt sysconfdir "/etc" "install system configuration files"
553 554 555

valopt datadir "${CFG_PREFIX}/share" "install data"
valopt infodir "${CFG_PREFIX}/share/info" "install additional info"
556 557 558 559 560 561 562 563 564
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"
565

566 567 568 569 570 571
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"
572

573 574 575 576 577 578
# 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)

579
# On windows we just store the libraries in the bin directory because
580 581
# there's no rpath. This is where the build system itself puts libraries;
# --libdir is used to configure the installation directory.
582
# FIXME: This needs to parameterized over target triples. Do it in platform.mk
583
if [ "$CFG_OSTYPE" = "pc-windows-gnu" ]
584
then
585
    CFG_LIBDIR_RELATIVE=bin
586
else
587 588
    CFG_LIBDIR_RELATIVE=lib
fi
589

590 591 592 593 594 595 596 597 598 599
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}))-`
600

601 602
if [ "$CFG_OSTYPE" = "pc-windows-gnu" ] && [ "$CFG_LIBDIR_RELATIVE" != "bin" ]; then
    err "libdir on windows should be set to 'bin'"
603
fi
H
Heather 已提交
604

B
Brian Anderson 已提交
605 606
if [ $HELP -eq 1 ]
then
607
    echo
B
Brian Anderson 已提交
608 609 610
    exit 0
fi

611 612 613
# Validate Options
step_msg "validating $CFG_SELF args"
validate_opt
614

615 616
# Validate the release channel
case "$CFG_RELEASE_CHANNEL" in
617
    (dev | nightly | beta | stable)
618 619
	;;
    (*)
620
        err "release channel must be 'dev', 'nightly', 'beta' or 'stable'"
621 622 623 624 625
        ;;
esac

# Continue supporting the old --enable-nightly flag to transition the bots
# XXX Remove me
626
if [ ! -z "$CFG_ENABLE_NIGHTLY" ]
627 628 629
then
    CFG_RELEASE_CHANNEL=nightly
fi
630
putvar CFG_RELEASE_CHANNEL
631

B
Brian Anderson 已提交
632 633 634 635 636 637 638 639 640
# 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.
641
CFG_BOOTSTRAP_KEY="${CFG_BOOTSTRAP_KEY-`date +%H:%M:%S`}"
B
Brian Anderson 已提交
642 643
putvar CFG_BOOTSTRAP_KEY

644
step_msg "looking for build programs"
B
Brian Anderson 已提交
645

646
probe_need CFG_CURLORWGET  curl wget
647 648 649 650 651 652
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
653 654 655 656 657

# 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 已提交
658
    probe CFG_GIT          git
659 660 661
    msg "git: no git directory. disabling submodules"
    CFG_DISABLE_MANAGE_SUBMODULES=1
else
B
Brian Anderson 已提交
662
    probe_need CFG_GIT     git
663 664
fi

665
probe CFG_CLANG            clang++
666
probe CFG_CCACHE           ccache
667
probe CFG_GCC              gcc
668
probe CFG_LD               ld
669
probe CFG_VALGRIND         valgrind
670
probe CFG_PERF             perf
671
probe CFG_ISCC             iscc
672 673 674
probe CFG_JAVAC            javac
probe CFG_ANTLR4           antlr4
probe CFG_GRUN             grun
675 676
probe CFG_FLEX             flex
probe CFG_BISON            bison
677
probe CFG_PANDOC           pandoc
678
probe CFG_XELATEX          xelatex
679
probe CFG_GDB              gdb
680 681
probe CFG_LLDB             lldb

682 683
if [ ! -z "$CFG_GDB" ]
then
684
    # Store GDB's version
685 686 687 688
    CFG_GDB_VERSION=$($CFG_GDB --version 2>/dev/null | head -1)
    putvar CFG_GDB_VERSION
fi

689 690
if [ ! -z "$CFG_LLDB" ]
then
691 692 693 694
    # Store LLDB's version
    CFG_LLDB_VERSION=$($CFG_LLDB --version 2>/dev/null | head -1)
    putvar CFG_LLDB_VERSION

695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710
    # 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 已提交
711 712 713 714
step_msg "looking for target specific programs"

probe CFG_ADB        adb

715 716
if [ ! -z "$CFG_PANDOC" ]
then
717
    # Extract "MAJOR MINOR" from Pandoc's version number
718 719
    PV_MAJOR_MINOR=$(pandoc --version | grep '^pandoc' |
        sed -E 's/pandoc(.exe)? ([0-9]+)\.([0-9]+).*/\2 \3/')
720

721 722
    MIN_PV_MAJOR="1"
    MIN_PV_MINOR="9"
723

724 725 726
    # these patterns are shell globs, *not* regexps
    PV_MAJOR=${PV_MAJOR_MINOR% *}
    PV_MINOR=${PV_MAJOR_MINOR#* }
727

728
    if [ "$PV_MAJOR" -lt "$MIN_PV_MAJOR" ] || [ "$PV_MINOR" -lt "$MIN_PV_MINOR" ]
729
    then
730 731
        step_msg "pandoc $PV_MAJOR.$PV_MINOR is too old. Need at least $MIN_PV_MAJOR.$MIN_PV_MINOR. Disabling"
        BAD_PANDOC=1
732
    fi
733 734
fi

K
klutzy 已提交
735
BIN_SUF=
736
if [ "$CFG_OSTYPE" = "pc-windows-gnu" ]
K
klutzy 已提交
737 738 739 740
then
    BIN_SUF=.exe
fi

741
if [ ! -z "$CFG_ENABLE_LOCAL_RUST" ]
742
then
743 744
    system_rustc=$(which rustc)
    if [ -f ${CFG_LOCAL_RUST_ROOT}/bin/rustc${BIN_SUF} ]
745
    then
746 747 748 749 750
        : # 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}
751
    else
752
        err "no local rust to use"
753
    fi
754

755 756 757 758 759 760 761
    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
762 763
    step_msg "using rustc at: ${CFG_LOCAL_RUST_ROOT} with version: $LRV"
    putvar CFG_LOCAL_RUST_ROOT
764 765
fi

766 767 768 769 770 771 772
# 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 已提交
773 774 775
# Force bitrig to build with clang; gcc doesn't like us there
if [ $CFG_OSTYPE = unknown-bitrig ]
then
D
Dave Huseby 已提交
776
    step_msg "on Bitrig, forcing use of clang, disabling jemalloc"
D
Dave Huseby 已提交
777
    CFG_ENABLE_CLANG=1
D
Dave Huseby 已提交
778
    CFG_ENABLE_JEMALLOC=0
D
Dave Huseby 已提交
779 780
fi

781
if [ -z "$CFG_ENABLE_CLANG" -a -z "$CFG_GCC" ]
782 783 784 785
then
    err "either clang or gcc is required"
fi

786 787 788 789 790 791 792 793 794
# 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 已提交
795
    else
796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813
        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) ||
814
                (chk_cc gcc gcc  &&( chk_cc g++ g++ || chk g++ gcc))); then
815
                err "the gcc and g++ in your path point to different compilers.
816
    Check which versions are in your path with gcc --version and g++ --version.
817 818
    To resolve this problem, either fix your PATH  or run configure with --enable-clang"
            fi
819

820
        fi
821 822 823
    fi
fi

824 825 826 827 828 829 830
# 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

831
if [ ! -z "$CFG_LLVM_ROOT" -a -z "$CFG_DISABLE_LLVM_VERSION_CHECK" -a -e "$CFG_LLVM_ROOT/bin/llvm-config" ]
832
then
833
    step_msg "using custom LLVM at $CFG_LLVM_ROOT"
834 835

    LLVM_CONFIG="$CFG_LLVM_ROOT/bin/llvm-config"
836
    LLVM_VERSION=$($LLVM_CONFIG --version)
837 838

    case $LLVM_VERSION in
839
        (3.[5-6]*)
840 841 842
            msg "found ok version of LLVM: $LLVM_VERSION"
            ;;
        (*)
843
            err "bad LLVM version: $LLVM_VERSION, need >=3.5"
844
            ;;
845
    esac
846 847
fi

848 849 850 851 852 853 854 855 856 857 858 859 860
# 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" ]
861
then
862 863 864 865 866
    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 ]
867
    then
868 869 870
        step_msg "note, user-provided CC looks like clang; CC=$CC."
        CFG_USING_CLANG=1
        putvar CFG_USING_CLANG
871
    fi
872
else
873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897
    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 已提交
898
            (3.2* | 3.3* | 3.4* | 3.5* | 3.6*)
899 900 901 902
            step_msg "found ok version of CLANG: $CFG_CLANG_VERSION"
            if [ -z "$CC" ]
            then
                CFG_CC="clang"
903
                CFG_CXX="clang++"
904 905 906 907 908 909 910 911 912
            fi
            ;;
            (*)
            err "bad CLANG version: $CFG_CLANG_VERSION, need >=3.0svn"
            ;;
        esac
    else
        msg "skipping CFG_ENABLE_CLANG version check; provided CC=$CC"
    fi
913
fi
914

915 916
if [ ! -z "$CFG_ENABLE_CCACHE" ]
then
917
    if [ -z "$CC" ]
918
    then
919 920 921 922 923 924
        if [ -z "$CFG_CCACHE" ]
        then
            err "ccache requested but not found"
        fi

        CFG_CC="ccache $CFG_CC"
925
    fi
926
fi
927

928 929 930
if [ -z "$CC" -a -z "$CFG_ENABLE_CLANG" -a -z "$CFG_GCC" ]
then
    err "either clang or gcc is required"
931 932
fi

933 934 935 936 937 938 939 940 941 942 943
# 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

944 945
# a little post-processing of various config values
CFG_PREFIX=${CFG_PREFIX%/}
H
Heather 已提交
946 947 948
CFG_MANDIR=${CFG_MANDIR%/}
CFG_HOST="$(echo $CFG_HOST | tr ',' ' ')"
CFG_TARGET="$(echo $CFG_TARGET | tr ',' ' ')"
949 950 951 952
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 已提交
953

954 955
# copy host-triples to target-triples so that hosts are a subset of targets
V_TEMP=""
H
Heather 已提交
956
for i in $CFG_HOST $CFG_TARGET;
957 958 959
do
   echo "$V_TEMP" | grep -qF $i || V_TEMP="$V_TEMP${V_TEMP:+ }$i"
done
H
Heather 已提交
960
CFG_TARGET=$V_TEMP
961 962

# check target-specific tool-chains
H
Heather 已提交
963
for i in $CFG_TARGET
964
do
965
    L_CHECK=false
H
Heather 已提交
966
    for j in $CFG_SUPPORTED_TARGET
967 968 969 970 971 972 973 974 975 976 977 978
    do
        if [ $i = $j ]
        then
            L_CHECK=true
        fi
    done

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

979
    case $i in
980
        arm-linux-androideabi)
981 982 983 984 985 986 987 988 989 990 991 992 993 994 995

            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 已提交
996 997 998 999 1000 1001 1002
        arm-apple-darwin)
            if [ $CFG_OSTYPE != apple-darwin ]
            then
                err "The iOS target is only supported on Mac OS X"
            fi
            ;;

1003 1004 1005 1006
        *)
            ;;
    esac
done
N
Niko Matsakis 已提交
1007

1008 1009
if [ ! -z "$CFG_PERF" ]
then
G
Graydon Hoare 已提交
1010
    HAVE_PERF_LOGFD=`$CFG_PERF stat --log-fd 2>&1 | grep 'unknown option'`
1011 1012 1013 1014 1015 1016 1017
    if [ -z "$HAVE_PERF_LOGFD" ];
    then
        CFG_PERF_WITH_LOGFD=1
        putvar CFG_PERF_WITH_LOGFD
    fi
fi

1018
step_msg "making directories"
1019

1020
for i in \
1021
    doc doc/std doc/extra \
1022
    dl tmp dist
1023 1024 1025 1026
do
    make_dir $i
done

H
Heather 已提交
1027
for t in $CFG_HOST
1028
do
1029
    make_dir $t/llvm
1030 1031
done

H
Heather 已提交
1032
for t in $CFG_HOST
1033
do
1034
    make_dir $t/rustllvm
1035 1036
done

H
Heather 已提交
1037
for t in $CFG_TARGET
1038
do
1039
  make_dir $t/rt
1040
  for s in 0 1 2 3
1041
  do
1042
    make_dir $t/rt/stage$s
D
Daniel Micay 已提交
1043
    make_dir $t/rt/jemalloc
1044
    for i in                                          \
D
Daniel Micay 已提交
1045
      isaac sync test \
R
Richo Healey 已提交
1046
      arch/i386 arch/x86_64 arch/arm arch/aarch64 arch/mips arch/powerpc
1047
    do
1048
      make_dir $t/rt/stage$s/$i
1049
    done
1050 1051 1052
  done
done

1053
for h in $CFG_HOST
1054
do
H
Heather 已提交
1055
    for t in $CFG_TARGET
1056
    do
1057 1058 1059 1060 1061 1062 1063 1064 1065
        # 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 已提交
1066 1067 1068 1069
        for i in 0 1 2 3
        do
            # host bin dir
            make_dir $h/stage$i/bin
1070

N
Niko Matsakis 已提交
1071
            # host lib dir
1072
            make_dir $h/stage$i/$CFG_LIBDIR_RELATIVE
1073

A
Alex Crichton 已提交
1074 1075 1076
            # host test dir
            make_dir $h/stage$i/test

N
Niko Matsakis 已提交
1077
            # target bin dir
1078
            make_dir $h/stage$i/$CFG_LIBDIR_RELATIVE/rustlib/$t/bin
1079

N
Niko Matsakis 已提交
1080
            # target lib dir
1081
            make_dir $h/stage$i/$CFG_LIBDIR_RELATIVE/rustlib/$t/lib
N
Niko Matsakis 已提交
1082
        done
1083
    done
N
Niko Matsakis 已提交
1084 1085

    make_dir $h/test/run-pass
N
Nick Cameron 已提交
1086
    make_dir $h/test/run-pass-valgrind
1087
    make_dir $h/test/run-pass-fulldeps
N
Niko Matsakis 已提交
1088 1089
    make_dir $h/test/run-fail
    make_dir $h/test/compile-fail
1090
    make_dir $h/test/parse-fail
1091
    make_dir $h/test/compile-fail-fulldeps
N
Niko Matsakis 已提交
1092 1093 1094
    make_dir $h/test/bench
    make_dir $h/test/perf
    make_dir $h/test/pretty
1095 1096
    make_dir $h/test/debuginfo-gdb
    make_dir $h/test/debuginfo-lldb
1097
    make_dir $h/test/codegen
1098 1099
done

1100 1101 1102 1103
# Configure submodules
step_msg "configuring submodules"

# Have to be in the top of src directory for this
1104 1105
if [ -z $CFG_DISABLE_MANAGE_SUBMODULES ]
then
1106
    cd ${CFG_SRC_DIR}
1107

1108
    msg "git: submodule sync"
1109
    "${CFG_GIT}" submodule sync
1110

1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123
    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

1124
    msg "git: submodule update"
1125
    "${CFG_GIT}" submodule update
1126 1127
    need_ok "git failed"

1128
    msg "git: submodule foreach sync"
1129
    "${CFG_GIT}" submodule foreach --recursive 'if test -e .gitmodules; then git submodule sync; fi'
1130 1131
    need_ok "git failed"

1132
    msg "git: submodule foreach update"
1133
    "${CFG_GIT}" submodule update --recursive
1134 1135 1136 1137 1138 1139 1140
    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

1141
    msg "git: submodule clobber"
1142
    "${CFG_GIT}" submodule foreach --recursive git clean -dxf
1143
    need_ok "git failed"
1144
    "${CFG_GIT}" submodule foreach --recursive git checkout .
1145 1146
    need_ok "git failed"

1147
    cd ${CFG_BUILD_DIR}
1148 1149
fi

1150 1151
# Configure llvm, only if necessary
step_msg "looking at LLVM"
1152
CFG_LLVM_SRC_DIR=${CFG_SRC_DIR}src/llvm/
H
Heather 已提交
1153
for t in $CFG_HOST
1154
do
1155 1156
    do_reconfigure=1

1157 1158
    if [ -z $CFG_LLVM_ROOT ]
    then
1159
        LLVM_BUILD_DIR=${CFG_BUILD_DIR}$t/llvm
1160 1161
        if [ ! -z "$CFG_DISABLE_OPTIMIZE_LLVM" ]
        then
B
Brian Anderson 已提交
1162
            LLVM_DBG_OPTS="--enable-debug-symbols --disable-optimized"
1163 1164
            # Just use LLVM straight from its build directory to
            # avoid 'make install' time
1165
            LLVM_INST_DIR=$LLVM_BUILD_DIR/Debug
1166 1167
        else
            LLVM_DBG_OPTS="--enable-optimized"
1168 1169 1170 1171 1172 1173 1174 1175
            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
1176 1177 1178 1179 1180 1181 1182 1183
        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
1184

N
Niko Matsakis 已提交
1185

1186
    if [ ${do_reconfigure} -ne 0 ]
N
Niko Matsakis 已提交
1187
    then
1188 1189 1190 1191 1192 1193
    # 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
1194
            config_status="${LLVM_BUILD_DIR}/config.status"
1195 1196 1197 1198 1199 1200 1201 1202
            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 已提交
1203
    fi
1204 1205 1206

    if [ ${do_reconfigure} -ne 0 ]
    then
1207 1208 1209 1210
        # LLVM's configure doesn't recognize the new Windows triples yet
        gnu_t=$(to_gnu_triple $t)

        msg "configuring LLVM for $gnu_t"
1211

R
Richo Healey 已提交
1212
        LLVM_TARGETS="--enable-targets=x86,x86_64,arm,aarch64,mips,powerpc"
1213 1214 1215
        LLVM_BUILD="--build=$gnu_t"
        LLVM_HOST="--host=$gnu_t"
        LLVM_TARGET="--target=$gnu_t"
1216 1217

        # Disable unused LLVM features
1218
        LLVM_OPTS="$LLVM_DBG_OPTS $LLVM_ASSERTION_OPTS --disable-docs --enable-bindings=none"
1219 1220 1221
        # Disable term-info, linkage of which comes in multiple forms,
        # making our snapshots incompatible (#9334)
        LLVM_OPTS="$LLVM_OPTS --disable-terminfo"
1222 1223
        # Try to have LLVM pull in as few dependencies as possible (#9397)
        LLVM_OPTS="$LLVM_OPTS --disable-zlib --disable-libffi"
1224

K
klutzy 已提交
1225 1226 1227
        # 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
1228
        case "$CFG_BUILD" in
1229
            (*-windows-*)
1230 1231 1232 1233
            LLVM_OPTS="$LLVM_OPTS --disable-pthreads"
            ;;
        esac

1234
        case "$CFG_CC" in
1235
            ("ccache clang")
1236 1237
            LLVM_CXX_32="ccache clang++ -Qunused-arguments"
            LLVM_CC_32="ccache clang -Qunused-arguments"
1238 1239 1240 1241 1242

            LLVM_CXX_64="ccache clang++ -Qunused-arguments"
            LLVM_CC_64="ccache clang -Qunused-arguments"
            ;;
            ("clang")
1243 1244
            LLVM_CXX_32="clang++ -Qunused-arguments"
            LLVM_CC_32="clang -Qunused-arguments"
1245

1246 1247
            LLVM_CXX_64="clang++ -Qunused-arguments"
            LLVM_CC_64="clang -Qunused-arguments"
1248 1249
            ;;
            ("ccache gcc")
1250 1251
            LLVM_CXX_32="ccache g++"
            LLVM_CC_32="ccache gcc"
1252 1253 1254 1255 1256

            LLVM_CXX_64="ccache g++"
            LLVM_CC_64="ccache gcc"
            ;;
            ("gcc")
1257 1258
            LLVM_CXX_32="g++"
            LLVM_CC_32="gcc"
1259 1260 1261

            LLVM_CXX_64="g++"
            LLVM_CC_64="gcc"
1262 1263 1264 1265
            ;;

            (*)
            msg "inferring LLVM_CXX/CC from CXX/CC = $CXX/$CC"
1266 1267
            LLVM_CXX_32="$CXX"
            LLVM_CC_32="$CC"
1268 1269 1270 1271

            LLVM_CXX_64="$CXX"
            LLVM_CC_64="$CC"
            ;;
1272
        esac
1273

1274 1275 1276 1277
        case "$CFG_CPUTYPE" in
            (x86*)
                LLVM_CXX_32="$LLVM_CXX_32 -m32"
                LLVM_CC_32="$LLVM_CC_32 -m32"
1278

1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294
                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=""
1295

1296 1297 1298 1299 1300
                LLVM_CFLAGS_64=""
                LLVM_CXXFLAGS_64=""
                LLVM_LDFLAGS_64=""
                ;;
        esac
1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322

        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

1323
        if [ -z "$CFG_DISABLE_LIBCPP" ] && [ -n "$CFG_USING_CLANG" ]; then
1324 1325 1326
            LLVM_OPTS="$LLVM_OPTS --enable-libcpp"
        fi

1327
        LLVM_FLAGS="$LLVM_TARGETS $LLVM_OPTS $LLVM_BUILD \
1328
                        $LLVM_HOST $LLVM_TARGET --with-python=$CFG_PYTHON"
1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341

        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]:*)
1342
                ${CFG_LLVM_SRC_DIR}configure $LLVM_FLAGS
1343 1344
                ;;
            *)
1345
                ${CFG_BUILD_DIR}${CFG_LLVM_SRC_DIR}configure \
1346 1347 1348 1349
                    $LLVM_FLAGS
                ;;
        esac
        need_ok "LLVM configure failed"
B
Brian Anderson 已提交
1350

1351
        cd $CFG_BUILD_DIR
1352
    fi
1353

1354 1355 1356 1357 1358 1359 1360 1361 1362 1363
    # 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 已提交
1364 1365 1366 1367 1368 1369 1370 1371 1372 1373
done


step_msg "writing configuration"

putvar CFG_SRC_DIR
putvar CFG_BUILD_DIR
putvar CFG_OSTYPE
putvar CFG_CPUTYPE
putvar CFG_CONFIGURE_ARGS
1374
putvar CFG_PREFIX
H
Heather 已提交
1375 1376
putvar CFG_HOST
putvar CFG_TARGET
1377
putvar CFG_LIBDIR_RELATIVE
B
Brian Anderson 已提交
1378
putvar CFG_DISABLE_MANAGE_SUBMODULES
1379
putvar CFG_ANDROID_CROSS_PATH
H
Heather 已提交
1380 1381
putvar CFG_MANDIR

1382 1383
# Avoid spurious warnings from clang by feeding it original source on
# ccache-miss rather than preprocessed input.
1384
if [ ! -z "$CFG_ENABLE_CCACHE" ] && [ ! -z "$CFG_USING_CLANG" ]
1385 1386 1387 1388 1389
then
    CFG_CCACHE_CPP2=1
    putvar CFG_CCACHE_CPP2
fi

1390 1391 1392 1393 1394 1395 1396
if [ ! -z "$CFG_ENABLE_CCACHE" ]
then
    CFG_CCACHE_BASEDIR=${CFG_SRC_DIR}
    putvar CFG_CCACHE_BASEDIR
fi


1397 1398 1399 1400 1401 1402
if [ ! -z $BAD_PANDOC ]
then
    CFG_PANDOC=
    putvar CFG_PANDOC
fi

B
Brian Anderson 已提交
1403 1404
putvar CFG_LLVM_SRC_DIR

H
Heather 已提交
1405
for t in $CFG_HOST
B
Brian Anderson 已提交
1406 1407 1408
do
    CFG_LLVM_BUILD_DIR=$(echo CFG_LLVM_BUILD_DIR_${t} | tr - _)
    CFG_LLVM_INST_DIR=$(echo CFG_LLVM_INST_DIR_${t} | tr - _)
1409 1410 1411
    putvar $CFG_LLVM_BUILD_DIR
    putvar $CFG_LLVM_INST_DIR
done
1412 1413

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

B
Brian Anderson 已提交
1418
msg
1419 1420 1421
copy_if_changed ${CFG_SRC_DIR}Makefile.in ./Makefile
move_if_changed config.tmp config.mk
rm -f config.tmp
1422
touch config.stamp
1423

1424
step_msg "complete"
B
Brian Anderson 已提交
1425
msg "run \`make help\`"
1426
msg