configure 27.8 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
valopt prefix "/usr/local" "set installation prefix"
385
valopt local-rust-root "/usr/local" "set prefix for local rust binary"
B
Brian Anderson 已提交
386
valopt llvm-root "" "set LLVM root"
387 388
valopt android-cross-path "/opt/ndk_standalone" "Android NDK standalone path"
valopt mingw32-cross-path "" "MinGW32 cross compiler path"
389

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

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"
400
valopt libdir "${CFG_PREFIX}/lib" "install libraries"
H
Heather 已提交
401

402 403 404 405
# Validate Options
step_msg "validating $CFG_SELF args"
validate_opt

B
Brian Anderson 已提交
406 407
if [ $HELP -eq 1 ]
then
408
    echo
B
Brian Anderson 已提交
409 410 411
    exit 0
fi

412

413
step_msg "looking for build programs"
B
Brian Anderson 已提交
414

415
probe_need CFG_PERL        perl
416
probe_need CFG_CURLORWGET  curl wget
417 418 419 420 421 422
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
423 424 425 426 427

# 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 已提交
428
    probe CFG_GIT          git
429 430 431
    msg "git: no git directory. disabling submodules"
    CFG_DISABLE_MANAGE_SUBMODULES=1
else
B
Brian Anderson 已提交
432
    probe_need CFG_GIT     git
433 434
fi

435
probe CFG_CLANG            clang++
436
probe CFG_CCACHE           ccache
437
probe CFG_GCC              gcc
438
probe CFG_LD               ld
439
probe CFG_VALGRIND         valgrind
440
probe CFG_PERF             perf
441
probe CFG_ISCC             iscc
442 443 444
probe CFG_LLNEXTGEN        LLnextgen
probe CFG_PANDOC           pandoc
probe CFG_PDFLATEX         pdflatex
445 446
probe CFG_XETEX            xetex
probe CFG_LUATEX           luatex
447
probe CFG_NODE             nodejs node
448
probe CFG_GDB              gdb
449 450 451 452 453
if [ "$CFG_OSTYPE" = "unknown-linux-gnu" ]
then
    probe CFG_PAXCTL           paxctl /sbin/paxctl
    probe CFG_ZCAT             zcat
fi
454

Y
Young-il Choi 已提交
455 456 457 458
step_msg "looking for target specific programs"

probe CFG_ADB        adb

459 460
if [ ! -z "$CFG_PANDOC" ]
then
461 462 463 464
    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/')

465 466
    MIN_PV_MAJOR="1"
    MIN_PV_MINOR="9"
467 468 469
    # these patterns are shell globs, *not* regexps
    PV_MAJOR=${PV_MAJOR_MINOR% *}
    PV_MINOR=${PV_MAJOR_MINOR#* }
470
    if [ "$PV_MAJOR" -lt "$MIN_PV_MAJOR" ] || [ "$PV_MINOR" -lt "$MIN_PV_MINOR" ]
471
    then
472 473
        step_msg "pandoc $PV_MAJOR.$PV_MINOR is too old. Need at least $MIN_PV_MAJOR.$MIN_PV_MINOR. Disabling"
        BAD_PANDOC=1
474 475 476
    fi
fi

477 478
if [ "$CFG_OSTYPE" = "unknown-linux-gnu" ]
then
479
    if [ ! -z "$CFG_ENABLE_PAX_FLAGS" -a -z "$CFG_PAXCTL" ]
480 481 482 483
    then
        err "enabled PaX markings but no paxctl binary found"
    fi

484
    if [ -z "$CFG_DISABLE_PAX_FLAGS" ]
485 486 487 488 489
    then
        # GRSecurity/PaX detection. This can be very flaky.
        GRSEC_DETECTED=

        # /dev/grsec only exists if CONFIG_GRKERNSEC_NO_RBAC is not set.
490
        # /proc/sys/kernel/grsecurity is not available if ÇONFIG_GRKERNSEC_SYSCTL is not set.
491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511
        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
512
                CFG_ENABLE_PAX_FLAGS=1
513
            else
514
                warn "GRSecurity kernel detected but no paxctl binary found: not setting CFG_ENABLE_PAX_FLAGS"
515 516 517 518 519 520 521
            fi
        else
            step_msg "GRSecurity: no"
        fi
    fi
fi

K
klutzy 已提交
522 523 524 525 526 527
BIN_SUF=
if [ $CFG_OSTYPE = "pc-mingw32" ]
then
    BIN_SUF=.exe
fi

528
if [ ! -z "$CFG_ENABLE_LOCAL_RUST" ]
529
then
K
klutzy 已提交
530
    if [ ! -f ${CFG_LOCAL_RUST_ROOT}/bin/rustc${BIN_SUF} ]
531 532 533
    then
        err "no local rust to use"
    else
K
klutzy 已提交
534 535
        LRV=`${CFG_LOCAL_RUST_ROOT}/bin/rustc${BIN_SUF} --version`
        step_msg "using rustc at: ${CFG_LOCAL_RUST_ROOT} with version: $LRV"
536
    fi
537 538
fi

539 540 541 542 543 544 545 546
# 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

547
if [ -z "$CFG_ENABLE_CLANG" -a -z "$CFG_GCC" ]
548 549 550 551
then
    err "either clang or gcc is required"
fi

552 553 554 555 556 557 558 559 560 561
# 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
562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582
    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

583 584 585
    fi
fi

586 587
if [ ! -z "$CFG_LLVM_ROOT" -a -e "$CFG_LLVM_ROOT/bin/llvm-config" ]
then
588
    step_msg "using custom LLVM at $CFG_LLVM_ROOT"
589 590

    LLVM_CONFIG="$CFG_LLVM_ROOT/bin/llvm-config"
591
    LLVM_VERSION=$($LLVM_CONFIG --version)
592 593

    case $LLVM_VERSION in
594 595 596 597 598 599
        (3.3|3.3svn|3.2|3.2svn)
            msg "found ok version of LLVM: $LLVM_VERSION"
            ;;
        (*)
            err "bad LLVM version: $LLVM_VERSION, need >=3.0svn"
            ;;
600
    esac
601 602
fi

603
if [ ! -z "$CFG_ENABLE_CLANG" ]
604
then
605 606
    if [ -z "$CFG_CLANG" ]
    then
607
        err "clang requested but not found"
608
    fi
609 610 611
    CFG_CLANG_VERSION=$("$CFG_CLANG" \
                      --version \
                      | grep version \
612
                      | sed 's/.*\(version .*\)/\1/; s/.*based on \(LLVM .*\))/\1/' \
J
Jyun-Yan You 已提交
613
                      | cut -d ' ' -f 2)
614 615

    case $CFG_CLANG_VERSION in
C
Corey Richardson 已提交
616
        (3.0svn | 3.0 | 3.1* | 3.2* | 3.3* | 3.4* )
617
        step_msg "found ok version of CLANG: $CFG_CLANG_VERSION"
618
        CFG_C_COMPILER="clang"
619 620
        ;;
        (*)
B
Brian Anderson 已提交
621
        err "bad CLANG version: $CFG_CLANG_VERSION, need >=3.0svn"
622 623
        ;;
    esac
624 625
else
    CFG_C_COMPILER="gcc"
626
fi
627

628 629 630 631 632 633 634 635 636 637
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

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

645 646
# copy host-triples to target-triples so that hosts are a subset of targets
V_TEMP=""
H
Heather 已提交
647
for i in $CFG_HOST $CFG_TARGET;
648 649 650
do
   echo "$V_TEMP" | grep -qF $i || V_TEMP="$V_TEMP${V_TEMP:+ }$i"
done
H
Heather 已提交
651
CFG_TARGET=$V_TEMP
652 653

# check target-specific tool-chains
H
Heather 已提交
654
for i in $CFG_TARGET
655
do
656
    L_CHECK=false
H
Heather 已提交
657
    for j in $CFG_SUPPORTED_TARGET
658 659 660 661 662 663 664 665 666 667 668 669
    do
        if [ $i = $j ]
        then
            L_CHECK=true
        fi
    done

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

670
    case $i in
671
        arm-linux-androideabi)
672 673 674 675 676 677 678 679 680 681 682 683 684 685 686

            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 已提交
687 688 689 690 691 692 693
        arm-apple-darwin)
            if [ $CFG_OSTYPE != apple-darwin ]
            then
                err "The iOS target is only supported on Mac OS X"
            fi
            ;;

694 695 696 697
        *)
            ;;
    esac
done
N
Niko Matsakis 已提交
698 699 700 701 702

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

704 705
if [ ! -z "$CFG_PERF" ]
then
G
Graydon Hoare 已提交
706
    HAVE_PERF_LOGFD=`$CFG_PERF stat --log-fd 2>&1 | grep 'unknown option'`
707 708 709 710 711 712 713
    if [ -z "$HAVE_PERF_LOGFD" ];
    then
        CFG_PERF_WITH_LOGFD=1
        putvar CFG_PERF_WITH_LOGFD
    fi
fi

714
step_msg "making directories"
715

716
for i in \
717
    doc doc/std doc/extra \
718
    dl tmp
719 720 721 722
do
    make_dir $i
done

H
Heather 已提交
723
for t in $CFG_HOST
724
do
725
    make_dir $t/llvm
726 727
done

H
Heather 已提交
728
for t in $CFG_HOST
729
do
730
    make_dir $t/rustllvm
731 732
done

H
Heather 已提交
733
for t in $CFG_TARGET
734
do
735
  make_dir $t/rt
736
  for s in 0 1 2 3
737
  do
738
    make_dir $t/rt/stage$s
739 740 741 742
    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
743
    for i in                                          \
D
Daniel Micay 已提交
744
      isaac sync test \
745
      arch/i386 arch/x86_64 arch/arm arch/mips  \
746
      sundown/src sundown/html
747
    do
748
      make_dir $t/rt/stage$s/$i
749
    done
750 751 752
  done
done

753 754
# On windows we just store the libraries in the bin directory because
# there's no rpath
755
# FIXME: Thise needs to parameterized over target triples. Do it in platform.mk
756 757 758 759 760 761
CFG_LIBDIR=lib
if [ "$CFG_OSTYPE" = "pc-mingw32" ]
then
    CFG_LIBDIR=bin
fi

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

N
Niko Matsakis 已提交
771
            # host lib dir
772
            make_dir $h/stage$i/$CFG_LIBDIR
773

A
Alex Crichton 已提交
774 775 776
            # host test dir
            make_dir $h/stage$i/test

N
Niko Matsakis 已提交
777
            # target bin dir
778
            make_dir $h/stage$i/$CFG_LIBDIR/rustc/$t/bin
779

N
Niko Matsakis 已提交
780
            # target lib dir
781
            make_dir $h/stage$i/$CFG_LIBDIR/rustc/$t/$CFG_LIBDIR
N
Niko Matsakis 已提交
782
        done
783
    done
N
Niko Matsakis 已提交
784 785

    make_dir $h/test/run-pass
786
    make_dir $h/test/run-pass-fulldeps
N
Niko Matsakis 已提交
787 788 789 790 791
    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 已提交
792
    make_dir $h/test/debug-info
793
    make_dir $h/test/codegen
B
Brian Anderson 已提交
794
    make_dir $h/test/doc-tutorial
795 796 797
    make_dir $h/test/doc-tutorial-ffi
    make_dir $h/test/doc-tutorial-macros
    make_dir $h/test/doc-tutorial-borrowed-ptr
798
    make_dir $h/test/doc-tutorial-container
799
    make_dir $h/test/doc-tutorial-tasks
G
Graydon Hoare 已提交
800
    make_dir $h/test/doc-tutorial-conditions
801
    make_dir $h/test/doc-rust
802 803
done

804 805 806 807
# Configure submodules
step_msg "configuring submodules"

# Have to be in the top of src directory for this
808 809
if [ -z $CFG_DISABLE_MANAGE_SUBMODULES ]
then
810
    cd ${CFG_SRC_DIR}
811

812
    msg "git: submodule sync"
813
    "${CFG_GIT}" submodule sync
814 815

    msg "git: submodule update"
816
    "${CFG_GIT}" submodule update --init
817 818
    need_ok "git failed"

819
    msg "git: submodule foreach sync"
820
    "${CFG_GIT}" submodule foreach --recursive 'if test -e .gitmodules; then git submodule sync; fi'
821 822
    need_ok "git failed"

823
    msg "git: submodule foreach update"
824
    "${CFG_GIT}" submodule update --init --recursive
825 826 827 828 829 830 831
    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

832
    msg "git: submodule clobber"
833
    "${CFG_GIT}" submodule foreach --recursive git clean -dxf
834
    need_ok "git failed"
835
    "${CFG_GIT}" submodule foreach --recursive git checkout .
836 837
    need_ok "git failed"

838
    cd ${CFG_BUILD_DIR}
839 840
fi

841 842
# Configure llvm, only if necessary
step_msg "looking at LLVM"
843
CFG_LLVM_SRC_DIR=${CFG_SRC_DIR}src/llvm/
H
Heather 已提交
844
for t in $CFG_HOST
845
do
846 847
    do_reconfigure=1

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

N
Niko Matsakis 已提交
876

877
    if [ ${do_reconfigure} -ne 0 ]
N
Niko Matsakis 已提交
878
    then
879 880 881 882 883 884
    # 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
885
            config_status="${LLVM_BUILD_DIR}/config.status"
886 887 888 889 890 891 892 893
            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 已提交
894
    fi
895 896 897 898 899

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

J
Jyun-Yan You 已提交
900
        LLVM_TARGETS="--enable-targets=x86,x86_64,arm,mips"
901 902 903 904 905
        LLVM_BUILD="--build=$t"
        LLVM_HOST="--host=$t"
        LLVM_TARGET="--target=$t"

        # Disable unused LLVM features
906
        LLVM_OPTS="$LLVM_DBG_OPTS $LLVM_ASSERTION_OPTS --disable-docs --enable-bindings=none"
907 908 909
        # Disable term-info, linkage of which comes in multiple forms,
        # making our snapshots incompatible (#9334)
        LLVM_OPTS="$LLVM_OPTS --disable-terminfo"
910 911
        # Try to have LLVM pull in as few dependencies as possible (#9397)
        LLVM_OPTS="$LLVM_OPTS --disable-zlib --disable-libffi"
912

K
klutzy 已提交
913 914 915
        # 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
916
        case "$CFG_BUILD" in
K
klutzy 已提交
917
            (*-mingw32)
918 919 920 921
            LLVM_OPTS="$LLVM_OPTS --disable-pthreads"
            ;;
        esac

922 923 924 925 926 927 928 929 930
        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")
931 932
            LLVM_CXX_32="clang++ -m32 -Qunused-arguments"
            LLVM_CC_32="clang -m32 -Qunused-arguments"
933

934 935
            LLVM_CXX_64="clang++ -Qunused-arguments"
            LLVM_CC_64="clang -Qunused-arguments"
936 937 938 939 940 941 942 943 944
            ;;
            ("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")
945 946 947 948 949
            LLVM_CXX_32="g++ -m32"
            LLVM_CC_32="gcc -m32"

            LLVM_CXX_64="g++"
            LLVM_CC_64="gcc"
950
        esac
951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981

        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 \
982
                        $LLVM_HOST $LLVM_TARGET --with-python=$CFG_PYTHON"
983 984 985 986 987 988 989 990 991 992 993 994 995

        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]:*)
996
                ${CFG_LLVM_SRC_DIR}configure $LLVM_FLAGS
997 998
                ;;
            *)
999
                ${CFG_BUILD_DIR}${CFG_LLVM_SRC_DIR}configure \
1000 1001 1002 1003
                    $LLVM_FLAGS
                ;;
        esac
        need_ok "LLVM configure failed"
B
Brian Anderson 已提交
1004

1005
        cd $CFG_BUILD_DIR
1006
    fi
1007

1008 1009 1010 1011 1012 1013 1014 1015 1016 1017
    # 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 已提交
1018 1019 1020 1021 1022 1023 1024 1025 1026 1027
done


step_msg "writing configuration"

putvar CFG_SRC_DIR
putvar CFG_BUILD_DIR
putvar CFG_OSTYPE
putvar CFG_CPUTYPE
putvar CFG_CONFIGURE_ARGS
1028
putvar CFG_PREFIX
H
Heather 已提交
1029 1030 1031
putvar CFG_BUILD
putvar CFG_HOST
putvar CFG_TARGET
B
Brian Anderson 已提交
1032
putvar CFG_C_COMPILER
1033
putvar CFG_LIBDIR
B
Brian Anderson 已提交
1034
putvar CFG_DISABLE_MANAGE_SUBMODULES
1035 1036
putvar CFG_ANDROID_CROSS_PATH
putvar CFG_MINGW32_CROSS_PATH
H
Heather 已提交
1037 1038
putvar CFG_MANDIR

1039 1040 1041 1042 1043 1044 1045 1046
# 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

1047 1048 1049 1050 1051 1052 1053
if [ ! -z "$CFG_ENABLE_CCACHE" ]
then
    CFG_CCACHE_BASEDIR=${CFG_SRC_DIR}
    putvar CFG_CCACHE_BASEDIR
fi


1054 1055 1056 1057 1058 1059
if [ ! -z $BAD_PANDOC ]
then
    CFG_PANDOC=
    putvar CFG_PANDOC
fi

B
Brian Anderson 已提交
1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077
if head -n 1 ${CFG_SRC_DIR}src/snapshots.txt | grep -q '^T'
then
    CFG_IN_TRANSITION=1
    putvar CFG_IN_TRANSITION
fi

# 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 已提交
1078
for t in $CFG_HOST
B
Brian Anderson 已提交
1079 1080 1081
do
    CFG_LLVM_BUILD_DIR=$(echo CFG_LLVM_BUILD_DIR_${t} | tr - _)
    CFG_LLVM_INST_DIR=$(echo CFG_LLVM_INST_DIR_${t} | tr - _)
1082 1083 1084
    putvar $CFG_LLVM_BUILD_DIR
    putvar $CFG_LLVM_INST_DIR
done
1085 1086 1087

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

B
Brian Anderson 已提交
1091
msg
1092 1093 1094
copy_if_changed ${CFG_SRC_DIR}Makefile.in ./Makefile
move_if_changed config.tmp config.mk
rm -f config.tmp
1095
touch config.stamp
1096

1097
step_msg "complete"