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

3 4 5
msg() {
    echo "configure: $1"
}
6

7 8 9 10 11 12
step_msg() {
    msg
    msg "$1"
    msg
}

13 14 15 16
warn() {
    echo "configure: WARNING: $1"
}

17 18 19 20 21
err() {
    echo "configure: error: $1"
    exit 1
}

22 23 24
need_ok() {
    if [ $? -ne 0 ]
    then
25
        err "$1"
26 27
    fi
}
28 29

need_cmd() {
30
    if command -v $1 >/dev/null 2>&1
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
msg "looking for configure programs"
227
need_cmd cmp
228 229
need_cmd mkdir
need_cmd printf
230
need_cmd cut
G
Graydon Hoare 已提交
231
need_cmd head
232 233 234 235
need_cmd grep
need_cmd xargs
need_cmd cp
need_cmd find
236 237
need_cmd uname
need_cmd date
G
Graydon Hoare 已提交
238
need_cmd tr
P
Patrick Walton 已提交
239
need_cmd sed
240
need_cmd file
B
Brian Anderson 已提交
241

242 243 244 245
msg "inspecting environment"

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

247 248 249 250
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 已提交
251
    if sysctl hw.optional.x86_64 | grep -q ': 1'
252 253 254 255
    then
        CFG_CPUTYPE=x86_64
    fi
fi
256

257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276
# 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 已提交
277 278 279 280 281 282

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

283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301
# 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
        ;;
302

303 304 305 306 307 308 309 310
#   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.
311 312 313 314 315 316 317 318 319
    *)
        err "unknown OS type: $CFG_OSTYPE"
        ;;
esac


case $CFG_CPUTYPE in

    i386 | i486 | i686 | i786 | x86)
320
        CFG_CPUTYPE=i686
321 322 323 324 325 326
        ;;

    xscale | arm)
        CFG_CPUTYPE=arm
        ;;

U
User Jyyou 已提交
327
    x86_64 | x86-64 | x64 | amd64)
328
        CFG_CPUTYPE=x86_64
329 330 331 332 333 334
        ;;

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

335 336 337 338 339 340 341 342 343 344
# 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 已提交
345
DEFAULT_BUILD="${CFG_CPUTYPE}-${CFG_OSTYPE}"
346

347 348
CFG_SRC_DIR="$(cd $(dirname $0) && pwd)/"
CFG_BUILD_DIR="$(pwd)/"
349
CFG_SELF="$0"
350 351
CFG_CONFIGURE_ARGS="$@"

352 353 354 355 356 357
OPTIONS=""
HELP=0
if [ "$1" = "--help" ]
then
    HELP=1
    shift
358
    echo
359
    echo "Usage: $CFG_SELF [options]"
360
    echo
361
    echo "Options:"
362
    echo
363
else
364 365
    msg "recreating config.tmp"
    echo '' >config.tmp
366 367 368

    step_msg "processing $CFG_SELF args"
fi
369

370 371 372
BOOL_OPTIONS=""
VAL_OPTIONS=""

M
Mahmut Bulut 已提交
373
opt valgrind 0 "run tests with valgrind (memcheck by default)"
374
opt helgrind 0 "run tests with helgrind instead of memcheck"
375
opt docs     1 "build documentation"
376
opt optimize 1 "build optimized rust code"
N
Niko Matsakis 已提交
377
opt optimize-cxx 1 "build optimized C++ code"
N
Niko Matsakis 已提交
378
opt optimize-llvm 1 "build optimized LLVM"
379
opt optimize-tests 1 "build tests with optimizations"
380
opt llvm-assertions 1 "build LLVM with assertions"
381
opt debug 1 "build with extra debug fun"
382
opt ratchet-bench 0 "ratchet benchmarks"
383
opt fast-make 0 "use .gitmodules as timestamp for submodule deps"
384
opt manage-submodules 1 "let the build manage the git submodules"
385
opt mingw-cross 0 "cross-compile for win32 using mingw"
386
opt clang 0 "prefer clang to gcc for building the runtime"
387
opt ccache 0 "invoke gcc/clang via ccache to reuse object files between builds"
388
opt local-rust 0 "use an installed rustc rather than downloading a snapshot"
389
opt pax-flags 0 "apply PaX flags to rustc binaries (required for GRSecurity/PaX-patched kernels)"
390
opt inject-std-version 1 "inject the current compiler version of libstd into programs"
391
opt llvm-static-stdcpp 0 "statically link to libstdc++ for LLVM"
A
Alex Crichton 已提交
392
opt rpath 1 "build rpaths into rustc itself"
393
opt nightly 0 "build nightly packages"
394
opt verify-install 1 "verify installed binaries work"
395
valopt prefix "/usr/local" "set installation prefix"
396
valopt local-rust-root "/usr/local" "set prefix for local rust binary"
B
Brian Anderson 已提交
397
valopt llvm-root "" "set LLVM root"
398 399
valopt android-cross-path "/opt/ndk_standalone" "Android NDK standalone path"
valopt mingw32-cross-path "" "MinGW32 cross compiler path"
400

H
Heather 已提交
401 402 403 404 405 406
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"
407 408 409 410

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"
411 412

# On windows we just store the libraries in the bin directory because
413 414
# there's no rpath. This is where the build system itself puts libraries;
# --libdir is used to configure the installation directory.
415
# FIXME: Thise needs to parameterized over target triples. Do it in platform.mk
416
CFG_LIBDIR_RELATIVE=lib
K
klutzy 已提交
417
if [ "$CFG_OSTYPE" = "pc-mingw32" ] || [ "$CFG_OSTYPE" = "w64-mingw32" ]
418
then
419
    CFG_LIBDIR_RELATIVE=bin
420 421
fi

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

B
Brian Anderson 已提交
424 425
if [ $HELP -eq 1 ]
then
426
    echo
B
Brian Anderson 已提交
427 428 429
    exit 0
fi

430 431 432
# Validate Options
step_msg "validating $CFG_SELF args"
validate_opt
433

434
step_msg "looking for build programs"
B
Brian Anderson 已提交
435

436
probe_need CFG_PERL        perl
437
probe_need CFG_CURLORWGET  curl wget
438 439 440 441 442 443
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
444 445 446 447 448

# 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 已提交
449
    probe CFG_GIT          git
450 451 452
    msg "git: no git directory. disabling submodules"
    CFG_DISABLE_MANAGE_SUBMODULES=1
else
B
Brian Anderson 已提交
453
    probe_need CFG_GIT     git
454 455
fi

456
probe CFG_CLANG            clang++
457
probe CFG_CCACHE           ccache
458
probe CFG_GCC              gcc
459
probe CFG_LD               ld
460
probe CFG_VALGRIND         valgrind
461
probe CFG_PERF             perf
462
probe CFG_ISCC             iscc
463 464 465
probe CFG_LLNEXTGEN        LLnextgen
probe CFG_PANDOC           pandoc
probe CFG_PDFLATEX         pdflatex
466 467
probe CFG_XELATEX          xelatex
probe CFG_LUALATEX         lualatex
468
probe CFG_GDB              gdb
469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488
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

489 490 491 492 493
if [ "$CFG_OSTYPE" = "unknown-linux-gnu" ]
then
    probe CFG_PAXCTL           paxctl /sbin/paxctl
    probe CFG_ZCAT             zcat
fi
494

Y
Young-il Choi 已提交
495 496 497 498
step_msg "looking for target specific programs"

probe CFG_ADB        adb

499 500
if [ ! -z "$CFG_PANDOC" ]
then
501 502 503 504
    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/')

505 506
    MIN_PV_MAJOR="1"
    MIN_PV_MINOR="9"
507 508 509
    # these patterns are shell globs, *not* regexps
    PV_MAJOR=${PV_MAJOR_MINOR% *}
    PV_MINOR=${PV_MAJOR_MINOR#* }
510
    if [ "$PV_MAJOR" -lt "$MIN_PV_MAJOR" ] || [ "$PV_MINOR" -lt "$MIN_PV_MINOR" ]
511
    then
512 513
        step_msg "pandoc $PV_MAJOR.$PV_MINOR is too old. Need at least $MIN_PV_MAJOR.$MIN_PV_MINOR. Disabling"
        BAD_PANDOC=1
514 515 516
    fi
fi

517 518
if [ "$CFG_OSTYPE" = "unknown-linux-gnu" ]
then
519
    if [ ! -z "$CFG_ENABLE_PAX_FLAGS" -a -z "$CFG_PAXCTL" ]
520 521 522 523
    then
        err "enabled PaX markings but no paxctl binary found"
    fi

524
    if [ -z "$CFG_DISABLE_PAX_FLAGS" ]
525 526 527 528 529
    then
        # GRSecurity/PaX detection. This can be very flaky.
        GRSEC_DETECTED=

        # /dev/grsec only exists if CONFIG_GRKERNSEC_NO_RBAC is not set.
530
        # /proc/sys/kernel/grsecurity is not available if ÇONFIG_GRKERNSEC_SYSCTL is not set.
531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551
        if [ -e /dev/grsec -o -d /proc/sys/kernel/grsecurity ]
        then
            GRSEC_DETECTED=1
        # /proc/config.gz is normally only available to root, and only if CONFIG_IKCONFIG_PROC has been set.
        elif [ -r /proc/config.gz -a ! -z "$CFG_ZCAT" ]
        then
            if "$CFG_ZCAT" /proc/config.gz | grep --quiet "CONFIG_GRKERNSEC=y"
            then
                GRSEC_DETECTED=1
            fi
        # Flaky.
        elif grep --quiet grsec /proc/version
        then
            GRSEC_DETECTED=1
        fi

        if [ ! -z "$GRSEC_DETECTED" ]
        then
            step_msg "GRSecurity: yes"
            if [ ! -z "$CFG_PAXCTL" ]
            then
552
                CFG_ENABLE_PAX_FLAGS=1
553
            else
554
                warn "GRSecurity kernel detected but no paxctl binary found: not setting CFG_ENABLE_PAX_FLAGS"
555 556 557 558 559 560 561
            fi
        else
            step_msg "GRSecurity: no"
        fi
    fi
fi

K
klutzy 已提交
562
BIN_SUF=
K
klutzy 已提交
563
if [ "$CFG_OSTYPE" = "pc-mingw32" ] || [ "$CFG_OSTYPE" = "w64-mingw32" ]
K
klutzy 已提交
564 565 566 567
then
    BIN_SUF=.exe
fi

568
if [ ! -z "$CFG_ENABLE_LOCAL_RUST" ]
569
then
K
klutzy 已提交
570
    if [ ! -f ${CFG_LOCAL_RUST_ROOT}/bin/rustc${BIN_SUF} ]
571 572 573
    then
        err "no local rust to use"
    else
K
klutzy 已提交
574 575
        LRV=`${CFG_LOCAL_RUST_ROOT}/bin/rustc${BIN_SUF} --version`
        step_msg "using rustc at: ${CFG_LOCAL_RUST_ROOT} with version: $LRV"
576
    fi
577 578
fi

579 580 581 582 583 584 585 586
# 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

587
if [ -z "$CFG_ENABLE_CLANG" -a -z "$CFG_GCC" ]
588 589 590 591
then
    err "either clang or gcc is required"
fi

592 593 594 595 596 597 598 599 600 601
# 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 已提交
602
    else
603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626
        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.
    Check which versions are in your path with  cc --version and g++ --version.
    To resolve this problem, either fix your PATH  or run configure with --enable-clang"
            fi
627

628
        fi
629 630 631
    fi
fi

632 633
if [ ! -z "$CFG_LLVM_ROOT" -a -e "$CFG_LLVM_ROOT/bin/llvm-config" ]
then
634
    step_msg "using custom LLVM at $CFG_LLVM_ROOT"
635 636

    LLVM_CONFIG="$CFG_LLVM_ROOT/bin/llvm-config"
637
    LLVM_VERSION=$($LLVM_CONFIG --version)
638 639

    case $LLVM_VERSION in
640
        (3.[2-5]*)
641 642 643 644 645
            msg "found ok version of LLVM: $LLVM_VERSION"
            ;;
        (*)
            err "bad LLVM version: $LLVM_VERSION, need >=3.0svn"
            ;;
646
    esac
647 648
fi

649
if [ ! -z "$CFG_ENABLE_CLANG" ]
650
then
651 652
    if [ -z "$CFG_CLANG" ]
    then
653
        err "clang requested but not found"
654
    fi
655 656 657
    CFG_CLANG_VERSION=$("$CFG_CLANG" \
                      --version \
                      | grep version \
658
                      | sed 's/.*\(version .*\)/\1/; s/.*based on \(LLVM .*\))/\1/' \
J
Jyun-Yan You 已提交
659
                      | cut -d ' ' -f 2)
660 661

    case $CFG_CLANG_VERSION in
662
        (3.0svn | 3.0 | 3.1* | 3.2* | 3.3* | 3.4* | 3.5* )
663
        step_msg "found ok version of CLANG: $CFG_CLANG_VERSION"
664
        CFG_C_COMPILER="clang"
665 666
        ;;
        (*)
B
Brian Anderson 已提交
667
        err "bad CLANG version: $CFG_CLANG_VERSION, need >=3.0svn"
668 669
        ;;
    esac
670 671
else
    CFG_C_COMPILER="gcc"
672
fi
673

674 675 676 677 678 679 680 681 682 683
if [ ! -z "$CFG_ENABLE_CCACHE" ]
then
    if [ -z "$CFG_CCACHE" ]
    then
        err "ccache requested but not found"
    fi

    CFG_C_COMPILER="ccache $CFG_C_COMPILER"
fi

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

691 692
# copy host-triples to target-triples so that hosts are a subset of targets
V_TEMP=""
H
Heather 已提交
693
for i in $CFG_HOST $CFG_TARGET;
694 695 696
do
   echo "$V_TEMP" | grep -qF $i || V_TEMP="$V_TEMP${V_TEMP:+ }$i"
done
H
Heather 已提交
697
CFG_TARGET=$V_TEMP
698 699

# check target-specific tool-chains
H
Heather 已提交
700
for i in $CFG_TARGET
701
do
702
    L_CHECK=false
H
Heather 已提交
703
    for j in $CFG_SUPPORTED_TARGET
704 705 706 707 708 709 710 711 712 713 714 715
    do
        if [ $i = $j ]
        then
            L_CHECK=true
        fi
    done

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

716
    case $i in
717
        arm-linux-androideabi)
718 719 720 721 722 723 724 725 726 727 728 729 730 731 732

            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 已提交
733 734 735 736 737 738 739
        arm-apple-darwin)
            if [ $CFG_OSTYPE != apple-darwin ]
            then
                err "The iOS target is only supported on Mac OS X"
            fi
            ;;

740 741 742 743
        *)
            ;;
    esac
done
N
Niko Matsakis 已提交
744 745 746 747 748

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

750 751
if [ ! -z "$CFG_PERF" ]
then
G
Graydon Hoare 已提交
752
    HAVE_PERF_LOGFD=`$CFG_PERF stat --log-fd 2>&1 | grep 'unknown option'`
753 754 755 756 757 758 759
    if [ -z "$HAVE_PERF_LOGFD" ];
    then
        CFG_PERF_WITH_LOGFD=1
        putvar CFG_PERF_WITH_LOGFD
    fi
fi

760
step_msg "making directories"
761

762
for i in \
763
    doc doc/std doc/extra \
764
    dl tmp dist
765 766 767 768
do
    make_dir $i
done

H
Heather 已提交
769
for t in $CFG_HOST
770
do
771
    make_dir $t/llvm
772 773
done

H
Heather 已提交
774
for t in $CFG_HOST
775
do
776
    make_dir $t/rustllvm
777 778
done

H
Heather 已提交
779
for t in $CFG_TARGET
780
do
781
  make_dir $t/rt
782
  for s in 0 1 2 3
783
  do
784
    make_dir $t/rt/stage$s
785 786 787 788
    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
789
    for i in                                          \
D
Daniel Micay 已提交
790
      isaac sync test \
791
      arch/i386 arch/x86_64 arch/arm arch/mips  \
792
      sundown/src sundown/html
793
    do
794
      make_dir $t/rt/stage$s/$i
795
    done
796 797 798
  done
done

799
for h in $CFG_HOST
800
do
H
Heather 已提交
801
    for t in $CFG_TARGET
802
    do
N
Niko Matsakis 已提交
803 804 805 806
        for i in 0 1 2 3
        do
            # host bin dir
            make_dir $h/stage$i/bin
807

N
Niko Matsakis 已提交
808
            # host lib dir
809
            make_dir $h/stage$i/$CFG_LIBDIR_RELATIVE
810

A
Alex Crichton 已提交
811 812 813
            # host test dir
            make_dir $h/stage$i/test

N
Niko Matsakis 已提交
814
            # target bin dir
815
            make_dir $h/stage$i/$CFG_LIBDIR_RELATIVE/rustlib/$t/bin
816

N
Niko Matsakis 已提交
817
            # target lib dir
818
            make_dir $h/stage$i/$CFG_LIBDIR_RELATIVE/rustlib/$t/lib
N
Niko Matsakis 已提交
819
        done
820
    done
N
Niko Matsakis 已提交
821 822

    make_dir $h/test/run-pass
823
    make_dir $h/test/run-pass-fulldeps
N
Niko Matsakis 已提交
824 825
    make_dir $h/test/run-fail
    make_dir $h/test/compile-fail
826
    make_dir $h/test/compile-fail-fulldeps
N
Niko Matsakis 已提交
827 828 829
    make_dir $h/test/bench
    make_dir $h/test/perf
    make_dir $h/test/pretty
830 831
    make_dir $h/test/debuginfo-gdb
    make_dir $h/test/debuginfo-lldb
832
    make_dir $h/test/codegen
B
Brian Anderson 已提交
833
    make_dir $h/test/doc-tutorial
834
    make_dir $h/test/doc-guide-ffi
835
    make_dir $h/test/doc-guide-runtime
836
    make_dir $h/test/doc-guide-macros
837 838
    make_dir $h/test/doc-guide-lifetimes
    make_dir $h/test/doc-guide-pointers
839 840
    make_dir $h/test/doc-guide-container
    make_dir $h/test/doc-guide-tasks
841
    make_dir $h/test/doc-complement-cheatsheet
842
    make_dir $h/test/doc-rust
843 844
done

845 846 847 848
# Configure submodules
step_msg "configuring submodules"

# Have to be in the top of src directory for this
849 850
if [ -z $CFG_DISABLE_MANAGE_SUBMODULES ]
then
851
    cd ${CFG_SRC_DIR}
852

853
    msg "git: submodule sync"
854
    "${CFG_GIT}" submodule sync
855 856

    msg "git: submodule update"
857
    "${CFG_GIT}" submodule update --init
858 859
    need_ok "git failed"

860
    msg "git: submodule foreach sync"
861
    "${CFG_GIT}" submodule foreach --recursive 'if test -e .gitmodules; then git submodule sync; fi'
862 863
    need_ok "git failed"

864
    msg "git: submodule foreach update"
865
    "${CFG_GIT}" submodule update --init --recursive
866 867 868 869 870 871 872
    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

873
    msg "git: submodule clobber"
874
    "${CFG_GIT}" submodule foreach --recursive git clean -dxf
875
    need_ok "git failed"
876
    "${CFG_GIT}" submodule foreach --recursive git checkout .
877 878
    need_ok "git failed"

879
    cd ${CFG_BUILD_DIR}
880 881
fi

882 883
# Configure llvm, only if necessary
step_msg "looking at LLVM"
884
CFG_LLVM_SRC_DIR=${CFG_SRC_DIR}src/llvm/
H
Heather 已提交
885
for t in $CFG_HOST
886
do
887 888
    do_reconfigure=1

889 890
    if [ -z $CFG_LLVM_ROOT ]
    then
891
        LLVM_BUILD_DIR=${CFG_BUILD_DIR}$t/llvm
892 893
        if [ ! -z "$CFG_DISABLE_OPTIMIZE_LLVM" ]
        then
B
Brian Anderson 已提交
894
            LLVM_DBG_OPTS="--enable-debug-symbols --disable-optimized"
895 896
            # Just use LLVM straight from its build directory to
            # avoid 'make install' time
897
            LLVM_INST_DIR=$LLVM_BUILD_DIR/Debug
898 899
        else
            LLVM_DBG_OPTS="--enable-optimized"
900 901 902 903 904 905 906 907
            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
908 909 910 911 912 913 914 915
        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
916

N
Niko Matsakis 已提交
917

918
    if [ ${do_reconfigure} -ne 0 ]
N
Niko Matsakis 已提交
919
    then
920 921 922 923 924 925
    # 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
926
            config_status="${LLVM_BUILD_DIR}/config.status"
927 928 929 930 931 932 933 934
            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 已提交
935
    fi
936 937 938 939 940

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

J
Jyun-Yan You 已提交
941
        LLVM_TARGETS="--enable-targets=x86,x86_64,arm,mips"
942 943 944 945 946
        LLVM_BUILD="--build=$t"
        LLVM_HOST="--host=$t"
        LLVM_TARGET="--target=$t"

        # Disable unused LLVM features
947
        LLVM_OPTS="$LLVM_DBG_OPTS $LLVM_ASSERTION_OPTS --disable-docs --enable-bindings=none"
948 949 950
        # Disable term-info, linkage of which comes in multiple forms,
        # making our snapshots incompatible (#9334)
        LLVM_OPTS="$LLVM_OPTS --disable-terminfo"
951 952
        # Try to have LLVM pull in as few dependencies as possible (#9397)
        LLVM_OPTS="$LLVM_OPTS --disable-zlib --disable-libffi"
953

K
klutzy 已提交
954 955 956
        # 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
957
        case "$CFG_BUILD" in
K
klutzy 已提交
958
            (*-mingw32)
959 960 961 962
            LLVM_OPTS="$LLVM_OPTS --disable-pthreads"
            ;;
        esac

963 964 965 966 967 968 969
        case "$CFG_C_COMPILER" in
            ("ccache clang")
            LLVM_CXX_32="ccache clang++ -m32 -Qunused-arguments"
            LLVM_CC_32="ccache clang -m32 -Qunused-arguments"

            LLVM_CXX_64="ccache clang++ -Qunused-arguments"
            LLVM_CC_64="ccache clang -Qunused-arguments"
970
            LLVM_OPTS="$LLVM_OPTS --enable-libcpp"
971 972
            ;;
            ("clang")
973 974
            LLVM_CXX_32="clang++ -m32 -Qunused-arguments"
            LLVM_CC_32="clang -m32 -Qunused-arguments"
975

976 977
            LLVM_CXX_64="clang++ -Qunused-arguments"
            LLVM_CC_64="clang -Qunused-arguments"
978
            LLVM_OPTS="$LLVM_OPTS --enable-libcpp"
979 980 981 982 983 984 985 986 987
            ;;
            ("ccache gcc")
            LLVM_CXX_32="ccache g++ -m32"
            LLVM_CC_32="ccache gcc -m32"

            LLVM_CXX_64="ccache g++"
            LLVM_CC_64="ccache gcc"
            ;;
            ("gcc")
988 989 990 991 992
            LLVM_CXX_32="g++ -m32"
            LLVM_CC_32="gcc -m32"

            LLVM_CXX_64="g++"
            LLVM_CC_64="gcc"
993
        esac
994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024

        LLVM_CFLAGS_32="-m32"
        LLVM_CXXFLAGS_32="-m32"
        LLVM_LDFLAGS_32="-m32"

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

        if echo $t | grep -q x86_64
        then
            LLVM_CXX=$LLVM_CXX_64
            LLVM_CC=$LLVM_CC_64
            LLVM_CFLAGS=$LLVM_CFLAGS_64
            LLVM_CXXFLAGS=$LLVM_CXXFLAGS_64
            LLVM_LDFLAGS=$LLVM_LDFLAGS_64
        else
            LLVM_CXX=$LLVM_CXX_32
            LLVM_CC=$LLVM_CC_32
            LLVM_CFLAGS=$LLVM_CFLAGS_32
            LLVM_CXXFLAGS=$LLVM_CXXFLAGS_32
            LLVM_LDFLAGS=$LLVM_LDFLAGS_32
        fi

        CXX=$LLVM_CXX
        CC=$LLVM_CC
        CFLAGS=$LLVM_CFLAGS
        CXXFLAGS=$LLVM_CXXFLAGS
        LDFLAGS=$LLVM_LDFLAGS

        LLVM_FLAGS="$LLVM_TARGETS $LLVM_OPTS $LLVM_BUILD \
1025
                        $LLVM_HOST $LLVM_TARGET --with-python=$CFG_PYTHON"
1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038

        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]:*)
1039
                ${CFG_LLVM_SRC_DIR}configure $LLVM_FLAGS
1040 1041
                ;;
            *)
1042
                ${CFG_BUILD_DIR}${CFG_LLVM_SRC_DIR}configure \
1043 1044 1045 1046
                    $LLVM_FLAGS
                ;;
        esac
        need_ok "LLVM configure failed"
B
Brian Anderson 已提交
1047

1048
        cd $CFG_BUILD_DIR
1049
    fi
1050

1051 1052 1053 1054 1055 1056 1057 1058 1059 1060
    # 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 已提交
1061 1062 1063 1064 1065 1066 1067 1068 1069 1070
done


step_msg "writing configuration"

putvar CFG_SRC_DIR
putvar CFG_BUILD_DIR
putvar CFG_OSTYPE
putvar CFG_CPUTYPE
putvar CFG_CONFIGURE_ARGS
1071
putvar CFG_PREFIX
H
Heather 已提交
1072 1073 1074
putvar CFG_BUILD
putvar CFG_HOST
putvar CFG_TARGET
B
Brian Anderson 已提交
1075
putvar CFG_C_COMPILER
1076
putvar CFG_LIBDIR
1077
putvar CFG_LIBDIR_RELATIVE
B
Brian Anderson 已提交
1078
putvar CFG_DISABLE_MANAGE_SUBMODULES
1079 1080
putvar CFG_ANDROID_CROSS_PATH
putvar CFG_MINGW32_CROSS_PATH
H
Heather 已提交
1081
putvar CFG_MANDIR
1082
putvar CFG_DISABLE_INJECT_STD_VERSION
H
Heather 已提交
1083

1084 1085 1086 1087 1088 1089 1090 1091
# Avoid spurious warnings from clang by feeding it original source on
# ccache-miss rather than preprocessed input.
if [ ! -z "$CFG_ENABLE_CCACHE" ] && [ ! -z "$CFG_ENABLE_CLANG" ]
then
    CFG_CCACHE_CPP2=1
    putvar CFG_CCACHE_CPP2
fi

1092 1093 1094 1095 1096 1097 1098
if [ ! -z "$CFG_ENABLE_CCACHE" ]
then
    CFG_CCACHE_BASEDIR=${CFG_SRC_DIR}
    putvar CFG_CCACHE_BASEDIR
fi


1099 1100 1101 1102 1103 1104
if [ ! -z $BAD_PANDOC ]
then
    CFG_PANDOC=
    putvar CFG_PANDOC
fi

B
Brian Anderson 已提交
1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116
# 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 已提交
1117
for t in $CFG_HOST
B
Brian Anderson 已提交
1118 1119 1120
do
    CFG_LLVM_BUILD_DIR=$(echo CFG_LLVM_BUILD_DIR_${t} | tr - _)
    CFG_LLVM_INST_DIR=$(echo CFG_LLVM_INST_DIR_${t} | tr - _)
1121 1122 1123
    putvar $CFG_LLVM_BUILD_DIR
    putvar $CFG_LLVM_INST_DIR
done
1124 1125 1126

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

B
Brian Anderson 已提交
1130
msg
1131 1132 1133
copy_if_changed ${CFG_SRC_DIR}Makefile.in ./Makefile
move_if_changed config.tmp config.mk
rm -f config.tmp
1134
touch config.stamp
1135

1136
step_msg "complete"
B
Brian Anderson 已提交
1137
msg "run \`make help\`"
1138
msg