configure 31.7 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
31 32 33 34 35
    then msg "found $1"
    else err "need $1"
    fi
}

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

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

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

66 67 68
putvar() {
    local T
    eval T=\$$1
69 70 71 72 73
    eval TLEN=\${#$1}
    if [ $TLEN -gt 35 ]
    then
        printf "configure: %-20s := %.35s ...\n" $1 "$T"
    else
74
        printf "configure: %-20s := %s %s\n" $1 "$T" "$2"
75
    fi
76
    printf "%-20s := %s\n" $1 "$T" >>config.tmp
77 78 79 80
}

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

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

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

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

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

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

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

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

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

226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249
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
}

250
msg "looking for configure programs"
251
need_cmd cmp
252 253
need_cmd mkdir
need_cmd printf
254
need_cmd cut
G
Graydon Hoare 已提交
255
need_cmd head
256 257 258 259
need_cmd grep
need_cmd xargs
need_cmd cp
need_cmd find
260 261
need_cmd uname
need_cmd date
G
Graydon Hoare 已提交
262
need_cmd tr
P
Patrick Walton 已提交
263
need_cmd sed
264
need_cmd file
B
Brian Anderson 已提交
265

266 267 268 269
msg "inspecting environment"

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

271 272 273 274
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 已提交
275
    if sysctl hw.optional.x86_64 | grep -q ': 1'
276 277 278 279
    then
        CFG_CPUTYPE=x86_64
    fi
fi
280

281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300
# The goal here is to come up with the same triple as LLVM would,
# at least for the subset of platforms we're willing to target.

case $CFG_OSTYPE in

    Linux)
        CFG_OSTYPE=unknown-linux-gnu
        ;;

    FreeBSD)
        CFG_OSTYPE=unknown-freebsd
        ;;

    Darwin)
        CFG_OSTYPE=apple-darwin
        ;;

    MINGW32*)
        CFG_OSTYPE=pc-mingw32
        ;;
K
klutzy 已提交
301 302 303 304 305 306

    MINGW64*)
        # msys2, MSYSTEM=MINGW64
        CFG_OSTYPE=w64-mingw32
        ;;

307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325
# Thad's Cygwin identifers below

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

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

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

327 328 329 330 331 332 333 334
#   Win 7 64 bit
    CYGWIN_NT-6.1-WOW64)
        CFG_OSTYPE=w64-mingw32
        CFG_CPUTYPE=x86_64
        ;;

# We do not detect other OS such as XP/2003 using 64 bit using uname.
# If we want to in the future, we will need to use Cygwin - Chuck's csih helper in /usr/lib/csih/winProductName.exe or alternative.
335 336 337 338 339 340 341 342 343
    *)
        err "unknown OS type: $CFG_OSTYPE"
        ;;
esac


case $CFG_CPUTYPE in

    i386 | i486 | i686 | i786 | x86)
344
        CFG_CPUTYPE=i686
345 346 347 348 349 350
        ;;

    xscale | arm)
        CFG_CPUTYPE=arm
        ;;

351 352 353 354 355
    armv7l)
        CFG_CPUTYPE=arm
        CFG_OSTYPE="${CFG_OSTYPE}eabihf"
        ;;

U
User Jyyou 已提交
356
    x86_64 | x86-64 | x64 | amd64)
357
        CFG_CPUTYPE=x86_64
358 359 360 361 362 363
        ;;

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

364 365 366 367 368 369 370 371 372 373
# Detect 64 bit linux systems with 32 bit userland and force 32 bit compilation
if [ $CFG_OSTYPE = unknown-linux-gnu -a $CFG_CPUTYPE = x86_64 ]
then
    file -L "$SHELL" | grep -q "x86[_-]64"
    if [ $? != 0 ]; then
        CFG_CPUTYPE=i686
    fi
fi


H
Heather 已提交
374
DEFAULT_BUILD="${CFG_CPUTYPE}-${CFG_OSTYPE}"
375

376 377
CFG_SRC_DIR="$(cd $(dirname $0) && pwd)/"
CFG_BUILD_DIR="$(pwd)/"
378
CFG_SELF="$0"
379 380
CFG_CONFIGURE_ARGS="$@"

381 382 383 384 385 386
OPTIONS=""
HELP=0
if [ "$1" = "--help" ]
then
    HELP=1
    shift
387
    echo
388
    echo "Usage: $CFG_SELF [options]"
389
    echo
390
    echo "Options:"
391
    echo
392
else
393 394
    msg "recreating config.tmp"
    echo '' >config.tmp
395 396 397

    step_msg "processing $CFG_SELF args"
fi
398

399 400 401
BOOL_OPTIONS=""
VAL_OPTIONS=""

M
Mahmut Bulut 已提交
402
opt valgrind 0 "run tests with valgrind (memcheck by default)"
403
opt helgrind 0 "run tests with helgrind instead of memcheck"
404
opt docs     1 "build documentation"
405
opt optimize 1 "build optimized rust code"
N
Niko Matsakis 已提交
406
opt optimize-cxx 1 "build optimized C++ code"
N
Niko Matsakis 已提交
407
opt optimize-llvm 1 "build optimized LLVM"
408
opt optimize-tests 1 "build tests with optimizations"
409
opt libcpp 1 "build with llvm with libc++ instead of libstdc++ when using clang"
410
opt llvm-assertions 1 "build LLVM with assertions"
411
opt debug 1 "build with extra debug fun"
412
opt ratchet-bench 0 "ratchet benchmarks"
413
opt fast-make 0 "use .gitmodules as timestamp for submodule deps"
414
opt manage-submodules 1 "let the build manage the git submodules"
415
opt mingw-cross 0 "cross-compile for win32 using mingw"
416
opt clang 0 "prefer clang to gcc for building the runtime"
417
opt ccache 0 "invoke gcc/clang via ccache to reuse object files between builds"
418
opt local-rust 0 "use an installed rustc rather than downloading a snapshot"
419
opt inject-std-version 1 "inject the current compiler version of libstd into programs"
420
opt llvm-static-stdcpp 0 "statically link to libstdc++ for LLVM"
A
Alex Crichton 已提交
421
opt rpath 1 "build rpaths into rustc itself"
422
opt nightly 0 "build nightly packages"
423
opt verify-install 1 "verify installed binaries work"
A
Alex Crichton 已提交
424
opt jemalloc 1 "build liballoc with jemalloc"
425
valopt prefix "/usr/local" "set installation prefix"
426
valopt local-rust-root "/usr/local" "set prefix for local rust binary"
B
Brian Anderson 已提交
427
valopt llvm-root "" "set LLVM root"
428 429
valopt jemalloc-root "" "set directory where libjemalloc_pic.a is located"
valopt libuv-root "" "set directory where libuv.a is located"
430 431
valopt android-cross-path "/opt/ndk_standalone" "Android NDK standalone path"
valopt mingw32-cross-path "" "MinGW32 cross compiler path"
432

H
Heather 已提交
433 434 435 436 437 438
valopt build "${DEFAULT_BUILD}" "GNUs ./configure syntax LLVM build triple"
valopt host "${CFG_BUILD}" "GNUs ./configure syntax LLVM host triples"
valopt target "${CFG_HOST}" "GNUs ./configure syntax LLVM target triples"

valopt localstatedir "/var/lib" "local state directory"
valopt sysconfdir "/etc" "install system configuration files"
439 440 441 442

valopt datadir "${CFG_PREFIX}/share" "install data"
valopt infodir "${CFG_PREFIX}/share/info" "install additional info"
valopt mandir "${CFG_PREFIX}/share/man" "install man pages in PATH"
443 444

# On windows we just store the libraries in the bin directory because
445 446
# there's no rpath. This is where the build system itself puts libraries;
# --libdir is used to configure the installation directory.
447
# FIXME: Thise needs to parameterized over target triples. Do it in platform.mk
448
CFG_LIBDIR_RELATIVE=lib
K
klutzy 已提交
449
if [ "$CFG_OSTYPE" = "pc-mingw32" ] || [ "$CFG_OSTYPE" = "w64-mingw32" ]
450
then
451
    CFG_LIBDIR_RELATIVE=bin
452 453
fi

454
valopt libdir "${CFG_PREFIX}/${CFG_LIBDIR_RELATIVE}" "install libraries"
H
Heather 已提交
455

B
Brian Anderson 已提交
456 457
if [ $HELP -eq 1 ]
then
458
    echo
B
Brian Anderson 已提交
459 460 461
    exit 0
fi

462 463 464
# Validate Options
step_msg "validating $CFG_SELF args"
validate_opt
465

466
step_msg "looking for build programs"
B
Brian Anderson 已提交
467

468
probe_need CFG_PERL        perl
469
probe_need CFG_CURLORWGET  curl wget
470 471 472 473 474 475
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
476 477 478 479 480

# 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 已提交
481
    probe CFG_GIT          git
482 483 484
    msg "git: no git directory. disabling submodules"
    CFG_DISABLE_MANAGE_SUBMODULES=1
else
B
Brian Anderson 已提交
485
    probe_need CFG_GIT     git
486 487
fi

488
probe CFG_CLANG            clang++
489
probe CFG_CCACHE           ccache
490
probe CFG_GCC              gcc
491
probe CFG_LD               ld
492
probe CFG_VALGRIND         valgrind
493
probe CFG_PERF             perf
494
probe CFG_ISCC             iscc
495 496 497
probe CFG_LLNEXTGEN        LLnextgen
probe CFG_PANDOC           pandoc
probe CFG_PDFLATEX         pdflatex
498 499
probe CFG_XELATEX          xelatex
probe CFG_LUALATEX         lualatex
500
probe CFG_GDB              gdb
501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520
probe CFG_LLDB             lldb

if [ ! -z "$CFG_LLDB" ]
then
    # 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 已提交
521 522 523 524
step_msg "looking for target specific programs"

probe CFG_ADB        adb

525 526
if [ ! -z "$CFG_PANDOC" ]
then
527 528 529 530
    PV_MAJOR_MINOR=$(pandoc --version | grep '^pandoc ' |
        # extract the first 2 version fields, ignore everything else
        sed 's/pandoc \([0-9]*\)\.\([0-9]*\).*/\1 \2/')

531 532
    MIN_PV_MAJOR="1"
    MIN_PV_MINOR="9"
533 534 535
    # these patterns are shell globs, *not* regexps
    PV_MAJOR=${PV_MAJOR_MINOR% *}
    PV_MINOR=${PV_MAJOR_MINOR#* }
536
    if [ "$PV_MAJOR" -lt "$MIN_PV_MAJOR" ] || [ "$PV_MINOR" -lt "$MIN_PV_MINOR" ]
537
    then
538 539
        step_msg "pandoc $PV_MAJOR.$PV_MINOR is too old. Need at least $MIN_PV_MAJOR.$MIN_PV_MINOR. Disabling"
        BAD_PANDOC=1
540
    fi
541 542
fi

K
klutzy 已提交
543
BIN_SUF=
K
klutzy 已提交
544
if [ "$CFG_OSTYPE" = "pc-mingw32" ] || [ "$CFG_OSTYPE" = "w64-mingw32" ]
K
klutzy 已提交
545 546 547 548
then
    BIN_SUF=.exe
fi

549
if [ ! -z "$CFG_ENABLE_LOCAL_RUST" ]
550
then
K
klutzy 已提交
551
    if [ ! -f ${CFG_LOCAL_RUST_ROOT}/bin/rustc${BIN_SUF} ]
552 553 554
    then
        err "no local rust to use"
    else
K
klutzy 已提交
555 556
        LRV=`${CFG_LOCAL_RUST_ROOT}/bin/rustc${BIN_SUF} --version`
        step_msg "using rustc at: ${CFG_LOCAL_RUST_ROOT} with version: $LRV"
557
    fi
558 559
fi

560 561 562 563 564 565 566 567
# Force freebsd to build with clang; gcc doesn't like us there
if [ $CFG_OSTYPE = unknown-freebsd ]
then
    step_msg "on FreeBSD, forcing use of clang"
    CFG_ENABLE_CLANG=1
    putvar CFG_ENABLE_CLANG
fi

568
if [ -z "$CFG_ENABLE_CLANG" -a -z "$CFG_GCC" ]
569 570 571 572
then
    err "either clang or gcc is required"
fi

573 574 575 576 577 578 579 580 581 582
# 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
        putvar CFG_ENABLE_CLANG
J
Jan Niklas Hasse 已提交
583
    else
584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604
        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
            putvar CFG_ENABLE_CLANG
        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) ||
                (chk_cc gcc gcc  &&( chk_cc g++ g++ || chk g++ gcc))) then
                err "the gcc and g++ in your path point to different compilers.
605
    Check which versions are in your path with gcc --version and g++ --version.
606 607
    To resolve this problem, either fix your PATH  or run configure with --enable-clang"
            fi
608

609
        fi
610 611 612
    fi
fi

613 614
if [ ! -z "$CFG_LLVM_ROOT" -a -e "$CFG_LLVM_ROOT/bin/llvm-config" ]
then
615
    step_msg "using custom LLVM at $CFG_LLVM_ROOT"
616 617

    LLVM_CONFIG="$CFG_LLVM_ROOT/bin/llvm-config"
618
    LLVM_VERSION=$($LLVM_CONFIG --version)
619 620

    case $LLVM_VERSION in
621
        (3.[2-5]*)
622 623 624 625 626
            msg "found ok version of LLVM: $LLVM_VERSION"
            ;;
        (*)
            err "bad LLVM version: $LLVM_VERSION, need >=3.0svn"
            ;;
627
    esac
628 629
fi

630 631 632 633 634 635 636 637 638 639 640 641 642
# 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" ]
643
then
644 645 646 647 648
    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 ]
649
    then
650 651 652
        step_msg "note, user-provided CC looks like clang; CC=$CC."
        CFG_USING_CLANG=1
        putvar CFG_USING_CLANG
653
    fi
654
else
655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684
    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
            (3.0svn | 3.0 | 3.1* | 3.2* | 3.3* | 3.4* | 3.5* )
            step_msg "found ok version of CLANG: $CFG_CLANG_VERSION"
            if [ -z "$CC" ]
            then
                CFG_CC="clang"
685
                CFG_CXX="clang++"
686 687 688 689 690 691 692 693 694
            fi
            ;;
            (*)
            err "bad CLANG version: $CFG_CLANG_VERSION, need >=3.0svn"
            ;;
        esac
    else
        msg "skipping CFG_ENABLE_CLANG version check; provided CC=$CC"
    fi
695
fi
696

697 698
if [ ! -z "$CFG_ENABLE_CCACHE" ]
then
699
    if [ -z "$CC" ]
700
    then
701 702 703 704 705 706
        if [ -z "$CFG_CCACHE" ]
        then
            err "ccache requested but not found"
        fi

        CFG_CC="ccache $CFG_CC"
707
    fi
708
fi
709

710 711 712
if [ -z "$CC" -a -z "$CFG_ENABLE_CLANG" -a -z "$CFG_GCC" ]
then
    err "either clang or gcc is required"
713 714
fi

715 716 717 718 719 720 721 722 723 724 725
# 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

726 727
# a little post-processing of various config values
CFG_PREFIX=${CFG_PREFIX%/}
H
Heather 已提交
728 729 730
CFG_MANDIR=${CFG_MANDIR%/}
CFG_HOST="$(echo $CFG_HOST | tr ',' ' ')"
CFG_TARGET="$(echo $CFG_TARGET | tr ',' ' ')"
C
Chris Morgan 已提交
731
CFG_SUPPORTED_TARGET="$(grep ^CC_*=* ${CFG_SRC_DIR}mk/platform.mk | sed -e 's/^CC_//' -e 's/\([^=]*\).*/\1/' | xargs)"
N
Niko Matsakis 已提交
732

733 734
# copy host-triples to target-triples so that hosts are a subset of targets
V_TEMP=""
H
Heather 已提交
735
for i in $CFG_HOST $CFG_TARGET;
736 737 738
do
   echo "$V_TEMP" | grep -qF $i || V_TEMP="$V_TEMP${V_TEMP:+ }$i"
done
H
Heather 已提交
739
CFG_TARGET=$V_TEMP
740 741

# check target-specific tool-chains
H
Heather 已提交
742
for i in $CFG_TARGET
743
do
744
    L_CHECK=false
H
Heather 已提交
745
    for j in $CFG_SUPPORTED_TARGET
746 747 748 749 750 751 752 753 754 755 756 757
    do
        if [ $i = $j ]
        then
            L_CHECK=true
        fi
    done

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

758
    case $i in
759
        arm-linux-androideabi)
760 761 762 763 764 765 766 767 768 769 770 771 772 773 774

            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 已提交
775 776 777 778 779 780 781
        arm-apple-darwin)
            if [ $CFG_OSTYPE != apple-darwin ]
            then
                err "The iOS target is only supported on Mac OS X"
            fi
            ;;

782 783 784 785
        *)
            ;;
    esac
done
N
Niko Matsakis 已提交
786

787 788
if [ ! -z "$CFG_PERF" ]
then
G
Graydon Hoare 已提交
789
    HAVE_PERF_LOGFD=`$CFG_PERF stat --log-fd 2>&1 | grep 'unknown option'`
790 791 792 793 794 795 796
    if [ -z "$HAVE_PERF_LOGFD" ];
    then
        CFG_PERF_WITH_LOGFD=1
        putvar CFG_PERF_WITH_LOGFD
    fi
fi

797
step_msg "making directories"
798

799
for i in \
800
    doc doc/std doc/extra \
801
    dl tmp dist
802 803 804 805
do
    make_dir $i
done

H
Heather 已提交
806
for t in $CFG_HOST
807
do
808
    make_dir $t/llvm
809 810
done

H
Heather 已提交
811
for t in $CFG_HOST
812
do
813
    make_dir $t/rustllvm
814 815
done

H
Heather 已提交
816
for t in $CFG_TARGET
817
do
818
  make_dir $t/rt
819
  for s in 0 1 2 3
820
  do
821
    make_dir $t/rt/stage$s
D
Daniel Micay 已提交
822
    make_dir $t/rt/jemalloc
823 824 825 826
    make_dir $t/rt/libuv
    make_dir $t/rt/libuv/src/ares
    make_dir $t/rt/libuv/src/eio
    make_dir $t/rt/libuv/src/ev
827
    for i in                                          \
D
Daniel Micay 已提交
828
      isaac sync test \
829
      arch/i386 arch/x86_64 arch/arm arch/mips  \
830
      sundown/src sundown/html
831
    do
832
      make_dir $t/rt/stage$s/$i
833
    done
834 835 836
  done
done

837
for h in $CFG_HOST
838
do
H
Heather 已提交
839
    for t in $CFG_TARGET
840
    do
N
Niko Matsakis 已提交
841 842 843 844
        for i in 0 1 2 3
        do
            # host bin dir
            make_dir $h/stage$i/bin
845

N
Niko Matsakis 已提交
846
            # host lib dir
847
            make_dir $h/stage$i/$CFG_LIBDIR_RELATIVE
848

A
Alex Crichton 已提交
849 850 851
            # host test dir
            make_dir $h/stage$i/test

N
Niko Matsakis 已提交
852
            # target bin dir
853
            make_dir $h/stage$i/$CFG_LIBDIR_RELATIVE/rustlib/$t/bin
854

N
Niko Matsakis 已提交
855
            # target lib dir
856
            make_dir $h/stage$i/$CFG_LIBDIR_RELATIVE/rustlib/$t/lib
N
Niko Matsakis 已提交
857
        done
858
    done
N
Niko Matsakis 已提交
859 860

    make_dir $h/test/run-pass
861
    make_dir $h/test/run-pass-fulldeps
N
Niko Matsakis 已提交
862 863
    make_dir $h/test/run-fail
    make_dir $h/test/compile-fail
864
    make_dir $h/test/compile-fail-fulldeps
N
Niko Matsakis 已提交
865 866 867
    make_dir $h/test/bench
    make_dir $h/test/perf
    make_dir $h/test/pretty
868 869
    make_dir $h/test/debuginfo-gdb
    make_dir $h/test/debuginfo-lldb
870
    make_dir $h/test/codegen
B
Brian Anderson 已提交
871
    make_dir $h/test/doc-tutorial
872
    make_dir $h/test/doc-guide-ffi
873
    make_dir $h/test/doc-guide-runtime
874
    make_dir $h/test/doc-guide-macros
875 876
    make_dir $h/test/doc-guide-lifetimes
    make_dir $h/test/doc-guide-pointers
877 878
    make_dir $h/test/doc-guide-container
    make_dir $h/test/doc-guide-tasks
879
    make_dir $h/test/doc-complement-cheatsheet
880
    make_dir $h/test/doc-rust
881 882
done

883 884 885 886
# Configure submodules
step_msg "configuring submodules"

# Have to be in the top of src directory for this
887 888
if [ -z $CFG_DISABLE_MANAGE_SUBMODULES ]
then
889
    cd ${CFG_SRC_DIR}
890

891
    msg "git: submodule sync"
892
    "${CFG_GIT}" submodule sync
893

894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910
    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
    if [ ! -z "${CFG_LIBUV_ROOT}" ]; then
        msg "git: submodule deinit src/libuv"
        "${CFG_GIT}" submodule deinit src/libuv
    fi

911
    msg "git: submodule update"
912
    "${CFG_GIT}" submodule update
913 914
    need_ok "git failed"

915
    msg "git: submodule foreach sync"
916
    "${CFG_GIT}" submodule foreach --recursive 'if test -e .gitmodules; then git submodule sync; fi'
917 918
    need_ok "git failed"

919
    msg "git: submodule foreach update"
920
    "${CFG_GIT}" submodule update --recursive
921 922 923 924 925 926 927
    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

928
    msg "git: submodule clobber"
929
    "${CFG_GIT}" submodule foreach --recursive git clean -dxf
930
    need_ok "git failed"
931
    "${CFG_GIT}" submodule foreach --recursive git checkout .
932 933
    need_ok "git failed"

934
    cd ${CFG_BUILD_DIR}
935 936
fi

937 938
# Configure llvm, only if necessary
step_msg "looking at LLVM"
939
CFG_LLVM_SRC_DIR=${CFG_SRC_DIR}src/llvm/
H
Heather 已提交
940
for t in $CFG_HOST
941
do
942 943
    do_reconfigure=1

944 945
    if [ -z $CFG_LLVM_ROOT ]
    then
946
        LLVM_BUILD_DIR=${CFG_BUILD_DIR}$t/llvm
947 948
        if [ ! -z "$CFG_DISABLE_OPTIMIZE_LLVM" ]
        then
B
Brian Anderson 已提交
949
            LLVM_DBG_OPTS="--enable-debug-symbols --disable-optimized"
950 951
            # Just use LLVM straight from its build directory to
            # avoid 'make install' time
952
            LLVM_INST_DIR=$LLVM_BUILD_DIR/Debug
953 954
        else
            LLVM_DBG_OPTS="--enable-optimized"
955 956 957 958 959 960 961 962
            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
963 964 965 966 967 968 969 970
        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
971

N
Niko Matsakis 已提交
972

973
    if [ ${do_reconfigure} -ne 0 ]
N
Niko Matsakis 已提交
974
    then
975 976 977 978 979 980
    # 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
981
            config_status="${LLVM_BUILD_DIR}/config.status"
982 983 984 985 986 987 988 989
            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 已提交
990
    fi
991 992 993 994 995

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

J
Jyun-Yan You 已提交
996
        LLVM_TARGETS="--enable-targets=x86,x86_64,arm,mips"
997 998 999 1000 1001
        LLVM_BUILD="--build=$t"
        LLVM_HOST="--host=$t"
        LLVM_TARGET="--target=$t"

        # Disable unused LLVM features
1002
        LLVM_OPTS="$LLVM_DBG_OPTS $LLVM_ASSERTION_OPTS --disable-docs --enable-bindings=none"
1003 1004 1005
        # Disable term-info, linkage of which comes in multiple forms,
        # making our snapshots incompatible (#9334)
        LLVM_OPTS="$LLVM_OPTS --disable-terminfo"
1006 1007
        # Try to have LLVM pull in as few dependencies as possible (#9397)
        LLVM_OPTS="$LLVM_OPTS --disable-zlib --disable-libffi"
1008

K
klutzy 已提交
1009 1010 1011
        # 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
1012
        case "$CFG_BUILD" in
K
klutzy 已提交
1013
            (*-mingw32)
1014 1015 1016 1017
            LLVM_OPTS="$LLVM_OPTS --disable-pthreads"
            ;;
        esac

1018
        case "$CFG_CC" in
1019
            ("ccache clang")
1020 1021
            LLVM_CXX_32="ccache clang++ -Qunused-arguments"
            LLVM_CC_32="ccache clang -Qunused-arguments"
1022 1023 1024 1025 1026

            LLVM_CXX_64="ccache clang++ -Qunused-arguments"
            LLVM_CC_64="ccache clang -Qunused-arguments"
            ;;
            ("clang")
1027 1028
            LLVM_CXX_32="clang++ -Qunused-arguments"
            LLVM_CC_32="clang -Qunused-arguments"
1029

1030 1031
            LLVM_CXX_64="clang++ -Qunused-arguments"
            LLVM_CC_64="clang -Qunused-arguments"
1032 1033
            ;;
            ("ccache gcc")
1034 1035
            LLVM_CXX_32="ccache g++"
            LLVM_CC_32="ccache gcc"
1036 1037 1038 1039 1040

            LLVM_CXX_64="ccache g++"
            LLVM_CC_64="ccache gcc"
            ;;
            ("gcc")
1041 1042
            LLVM_CXX_32="g++"
            LLVM_CC_32="gcc"
1043 1044 1045

            LLVM_CXX_64="g++"
            LLVM_CC_64="gcc"
1046 1047 1048 1049
            ;;

            (*)
            msg "inferring LLVM_CXX/CC from CXX/CC = $CXX/$CC"
1050 1051
            LLVM_CXX_32="$CXX"
            LLVM_CC_32="$CC"
1052 1053 1054 1055

            LLVM_CXX_64="$CXX"
            LLVM_CC_64="$CC"
            ;;
1056
        esac
1057

1058 1059 1060 1061
        case "$CFG_CPUTYPE" in
            (x86*)
                LLVM_CXX_32="$LLVM_CXX_32 -m32"
                LLVM_CC_32="$LLVM_CC_32 -m32"
1062

1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078
                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=""
1079

1080 1081 1082 1083 1084
                LLVM_CFLAGS_64=""
                LLVM_CXXFLAGS_64=""
                LLVM_LDFLAGS_64=""
                ;;
        esac
1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106

        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

1107
        if [ -z "$CFG_DISABLE_LIBCPP" ] && [ -n "$CFG_USING_CLANG" ]; then
1108 1109 1110
            LLVM_OPTS="$LLVM_OPTS --enable-libcpp"
        fi

1111
        LLVM_FLAGS="$LLVM_TARGETS $LLVM_OPTS $LLVM_BUILD \
1112
                        $LLVM_HOST $LLVM_TARGET --with-python=$CFG_PYTHON"
1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125

        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]:*)
1126
                ${CFG_LLVM_SRC_DIR}configure $LLVM_FLAGS
1127 1128
                ;;
            *)
1129
                ${CFG_BUILD_DIR}${CFG_LLVM_SRC_DIR}configure \
1130 1131 1132 1133
                    $LLVM_FLAGS
                ;;
        esac
        need_ok "LLVM configure failed"
B
Brian Anderson 已提交
1134

1135
        cd $CFG_BUILD_DIR
1136
    fi
1137

1138 1139 1140 1141 1142 1143 1144 1145 1146 1147
    # 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 已提交
1148 1149 1150 1151 1152 1153 1154 1155 1156 1157
done


step_msg "writing configuration"

putvar CFG_SRC_DIR
putvar CFG_BUILD_DIR
putvar CFG_OSTYPE
putvar CFG_CPUTYPE
putvar CFG_CONFIGURE_ARGS
1158
putvar CFG_PREFIX
H
Heather 已提交
1159 1160 1161
putvar CFG_BUILD
putvar CFG_HOST
putvar CFG_TARGET
1162
putvar CFG_LIBDIR
1163
putvar CFG_LIBDIR_RELATIVE
B
Brian Anderson 已提交
1164
putvar CFG_DISABLE_MANAGE_SUBMODULES
1165 1166
putvar CFG_ANDROID_CROSS_PATH
putvar CFG_MINGW32_CROSS_PATH
H
Heather 已提交
1167
putvar CFG_MANDIR
1168
putvar CFG_DISABLE_INJECT_STD_VERSION
1169
putvar CFG_JEMALLOC_ROOT
1170
putvar CFG_LIBUV_ROOT
A
Alex Crichton 已提交
1171
putvar CFG_DISABLE_JEMALLOC
H
Heather 已提交
1172

1173 1174
# Avoid spurious warnings from clang by feeding it original source on
# ccache-miss rather than preprocessed input.
1175
if [ ! -z "$CFG_ENABLE_CCACHE" ] && [ ! -z "$CFG_USING_CLANG" ]
1176 1177 1178 1179 1180
then
    CFG_CCACHE_CPP2=1
    putvar CFG_CCACHE_CPP2
fi

1181 1182 1183 1184 1185 1186 1187
if [ ! -z "$CFG_ENABLE_CCACHE" ]
then
    CFG_CCACHE_BASEDIR=${CFG_SRC_DIR}
    putvar CFG_CCACHE_BASEDIR
fi


1188 1189 1190 1191 1192 1193
if [ ! -z $BAD_PANDOC ]
then
    CFG_PANDOC=
    putvar CFG_PANDOC
fi

B
Brian Anderson 已提交
1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205
# Valgrind is only reliable on Linux. On Windows it doesn't work at all, and
# on the Mac the dynamic linker causes Valgrind to emit a huge stream of
# errors.
if [ $CFG_OSTYPE != unknown-linux-gnu ] && [ $CFG_OSTYPE != apple-darwin ]
then
    CFG_BAD_VALGRIND=1
    putvar CFG_BAD_VALGRIND
fi

putvar CFG_LLVM_ROOT
putvar CFG_LLVM_SRC_DIR

H
Heather 已提交
1206
for t in $CFG_HOST
B
Brian Anderson 已提交
1207 1208 1209
do
    CFG_LLVM_BUILD_DIR=$(echo CFG_LLVM_BUILD_DIR_${t} | tr - _)
    CFG_LLVM_INST_DIR=$(echo CFG_LLVM_INST_DIR_${t} | tr - _)
1210 1211 1212
    putvar $CFG_LLVM_BUILD_DIR
    putvar $CFG_LLVM_INST_DIR
done
1213 1214 1215

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

B
Brian Anderson 已提交
1219
msg
1220 1221 1222
copy_if_changed ${CFG_SRC_DIR}Makefile.in ./Makefile
move_if_changed config.tmp config.mk
rm -f config.tmp
1223
touch config.stamp
1224

1225
step_msg "complete"
B
Brian Anderson 已提交
1226
msg "run \`make help\`"
1227
msg