configure 28.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 25 26 27
need_ok() {
    if [ $? -ne 0 ]
    then
        err $1
    fi
}
28 29 30 31 32 33 34 35

need_cmd() {
    if which $1 >/dev/null 2>&1
    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 86 87 88
    for P
    do
        T=$(which $P 2>&1)
        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
        ;;
277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295
# 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
        ;;
296

297 298 299 300 301 302 303 304
#   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.
305 306 307 308 309 310 311 312 313
    *)
        err "unknown OS type: $CFG_OSTYPE"
        ;;
esac


case $CFG_CPUTYPE in

    i386 | i486 | i686 | i786 | x86)
314
        CFG_CPUTYPE=i686
315 316 317 318 319 320
        ;;

    xscale | arm)
        CFG_CPUTYPE=arm
        ;;

U
User Jyyou 已提交
321
    x86_64 | x86-64 | x64 | amd64)
322
        CFG_CPUTYPE=x86_64
323 324 325 326 327 328
        ;;

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

329 330 331 332 333 334 335 336 337 338
# 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 已提交
339
DEFAULT_BUILD="${CFG_CPUTYPE}-${CFG_OSTYPE}"
340

341 342 343
CFG_SRC_DIR="$(cd $(dirname $0) && pwd)/"
CFG_BUILD_DIR="$(pwd)/"
CFG_SELF=${CFG_SRC_DIR}$(basename $0)
344 345
CFG_CONFIGURE_ARGS="$@"

346 347 348 349 350 351
OPTIONS=""
HELP=0
if [ "$1" = "--help" ]
then
    HELP=1
    shift
352
    echo
353
    echo "Usage: $CFG_SELF [options]"
354
    echo
355
    echo "Options:"
356
    echo
357
else
358 359
    msg "recreating config.tmp"
    echo '' >config.tmp
360 361 362

    step_msg "processing $CFG_SELF args"
fi
363

364 365 366
BOOL_OPTIONS=""
VAL_OPTIONS=""

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

H
Heather 已提交
392 393 394 395 396 397
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"
398 399 400 401

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"
402 403 404 405

# On windows we just store the libraries in the bin directory because
# there's no rpath
# FIXME: Thise needs to parameterized over target triples. Do it in platform.mk
406
CFG_LIBDIR_RELATIVE=lib
407 408
if [ "$CFG_OSTYPE" = "pc-mingw32" ]
then
409
    CFG_LIBDIR_RELATIVE=bin
410 411
fi

412
valopt libdir "${CFG_PREFIX}/${CFG_LIBDIR_RELATIVE}" "install libraries"
413
valopt rustlibdir "rustlib" "subdirectory name for rustc's libraries"
H
Heather 已提交
414

415 416 417 418
# Validate Options
step_msg "validating $CFG_SELF args"
validate_opt

B
Brian Anderson 已提交
419 420
if [ $HELP -eq 1 ]
then
421
    echo
B
Brian Anderson 已提交
422 423 424
    exit 0
fi

425

426
step_msg "looking for build programs"
B
Brian Anderson 已提交
427

428
probe_need CFG_PERL        perl
429
probe_need CFG_CURLORWGET  curl wget
430 431 432 433 434 435
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
436 437 438 439 440

# 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 已提交
441
    probe CFG_GIT          git
442 443 444
    msg "git: no git directory. disabling submodules"
    CFG_DISABLE_MANAGE_SUBMODULES=1
else
B
Brian Anderson 已提交
445
    probe_need CFG_GIT     git
446 447
fi

448
probe CFG_CLANG            clang++
449
probe CFG_CCACHE           ccache
450
probe CFG_GCC              gcc
451
probe CFG_LD               ld
452
probe CFG_VALGRIND         valgrind
453
probe CFG_PERF             perf
454
probe CFG_ISCC             iscc
455 456 457
probe CFG_LLNEXTGEN        LLnextgen
probe CFG_PANDOC           pandoc
probe CFG_PDFLATEX         pdflatex
458 459
probe CFG_XETEX            xetex
probe CFG_LUATEX           luatex
460
probe CFG_NODE             nodejs node
461
probe CFG_GDB              gdb
462 463 464 465 466
if [ "$CFG_OSTYPE" = "unknown-linux-gnu" ]
then
    probe CFG_PAXCTL           paxctl /sbin/paxctl
    probe CFG_ZCAT             zcat
fi
467

Y
Young-il Choi 已提交
468 469 470 471
step_msg "looking for target specific programs"

probe CFG_ADB        adb

472 473
if [ ! -z "$CFG_PANDOC" ]
then
474 475 476 477
    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/')

478 479
    MIN_PV_MAJOR="1"
    MIN_PV_MINOR="9"
480 481 482
    # these patterns are shell globs, *not* regexps
    PV_MAJOR=${PV_MAJOR_MINOR% *}
    PV_MINOR=${PV_MAJOR_MINOR#* }
483
    if [ "$PV_MAJOR" -lt "$MIN_PV_MAJOR" ] || [ "$PV_MINOR" -lt "$MIN_PV_MINOR" ]
484
    then
485 486
        step_msg "pandoc $PV_MAJOR.$PV_MINOR is too old. Need at least $MIN_PV_MAJOR.$MIN_PV_MINOR. Disabling"
        BAD_PANDOC=1
487 488 489
    fi
fi

490 491
if [ "$CFG_OSTYPE" = "unknown-linux-gnu" ]
then
492
    if [ ! -z "$CFG_ENABLE_PAX_FLAGS" -a -z "$CFG_PAXCTL" ]
493 494 495 496
    then
        err "enabled PaX markings but no paxctl binary found"
    fi

497
    if [ -z "$CFG_DISABLE_PAX_FLAGS" ]
498 499 500 501 502
    then
        # GRSecurity/PaX detection. This can be very flaky.
        GRSEC_DETECTED=

        # /dev/grsec only exists if CONFIG_GRKERNSEC_NO_RBAC is not set.
503
        # /proc/sys/kernel/grsecurity is not available if ÇONFIG_GRKERNSEC_SYSCTL is not set.
504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524
        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
525
                CFG_ENABLE_PAX_FLAGS=1
526
            else
527
                warn "GRSecurity kernel detected but no paxctl binary found: not setting CFG_ENABLE_PAX_FLAGS"
528 529 530 531 532 533 534
            fi
        else
            step_msg "GRSecurity: no"
        fi
    fi
fi

K
klutzy 已提交
535 536 537 538 539 540
BIN_SUF=
if [ $CFG_OSTYPE = "pc-mingw32" ]
then
    BIN_SUF=.exe
fi

541
if [ ! -z "$CFG_ENABLE_LOCAL_RUST" ]
542
then
K
klutzy 已提交
543
    if [ ! -f ${CFG_LOCAL_RUST_ROOT}/bin/rustc${BIN_SUF} ]
544 545 546
    then
        err "no local rust to use"
    else
K
klutzy 已提交
547 548
        LRV=`${CFG_LOCAL_RUST_ROOT}/bin/rustc${BIN_SUF} --version`
        step_msg "using rustc at: ${CFG_LOCAL_RUST_ROOT} with version: $LRV"
549
    fi
550 551
fi

552 553 554 555 556 557 558 559
# 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

560
if [ -z "$CFG_ENABLE_CLANG" -a -z "$CFG_GCC" ]
561 562 563 564
then
    err "either clang or gcc is required"
fi

565 566 567 568 569 570 571 572 573 574
# 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 已提交
575 576
    else
        # on OS X, with xcode 5 and newer, certain developers may have
577
        # cc, gcc and g++ point to a  mixture of clang and gcc
J
Jan Niklas Hasse 已提交
578
        # if so, this will create very strange build errors
579 580 581 582 583 584 585 586 587 588 589 590
        # 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
J
Jan Niklas Hasse 已提交
591 592
            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.
593 594 595
To resolve this problem, either fix your PATH  or run configure with --enable-clang"
        fi

596 597 598
    fi
fi

599 600
if [ ! -z "$CFG_LLVM_ROOT" -a -e "$CFG_LLVM_ROOT/bin/llvm-config" ]
then
601
    step_msg "using custom LLVM at $CFG_LLVM_ROOT"
602 603

    LLVM_CONFIG="$CFG_LLVM_ROOT/bin/llvm-config"
604
    LLVM_VERSION=$($LLVM_CONFIG --version)
605 606

    case $LLVM_VERSION in
607
        (3.[2-4]svn|3.[2-4])
608 609 610 611 612
            msg "found ok version of LLVM: $LLVM_VERSION"
            ;;
        (*)
            err "bad LLVM version: $LLVM_VERSION, need >=3.0svn"
            ;;
613
    esac
614 615
fi

616
if [ ! -z "$CFG_ENABLE_CLANG" ]
617
then
618 619
    if [ -z "$CFG_CLANG" ]
    then
620
        err "clang requested but not found"
621
    fi
622 623 624
    CFG_CLANG_VERSION=$("$CFG_CLANG" \
                      --version \
                      | grep version \
625
                      | sed 's/.*\(version .*\)/\1/; s/.*based on \(LLVM .*\))/\1/' \
J
Jyun-Yan You 已提交
626
                      | cut -d ' ' -f 2)
627 628

    case $CFG_CLANG_VERSION in
C
Corey Richardson 已提交
629
        (3.0svn | 3.0 | 3.1* | 3.2* | 3.3* | 3.4* )
630
        step_msg "found ok version of CLANG: $CFG_CLANG_VERSION"
631
        CFG_C_COMPILER="clang"
632 633
        ;;
        (*)
B
Brian Anderson 已提交
634
        err "bad CLANG version: $CFG_CLANG_VERSION, need >=3.0svn"
635 636
        ;;
    esac
637 638
else
    CFG_C_COMPILER="gcc"
639
fi
640

641 642 643 644 645 646 647 648 649 650
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

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

658 659
# copy host-triples to target-triples so that hosts are a subset of targets
V_TEMP=""
H
Heather 已提交
660
for i in $CFG_HOST $CFG_TARGET;
661 662 663
do
   echo "$V_TEMP" | grep -qF $i || V_TEMP="$V_TEMP${V_TEMP:+ }$i"
done
H
Heather 已提交
664
CFG_TARGET=$V_TEMP
665 666

# check target-specific tool-chains
H
Heather 已提交
667
for i in $CFG_TARGET
668
do
669
    L_CHECK=false
H
Heather 已提交
670
    for j in $CFG_SUPPORTED_TARGET
671 672 673 674 675 676 677 678 679 680 681 682
    do
        if [ $i = $j ]
        then
            L_CHECK=true
        fi
    done

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

683
    case $i in
684
        arm-linux-androideabi)
685 686 687 688 689 690 691 692 693 694 695 696 697 698 699

            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 已提交
700 701 702 703 704 705 706
        arm-apple-darwin)
            if [ $CFG_OSTYPE != apple-darwin ]
            then
                err "The iOS target is only supported on Mac OS X"
            fi
            ;;

707 708 709 710
        *)
            ;;
    esac
done
N
Niko Matsakis 已提交
711 712 713 714 715

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

717 718
if [ ! -z "$CFG_PERF" ]
then
G
Graydon Hoare 已提交
719
    HAVE_PERF_LOGFD=`$CFG_PERF stat --log-fd 2>&1 | grep 'unknown option'`
720 721 722 723 724 725 726
    if [ -z "$HAVE_PERF_LOGFD" ];
    then
        CFG_PERF_WITH_LOGFD=1
        putvar CFG_PERF_WITH_LOGFD
    fi
fi

727
step_msg "making directories"
728

729
for i in \
730
    doc doc/std doc/extra \
731
    dl tmp
732 733 734 735
do
    make_dir $i
done

H
Heather 已提交
736
for t in $CFG_HOST
737
do
738
    make_dir $t/llvm
739 740
done

H
Heather 已提交
741
for t in $CFG_HOST
742
do
743
    make_dir $t/rustllvm
744 745
done

H
Heather 已提交
746
for t in $CFG_TARGET
747
do
748
  make_dir $t/rt
749
  for s in 0 1 2 3
750
  do
751
    make_dir $t/rt/stage$s
752 753 754 755
    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
756
    for i in                                          \
D
Daniel Micay 已提交
757
      isaac sync test \
758
      arch/i386 arch/x86_64 arch/arm arch/mips  \
759
      sundown/src sundown/html
760
    do
761
      make_dir $t/rt/stage$s/$i
762
    done
763 764 765
  done
done

766
for h in $CFG_HOST
767
do
H
Heather 已提交
768
    for t in $CFG_TARGET
769
    do
N
Niko Matsakis 已提交
770 771 772 773
        for i in 0 1 2 3
        do
            # host bin dir
            make_dir $h/stage$i/bin
774

N
Niko Matsakis 已提交
775
            # host lib dir
776
            make_dir $h/stage$i/$CFG_LIBDIR_RELATIVE
777

A
Alex Crichton 已提交
778 779 780
            # host test dir
            make_dir $h/stage$i/test

N
Niko Matsakis 已提交
781
            # target bin dir
782
            make_dir $h/stage$i/$CFG_LIBDIR_RELATIVE/$CFG_RUSTLIBDIR/$t/bin
783

N
Niko Matsakis 已提交
784
            # target lib dir
785
            make_dir $h/stage$i/$CFG_LIBDIR_RELATIVE/$CFG_RUSTLIBDIR/$t/lib
N
Niko Matsakis 已提交
786
        done
787
    done
N
Niko Matsakis 已提交
788 789

    make_dir $h/test/run-pass
790
    make_dir $h/test/run-pass-fulldeps
N
Niko Matsakis 已提交
791 792 793 794 795
    make_dir $h/test/run-fail
    make_dir $h/test/compile-fail
    make_dir $h/test/bench
    make_dir $h/test/perf
    make_dir $h/test/pretty
B
Brian Leibig 已提交
796
    make_dir $h/test/debug-info
797
    make_dir $h/test/codegen
B
Brian Anderson 已提交
798
    make_dir $h/test/doc-tutorial
799
    make_dir $h/test/doc-guide-ffi
800
    make_dir $h/test/doc-guide-runtime
801
    make_dir $h/test/doc-guide-macros
802 803
    make_dir $h/test/doc-guide-lifetimes
    make_dir $h/test/doc-guide-pointers
804 805 806
    make_dir $h/test/doc-guide-container
    make_dir $h/test/doc-guide-tasks
    make_dir $h/test/doc-guide-conditions
807
    make_dir $h/test/doc-complement-cheatsheet
808
    make_dir $h/test/doc-rust
809 810
done

811 812 813 814
# Configure submodules
step_msg "configuring submodules"

# Have to be in the top of src directory for this
815 816
if [ -z $CFG_DISABLE_MANAGE_SUBMODULES ]
then
817
    cd ${CFG_SRC_DIR}
818

819
    msg "git: submodule sync"
820
    "${CFG_GIT}" submodule sync
821 822

    msg "git: submodule update"
823
    "${CFG_GIT}" submodule update --init
824 825
    need_ok "git failed"

826
    msg "git: submodule foreach sync"
827
    "${CFG_GIT}" submodule foreach --recursive 'if test -e .gitmodules; then git submodule sync; fi'
828 829
    need_ok "git failed"

830
    msg "git: submodule foreach update"
831
    "${CFG_GIT}" submodule update --init --recursive
832 833 834 835 836 837 838
    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

839
    msg "git: submodule clobber"
840
    "${CFG_GIT}" submodule foreach --recursive git clean -dxf
841
    need_ok "git failed"
842
    "${CFG_GIT}" submodule foreach --recursive git checkout .
843 844
    need_ok "git failed"

845
    cd ${CFG_BUILD_DIR}
846 847
fi

848 849
# Configure llvm, only if necessary
step_msg "looking at LLVM"
850
CFG_LLVM_SRC_DIR=${CFG_SRC_DIR}src/llvm/
H
Heather 已提交
851
for t in $CFG_HOST
852
do
853 854
    do_reconfigure=1

855 856
    if [ -z $CFG_LLVM_ROOT ]
    then
857
        LLVM_BUILD_DIR=${CFG_BUILD_DIR}$t/llvm
858 859
        if [ ! -z "$CFG_DISABLE_OPTIMIZE_LLVM" ]
        then
B
Brian Anderson 已提交
860
            LLVM_DBG_OPTS="--enable-debug-symbols --disable-optimized"
861 862
            # Just use LLVM straight from its build directory to
            # avoid 'make install' time
863
            LLVM_INST_DIR=$LLVM_BUILD_DIR/Debug
864 865
        else
            LLVM_DBG_OPTS="--enable-optimized"
866 867 868 869 870 871 872 873
            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
874 875 876 877 878 879 880 881
        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
882

N
Niko Matsakis 已提交
883

884
    if [ ${do_reconfigure} -ne 0 ]
N
Niko Matsakis 已提交
885
    then
886 887 888 889 890 891
    # 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
892
            config_status="${LLVM_BUILD_DIR}/config.status"
893 894 895 896 897 898 899 900
            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 已提交
901
    fi
902 903 904 905 906

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

J
Jyun-Yan You 已提交
907
        LLVM_TARGETS="--enable-targets=x86,x86_64,arm,mips"
908 909 910 911 912
        LLVM_BUILD="--build=$t"
        LLVM_HOST="--host=$t"
        LLVM_TARGET="--target=$t"

        # Disable unused LLVM features
913
        LLVM_OPTS="$LLVM_DBG_OPTS $LLVM_ASSERTION_OPTS --disable-docs --enable-bindings=none"
914 915 916
        # Disable term-info, linkage of which comes in multiple forms,
        # making our snapshots incompatible (#9334)
        LLVM_OPTS="$LLVM_OPTS --disable-terminfo"
917 918
        # Try to have LLVM pull in as few dependencies as possible (#9397)
        LLVM_OPTS="$LLVM_OPTS --disable-zlib --disable-libffi"
A
Alex Crichton 已提交
919 920 921 922
        # LLVM says it needs a "new" clang/gcc, but we seem to get by ok with
        # older versions on the bots. Get by for a little longer by asking it to
        # not do version detection
        LLVM_OPTS="$LLVM_OPTS --disable-compiler-version-checks"
923

K
klutzy 已提交
924 925 926
        # 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
927
        case "$CFG_BUILD" in
K
klutzy 已提交
928
            (*-mingw32)
929 930 931 932
            LLVM_OPTS="$LLVM_OPTS --disable-pthreads"
            ;;
        esac

933 934 935 936 937 938 939 940 941
        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"
            ;;
            ("clang")
942 943
            LLVM_CXX_32="clang++ -m32 -Qunused-arguments"
            LLVM_CC_32="clang -m32 -Qunused-arguments"
944

945 946
            LLVM_CXX_64="clang++ -Qunused-arguments"
            LLVM_CC_64="clang -Qunused-arguments"
947 948 949 950 951 952 953 954 955
            ;;
            ("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")
956 957 958 959 960
            LLVM_CXX_32="g++ -m32"
            LLVM_CC_32="gcc -m32"

            LLVM_CXX_64="g++"
            LLVM_CC_64="gcc"
961
        esac
962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992

        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 \
993
                        $LLVM_HOST $LLVM_TARGET --with-python=$CFG_PYTHON"
994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006

        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]:*)
1007
                ${CFG_LLVM_SRC_DIR}configure $LLVM_FLAGS
1008 1009
                ;;
            *)
1010
                ${CFG_BUILD_DIR}${CFG_LLVM_SRC_DIR}configure \
1011 1012 1013 1014
                    $LLVM_FLAGS
                ;;
        esac
        need_ok "LLVM configure failed"
B
Brian Anderson 已提交
1015

1016
        cd $CFG_BUILD_DIR
1017
    fi
1018

1019 1020 1021 1022 1023 1024 1025 1026 1027 1028
    # 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 已提交
1029 1030 1031 1032 1033 1034 1035 1036 1037 1038
done


step_msg "writing configuration"

putvar CFG_SRC_DIR
putvar CFG_BUILD_DIR
putvar CFG_OSTYPE
putvar CFG_CPUTYPE
putvar CFG_CONFIGURE_ARGS
1039
putvar CFG_PREFIX
H
Heather 已提交
1040 1041 1042
putvar CFG_BUILD
putvar CFG_HOST
putvar CFG_TARGET
B
Brian Anderson 已提交
1043
putvar CFG_C_COMPILER
1044
putvar CFG_LIBDIR
1045
putvar CFG_RUSTLIBDIR
1046
putvar CFG_LIBDIR_RELATIVE
B
Brian Anderson 已提交
1047
putvar CFG_DISABLE_MANAGE_SUBMODULES
1048 1049
putvar CFG_ANDROID_CROSS_PATH
putvar CFG_MINGW32_CROSS_PATH
H
Heather 已提交
1050
putvar CFG_MANDIR
1051
putvar CFG_DISABLE_INJECT_STD_VERSION
H
Heather 已提交
1052

1053 1054 1055 1056 1057 1058 1059 1060
# 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

1061 1062 1063 1064 1065 1066 1067
if [ ! -z "$CFG_ENABLE_CCACHE" ]
then
    CFG_CCACHE_BASEDIR=${CFG_SRC_DIR}
    putvar CFG_CCACHE_BASEDIR
fi


1068 1069 1070 1071 1072 1073
if [ ! -z $BAD_PANDOC ]
then
    CFG_PANDOC=
    putvar CFG_PANDOC
fi

B
Brian Anderson 已提交
1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085
# 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 已提交
1086
for t in $CFG_HOST
B
Brian Anderson 已提交
1087 1088 1089
do
    CFG_LLVM_BUILD_DIR=$(echo CFG_LLVM_BUILD_DIR_${t} | tr - _)
    CFG_LLVM_INST_DIR=$(echo CFG_LLVM_INST_DIR_${t} | tr - _)
1090 1091 1092
    putvar $CFG_LLVM_BUILD_DIR
    putvar $CFG_LLVM_INST_DIR
done
1093 1094 1095

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

B
Brian Anderson 已提交
1099
msg
1100 1101 1102
copy_if_changed ${CFG_SRC_DIR}Makefile.in ./Makefile
move_if_changed config.tmp config.mk
rm -f config.tmp
1103
touch config.stamp
1104

1105
step_msg "complete"
B
Brian Anderson 已提交
1106
msg "run \`make help\`"
1107
msg