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

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

V
Vadim Petrochenkov 已提交
407
# Thad's Cygwin identifiers below
408 409 410

#   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=""

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

546 547 548 549 550 551 552 553
# Optimization and debugging options. These may be overridden by the release channel, etc.
opt_nosave optimize 1 "build optimized rust code"
opt_nosave optimize-cxx 1 "build optimized C++ code"
opt_nosave optimize-llvm 1 "build optimized LLVM"
opt_nosave llvm-assertions 0 "build LLVM with assertions"
opt_nosave debug-assertions 0 "build with debugging assertions"
opt_nosave debuginfo 0 "build with debugger metadata"

H
Heather 已提交
554 555
valopt localstatedir "/var/lib" "local state directory"
valopt sysconfdir "/etc" "install system configuration files"
556 557 558

valopt datadir "${CFG_PREFIX}/share" "install data"
valopt infodir "${CFG_PREFIX}/share/info" "install additional info"
559 560 561 562
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"
563
valopt release-channel "dev" "the name of the release channel to build"
564 565 566 567 568

# 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"
569
opt_nosave jemalloc 1 "build liballoc with jemalloc"
570

571 572 573 574 575
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"
576

577 578 579 580 581 582
# 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)

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

594 595 596 597 598 599 600 601 602 603
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}))-`
604

605 606
if [ "$CFG_OSTYPE" = "pc-windows-gnu" ] && [ "$CFG_LIBDIR_RELATIVE" != "bin" ]; then
    err "libdir on windows should be set to 'bin'"
607
fi
H
Heather 已提交
608

B
Brian Anderson 已提交
609 610
if [ $HELP -eq 1 ]
then
611
    echo
B
Brian Anderson 已提交
612 613 614
    exit 0
fi

615 616 617
# Validate Options
step_msg "validating $CFG_SELF args"
validate_opt
618

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

628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645
# Adjust perf and debug options for debug mode
if [ -n "$CFG_ENABLE_DEBUG" ]; then
    msg "debug mode enabled, setting performance options"
    CFG_DISABLE_OPTIMIZE=1
    CFG_DISABLE_OPTIMIZE_CXX=1
    CFG_DISABLE_OPTIMIZE_LLVM=1
    CFG_ENABLE_LLVM_ASSERTIONS=1
    CFG_ENABLE_DEBUG_ASSERTIONS=1
fi

# OK, now write the debugging options
if [ -n "$CFG_DISABLE_OPTIMIZE" ]; then putvar CFG_DISABLE_OPTIMIZE; fi
if [ -n "$CFG_DISABLE_OPTIMIZE_CXX" ]; then putvar CFG_DISABLE_OPTIMIZE_CXX; fi
if [ -n "$CFG_DISABLE_OPTIMIZE_LLVM" ]; then putvar CFG_DISABLE_OPTIMIZE_LLVM; fi
if [ -n "$CFG_ENABLE_LLVM_ASSERTIONS" ]; then putvar CFG_ENABLE_LLVM_ASSERTIONS; fi
if [ -n "$CFG_ENABLE_DEBUG_ASSERTIONS" ]; then putvar CFG_ENABLE_DEBUG_ASSERTIONS; fi
if [ -n "$CFG_ENABLE_DEBUGINFO" ]; then putvar CFG_ENABLE_DEBUGINFO; fi

B
Brian Anderson 已提交
646 647 648 649 650 651 652 653 654
# 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.
655
CFG_BOOTSTRAP_KEY="${CFG_BOOTSTRAP_KEY-`date +%H:%M:%S`}"
B
Brian Anderson 已提交
656 657
putvar CFG_BOOTSTRAP_KEY

658
step_msg "looking for build programs"
B
Brian Anderson 已提交
659

660
probe_need CFG_CURLORWGET  curl wget
661 662 663 664 665 666
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
667 668 669 670 671

# 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 已提交
672
    probe CFG_GIT          git
673 674 675
    msg "git: no git directory. disabling submodules"
    CFG_DISABLE_MANAGE_SUBMODULES=1
else
B
Brian Anderson 已提交
676
    probe_need CFG_GIT     git
677 678
fi

679
probe CFG_CLANG            clang++
680
probe CFG_CCACHE           ccache
681
probe CFG_GCC              gcc
682
probe CFG_LD               ld
683
probe CFG_VALGRIND         valgrind
684
probe CFG_PERF             perf
685
probe CFG_ISCC             iscc
686 687
probe CFG_ANTLR4           antlr4
probe CFG_GRUN             grun
688 689
probe CFG_FLEX             flex
probe CFG_BISON            bison
690
probe CFG_PANDOC           pandoc
691
probe CFG_XELATEX          xelatex
692
probe CFG_GDB              gdb
693 694
probe CFG_LLDB             lldb

695 696 697 698 699 700 701 702
# On MacOS X, invoking `javac` pops up a dialog if the JDK is not
# installed. Since `javac` is only used if `antlr4` is available,
# probe for it only in this case.
if [ ! -z "$CFG_ANTLR4" ]
then
   probe CFG_JAVAC            javac
fi

703 704
if [ ! -z "$CFG_GDB" ]
then
705
    # Store GDB's version
706 707 708 709
    CFG_GDB_VERSION=$($CFG_GDB --version 2>/dev/null | head -1)
    putvar CFG_GDB_VERSION
fi

710 711
if [ ! -z "$CFG_LLDB" ]
then
712 713 714 715
    # Store LLDB's version
    CFG_LLDB_VERSION=$($CFG_LLDB --version 2>/dev/null | head -1)
    putvar CFG_LLDB_VERSION

716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731
    # 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 已提交
732 733 734 735
step_msg "looking for target specific programs"

probe CFG_ADB        adb

736 737
if [ ! -z "$CFG_PANDOC" ]
then
738
    # Extract "MAJOR MINOR" from Pandoc's version number
739 740
    PV_MAJOR_MINOR=$(pandoc --version | grep '^pandoc' |
        sed -E 's/pandoc(.exe)? ([0-9]+)\.([0-9]+).*/\2 \3/')
741

742 743
    MIN_PV_MAJOR="1"
    MIN_PV_MINOR="9"
744

745 746 747
    # these patterns are shell globs, *not* regexps
    PV_MAJOR=${PV_MAJOR_MINOR% *}
    PV_MINOR=${PV_MAJOR_MINOR#* }
748

749
    if [ "$PV_MAJOR" -lt "$MIN_PV_MAJOR" ] || [ "$PV_MINOR" -lt "$MIN_PV_MINOR" ]
750
    then
751 752
        step_msg "pandoc $PV_MAJOR.$PV_MINOR is too old. Need at least $MIN_PV_MAJOR.$MIN_PV_MINOR. Disabling"
        BAD_PANDOC=1
753
    fi
754 755
fi

K
klutzy 已提交
756
BIN_SUF=
757
if [ "$CFG_OSTYPE" = "pc-windows-gnu" ]
K
klutzy 已提交
758 759 760 761
then
    BIN_SUF=.exe
fi

762
if [ ! -z "$CFG_ENABLE_LOCAL_RUST" ]
763
then
764 765
    system_rustc=$(which rustc)
    if [ -f ${CFG_LOCAL_RUST_ROOT}/bin/rustc${BIN_SUF} ]
766
    then
767 768 769 770 771
        : # 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}
772
    else
773
        err "no local rust to use"
774
    fi
775

776 777 778 779 780 781 782
    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
783 784
    step_msg "using rustc at: ${CFG_LOCAL_RUST_ROOT} with version: $LRV"
    putvar CFG_LOCAL_RUST_ROOT
785 786
fi

787 788 789 790 791 792 793
# 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 已提交
794 795 796
# Force bitrig to build with clang; gcc doesn't like us there
if [ $CFG_OSTYPE = unknown-bitrig ]
then
D
Dave Huseby 已提交
797
    step_msg "on Bitrig, forcing use of clang, disabling jemalloc"
D
Dave Huseby 已提交
798
    CFG_ENABLE_CLANG=1
799
    CFG_DISABLE_JEMALLOC=1
D
Dave Huseby 已提交
800 801
fi

802
if [ -z "$CFG_ENABLE_CLANG" -a -z "$CFG_GCC" ]
803 804 805 806
then
    err "either clang or gcc is required"
fi

807 808 809 810 811 812 813 814 815
# 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 已提交
816
    else
817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834
        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) ||
835
                (chk_cc gcc gcc  &&( chk_cc g++ g++ || chk g++ gcc))); then
836
                err "the gcc and g++ in your path point to different compilers.
837
    Check which versions are in your path with gcc --version and g++ --version.
838 839
    To resolve this problem, either fix your PATH  or run configure with --enable-clang"
            fi
840

841
        fi
842 843 844
    fi
fi

845 846 847 848 849 850 851
# 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

852 853 854 855 856 857
# Same with jemalloc.  save the setting here.
if [ ! -z "$CFG_DISABLE_JEMALLOC" ]
then
    putvar CFG_DISABLE_JEMALLOC
fi

858
if [ ! -z "$CFG_LLVM_ROOT" -a -z "$CFG_DISABLE_LLVM_VERSION_CHECK" -a -e "$CFG_LLVM_ROOT/bin/llvm-config" ]
859
then
860
    step_msg "using custom LLVM at $CFG_LLVM_ROOT"
861 862

    LLVM_CONFIG="$CFG_LLVM_ROOT/bin/llvm-config"
863
    LLVM_VERSION=$($LLVM_CONFIG --version)
864 865

    case $LLVM_VERSION in
866
        (3.[5-6]*)
867 868 869
            msg "found ok version of LLVM: $LLVM_VERSION"
            ;;
        (*)
870
            err "bad LLVM version: $LLVM_VERSION, need >=3.5"
871
            ;;
872
    esac
873 874
fi

875 876 877 878 879 880 881 882 883 884 885 886 887
# 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" ]
888
then
889 890 891 892 893
    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 ]
894
    then
895 896 897
        step_msg "note, user-provided CC looks like clang; CC=$CC."
        CFG_USING_CLANG=1
        putvar CFG_USING_CLANG
898
    fi
899
else
900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924
    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 已提交
925
            (3.2* | 3.3* | 3.4* | 3.5* | 3.6*)
926 927 928 929
            step_msg "found ok version of CLANG: $CFG_CLANG_VERSION"
            if [ -z "$CC" ]
            then
                CFG_CC="clang"
930
                CFG_CXX="clang++"
931 932 933 934 935 936 937 938 939
            fi
            ;;
            (*)
            err "bad CLANG version: $CFG_CLANG_VERSION, need >=3.0svn"
            ;;
        esac
    else
        msg "skipping CFG_ENABLE_CLANG version check; provided CC=$CC"
    fi
940
fi
941

942 943
if [ ! -z "$CFG_ENABLE_CCACHE" ]
then
944
    if [ -z "$CC" ]
945
    then
946 947 948 949 950 951
        if [ -z "$CFG_CCACHE" ]
        then
            err "ccache requested but not found"
        fi

        CFG_CC="ccache $CFG_CC"
952
    fi
953
fi
954

955 956 957
if [ -z "$CC" -a -z "$CFG_ENABLE_CLANG" -a -z "$CFG_GCC" ]
then
    err "either clang or gcc is required"
958 959
fi

960 961 962 963 964 965 966 967 968 969 970
# 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

971 972
# a little post-processing of various config values
CFG_PREFIX=${CFG_PREFIX%/}
H
Heather 已提交
973 974 975
CFG_MANDIR=${CFG_MANDIR%/}
CFG_HOST="$(echo $CFG_HOST | tr ',' ' ')"
CFG_TARGET="$(echo $CFG_TARGET | tr ',' ' ')"
976 977 978 979
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 已提交
980

981 982
# copy host-triples to target-triples so that hosts are a subset of targets
V_TEMP=""
H
Heather 已提交
983
for i in $CFG_HOST $CFG_TARGET;
984 985 986
do
   echo "$V_TEMP" | grep -qF $i || V_TEMP="$V_TEMP${V_TEMP:+ }$i"
done
H
Heather 已提交
987
CFG_TARGET=$V_TEMP
988 989

# check target-specific tool-chains
H
Heather 已提交
990
for i in $CFG_TARGET
991
do
992
    L_CHECK=false
H
Heather 已提交
993
    for j in $CFG_SUPPORTED_TARGET
994 995 996 997 998 999 1000 1001 1002 1003 1004 1005
    do
        if [ $i = $j ]
        then
            L_CHECK=true
        fi
    done

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

1006
    case $i in
1007
        arm-linux-androideabi)
1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022

            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 已提交
1023 1024 1025 1026 1027 1028 1029
        arm-apple-darwin)
            if [ $CFG_OSTYPE != apple-darwin ]
            then
                err "The iOS target is only supported on Mac OS X"
            fi
            ;;

1030 1031 1032 1033
        *)
            ;;
    esac
done
N
Niko Matsakis 已提交
1034

1035 1036
if [ ! -z "$CFG_PERF" ]
then
G
Graydon Hoare 已提交
1037
    HAVE_PERF_LOGFD=`$CFG_PERF stat --log-fd 2>&1 | grep 'unknown option'`
1038 1039 1040 1041 1042 1043 1044
    if [ -z "$HAVE_PERF_LOGFD" ];
    then
        CFG_PERF_WITH_LOGFD=1
        putvar CFG_PERF_WITH_LOGFD
    fi
fi

1045
step_msg "making directories"
1046

1047
for i in \
1048
    doc doc/std doc/extra \
1049
    dl tmp dist
1050 1051 1052 1053
do
    make_dir $i
done

H
Heather 已提交
1054
for t in $CFG_HOST
1055
do
1056
    make_dir $t/llvm
1057 1058
done

H
Heather 已提交
1059
for t in $CFG_HOST
1060
do
1061
    make_dir $t/rustllvm
1062 1063
done

H
Heather 已提交
1064
for t in $CFG_TARGET
1065
do
1066
  make_dir $t/rt
1067
  for s in 0 1 2 3
1068
  do
1069
    make_dir $t/rt/stage$s
D
Daniel Micay 已提交
1070
    make_dir $t/rt/jemalloc
1071
    for i in                                          \
D
Daniel Micay 已提交
1072
      isaac sync test \
R
Richo Healey 已提交
1073
      arch/i386 arch/x86_64 arch/arm arch/aarch64 arch/mips arch/powerpc
1074
    do
1075
      make_dir $t/rt/stage$s/$i
1076
    done
1077 1078 1079
  done
done

1080
for h in $CFG_HOST
1081
do
H
Heather 已提交
1082
    for t in $CFG_TARGET
1083
    do
1084 1085 1086 1087 1088 1089 1090 1091 1092
        # 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 已提交
1093 1094 1095 1096
        for i in 0 1 2 3
        do
            # host bin dir
            make_dir $h/stage$i/bin
1097

N
Niko Matsakis 已提交
1098
            # host lib dir
1099
            make_dir $h/stage$i/$CFG_LIBDIR_RELATIVE
1100

A
Alex Crichton 已提交
1101 1102 1103
            # host test dir
            make_dir $h/stage$i/test

N
Niko Matsakis 已提交
1104
            # target bin dir
1105
            make_dir $h/stage$i/$CFG_LIBDIR_RELATIVE/rustlib/$t/bin
1106

N
Niko Matsakis 已提交
1107
            # target lib dir
1108
            make_dir $h/stage$i/$CFG_LIBDIR_RELATIVE/rustlib/$t/lib
N
Niko Matsakis 已提交
1109
        done
1110
    done
N
Niko Matsakis 已提交
1111 1112

    make_dir $h/test/run-pass
N
Nick Cameron 已提交
1113
    make_dir $h/test/run-pass-valgrind
1114
    make_dir $h/test/run-pass-fulldeps
N
Niko Matsakis 已提交
1115 1116
    make_dir $h/test/run-fail
    make_dir $h/test/compile-fail
1117
    make_dir $h/test/parse-fail
1118
    make_dir $h/test/compile-fail-fulldeps
N
Niko Matsakis 已提交
1119 1120 1121
    make_dir $h/test/bench
    make_dir $h/test/perf
    make_dir $h/test/pretty
1122 1123
    make_dir $h/test/debuginfo-gdb
    make_dir $h/test/debuginfo-lldb
1124
    make_dir $h/test/codegen
1125 1126
done

1127 1128 1129 1130
# Configure submodules
step_msg "configuring submodules"

# Have to be in the top of src directory for this
1131 1132
if [ -z $CFG_DISABLE_MANAGE_SUBMODULES ]
then
1133
    cd ${CFG_SRC_DIR}
1134

1135
    msg "git: submodule sync"
1136
    "${CFG_GIT}" submodule sync
1137

1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150
    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

1151
    msg "git: submodule update"
1152
    "${CFG_GIT}" submodule update
1153 1154
    need_ok "git failed"

1155
    msg "git: submodule foreach sync"
1156
    "${CFG_GIT}" submodule foreach --recursive 'if test -e .gitmodules; then git submodule sync; fi'
1157 1158
    need_ok "git failed"

1159
    msg "git: submodule foreach update"
1160
    "${CFG_GIT}" submodule update --recursive
1161 1162 1163 1164 1165 1166 1167
    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

1168
    msg "git: submodule clobber"
1169
    "${CFG_GIT}" submodule foreach --recursive git clean -dxf
1170
    need_ok "git failed"
1171
    "${CFG_GIT}" submodule foreach --recursive git checkout .
1172 1173
    need_ok "git failed"

1174
    cd ${CFG_BUILD_DIR}
1175 1176
fi

1177 1178
# Configure llvm, only if necessary
step_msg "looking at LLVM"
1179
CFG_LLVM_SRC_DIR=${CFG_SRC_DIR}src/llvm/
H
Heather 已提交
1180
for t in $CFG_HOST
1181
do
1182 1183
    do_reconfigure=1

1184 1185
    if [ -z $CFG_LLVM_ROOT ]
    then
1186
        LLVM_BUILD_DIR=${CFG_BUILD_DIR}$t/llvm
1187 1188
        if [ ! -z "$CFG_DISABLE_OPTIMIZE_LLVM" ]
        then
B
Brian Anderson 已提交
1189
            LLVM_DBG_OPTS="--enable-debug-symbols --disable-optimized"
1190 1191
            # Just use LLVM straight from its build directory to
            # avoid 'make install' time
1192
            LLVM_INST_DIR=$LLVM_BUILD_DIR/Debug
1193 1194
        else
            LLVM_DBG_OPTS="--enable-optimized"
1195 1196
            LLVM_INST_DIR=$LLVM_BUILD_DIR/Release
        fi
1197
        if [ -z "$CFG_ENABLE_LLVM_ASSERTIONS" ]
1198 1199 1200 1201 1202
        then
            LLVM_ASSERTION_OPTS="--disable-assertions"
        else
            LLVM_ASSERTION_OPTS="--enable-assertions"
            LLVM_INST_DIR=${LLVM_INST_DIR}+Asserts
1203 1204 1205 1206 1207 1208 1209 1210
        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
1211

N
Niko Matsakis 已提交
1212

1213
    if [ ${do_reconfigure} -ne 0 ]
N
Niko Matsakis 已提交
1214
    then
1215 1216 1217 1218 1219 1220
    # 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
1221
            config_status="${LLVM_BUILD_DIR}/config.status"
1222 1223 1224 1225 1226 1227 1228 1229
            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 已提交
1230
    fi
1231 1232 1233

    if [ ${do_reconfigure} -ne 0 ]
    then
1234 1235 1236 1237
        # LLVM's configure doesn't recognize the new Windows triples yet
        gnu_t=$(to_gnu_triple $t)

        msg "configuring LLVM for $gnu_t"
1238

R
Richo Healey 已提交
1239
        LLVM_TARGETS="--enable-targets=x86,x86_64,arm,aarch64,mips,powerpc"
1240 1241 1242
        LLVM_BUILD="--build=$gnu_t"
        LLVM_HOST="--host=$gnu_t"
        LLVM_TARGET="--target=$gnu_t"
1243 1244

        # Disable unused LLVM features
1245
        LLVM_OPTS="$LLVM_DBG_OPTS $LLVM_ASSERTION_OPTS --disable-docs --enable-bindings=none"
1246 1247 1248
        # Disable term-info, linkage of which comes in multiple forms,
        # making our snapshots incompatible (#9334)
        LLVM_OPTS="$LLVM_OPTS --disable-terminfo"
1249 1250
        # Try to have LLVM pull in as few dependencies as possible (#9397)
        LLVM_OPTS="$LLVM_OPTS --disable-zlib --disable-libffi"
1251

K
klutzy 已提交
1252 1253 1254
        # 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
1255
        case "$CFG_BUILD" in
1256
            (*-windows-*)
1257 1258 1259 1260
            LLVM_OPTS="$LLVM_OPTS --disable-pthreads"
            ;;
        esac

1261
        case "$CFG_CC" in
1262
            ("ccache clang")
1263 1264
            LLVM_CXX_32="ccache clang++ -Qunused-arguments"
            LLVM_CC_32="ccache clang -Qunused-arguments"
1265 1266 1267 1268 1269

            LLVM_CXX_64="ccache clang++ -Qunused-arguments"
            LLVM_CC_64="ccache clang -Qunused-arguments"
            ;;
            ("clang")
1270 1271
            LLVM_CXX_32="clang++ -Qunused-arguments"
            LLVM_CC_32="clang -Qunused-arguments"
1272

1273 1274
            LLVM_CXX_64="clang++ -Qunused-arguments"
            LLVM_CC_64="clang -Qunused-arguments"
1275 1276
            ;;
            ("ccache gcc")
1277 1278
            LLVM_CXX_32="ccache g++"
            LLVM_CC_32="ccache gcc"
1279 1280 1281 1282 1283

            LLVM_CXX_64="ccache g++"
            LLVM_CC_64="ccache gcc"
            ;;
            ("gcc")
1284 1285
            LLVM_CXX_32="g++"
            LLVM_CC_32="gcc"
1286 1287 1288

            LLVM_CXX_64="g++"
            LLVM_CC_64="gcc"
1289 1290 1291 1292
            ;;

            (*)
            msg "inferring LLVM_CXX/CC from CXX/CC = $CXX/$CC"
1293 1294
            LLVM_CXX_32="$CXX"
            LLVM_CC_32="$CC"
1295 1296 1297 1298

            LLVM_CXX_64="$CXX"
            LLVM_CC_64="$CC"
            ;;
1299
        esac
1300

1301 1302 1303 1304
        case "$CFG_CPUTYPE" in
            (x86*)
                LLVM_CXX_32="$LLVM_CXX_32 -m32"
                LLVM_CC_32="$LLVM_CC_32 -m32"
1305

1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321
                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=""
1322

1323 1324 1325 1326 1327
                LLVM_CFLAGS_64=""
                LLVM_CXXFLAGS_64=""
                LLVM_LDFLAGS_64=""
                ;;
        esac
1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349

        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

1350
        if [ -z "$CFG_DISABLE_LIBCPP" ] && [ -n "$CFG_USING_CLANG" ]; then
1351 1352 1353
            LLVM_OPTS="$LLVM_OPTS --enable-libcpp"
        fi

1354
        LLVM_FLAGS="$LLVM_TARGETS $LLVM_OPTS $LLVM_BUILD \
1355
                        $LLVM_HOST $LLVM_TARGET --with-python=$CFG_PYTHON"
1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368

        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]:*)
1369
                ${CFG_LLVM_SRC_DIR}configure $LLVM_FLAGS
1370 1371
                ;;
            *)
1372
                ${CFG_BUILD_DIR}${CFG_LLVM_SRC_DIR}configure \
1373 1374 1375 1376
                    $LLVM_FLAGS
                ;;
        esac
        need_ok "LLVM configure failed"
B
Brian Anderson 已提交
1377

1378
        cd $CFG_BUILD_DIR
1379
    fi
1380

1381 1382 1383 1384 1385 1386 1387 1388 1389 1390
    # 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 已提交
1391 1392 1393 1394 1395 1396 1397 1398 1399 1400
done


step_msg "writing configuration"

putvar CFG_SRC_DIR
putvar CFG_BUILD_DIR
putvar CFG_OSTYPE
putvar CFG_CPUTYPE
putvar CFG_CONFIGURE_ARGS
1401
putvar CFG_PREFIX
H
Heather 已提交
1402 1403
putvar CFG_HOST
putvar CFG_TARGET
1404
putvar CFG_LIBDIR_RELATIVE
B
Brian Anderson 已提交
1405
putvar CFG_DISABLE_MANAGE_SUBMODULES
1406
putvar CFG_ANDROID_CROSS_PATH
H
Heather 已提交
1407 1408
putvar CFG_MANDIR

1409 1410
# Avoid spurious warnings from clang by feeding it original source on
# ccache-miss rather than preprocessed input.
1411
if [ ! -z "$CFG_ENABLE_CCACHE" ] && [ ! -z "$CFG_USING_CLANG" ]
1412 1413 1414 1415 1416
then
    CFG_CCACHE_CPP2=1
    putvar CFG_CCACHE_CPP2
fi

1417 1418 1419 1420 1421 1422 1423
if [ ! -z "$CFG_ENABLE_CCACHE" ]
then
    CFG_CCACHE_BASEDIR=${CFG_SRC_DIR}
    putvar CFG_CCACHE_BASEDIR
fi


1424 1425 1426 1427 1428 1429
if [ ! -z $BAD_PANDOC ]
then
    CFG_PANDOC=
    putvar CFG_PANDOC
fi

B
Brian Anderson 已提交
1430 1431
putvar CFG_LLVM_SRC_DIR

H
Heather 已提交
1432
for t in $CFG_HOST
B
Brian Anderson 已提交
1433 1434 1435
do
    CFG_LLVM_BUILD_DIR=$(echo CFG_LLVM_BUILD_DIR_${t} | tr - _)
    CFG_LLVM_INST_DIR=$(echo CFG_LLVM_INST_DIR_${t} | tr - _)
1436 1437 1438
    putvar $CFG_LLVM_BUILD_DIR
    putvar $CFG_LLVM_INST_DIR
done
1439 1440

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

B
Brian Anderson 已提交
1445
msg
1446 1447 1448
copy_if_changed ${CFG_SRC_DIR}Makefile.in ./Makefile
move_if_changed config.tmp config.mk
rm -f config.tmp
1449
touch config.stamp
1450

1451 1452 1453 1454 1455 1456
if [ -z "$CFG_ENABLE_DEBUG" ]; then
    step_msg "configured in release mode. for development consider --enable-debug"
else
    step_msg "complete"
fi

B
Brian Anderson 已提交
1457
msg "run \`make help\`"
1458
msg