configure 23.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 142 143 144 145 146 147 148 149
            echo ""
            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


339
DEFAULT_BUILD_TRIPLE="${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 352 353 354 355 356 357
OPTIONS=""
HELP=0
if [ "$1" = "--help" ]
then
    HELP=1
    shift
    echo ""
    echo "Usage: $CFG_SELF [options]"
    echo ""
    echo "Options:"
    echo ""
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=""

367
opt sharedstd 1 "build libstd as a shared library"
M
Mahmut Bulut 已提交
368
opt valgrind 0 "run tests with valgrind (memcheck by default)"
369
opt helgrind 0 "run tests with helgrind instead of memcheck"
370
opt docs     1 "build documentation"
371
opt optimize 1 "build optimized rust code"
N
Niko Matsakis 已提交
372
opt optimize-cxx 1 "build optimized C++ code"
N
Niko Matsakis 已提交
373
opt optimize-llvm 1 "build optimized LLVM"
374
opt debug 0 "build with extra debug fun"
375
opt fast-make 0 "use .gitmodules as timestamp for submodule deps"
376
opt manage-submodules 1 "let the build manage the git submodules"
377
opt mingw-cross 0 "cross-compile for win32 using mingw"
378
opt clang 0 "prefer clang to gcc for building the runtime"
379
opt local-rust 0 "use an installed rustc rather than downloading a snapshot"
380
opt pax-flags 0 "apply PaX flags to rustc binaries (required for GRSecurity/PaX-patched kernels)"
381
valopt prefix "/usr/local" "set installation prefix"
382
valopt local-rust-root "/usr/local" "set prefix for local rust binary"
B
Brian Anderson 已提交
383
valopt llvm-root "" "set LLVM root"
384 385 386
valopt build-triple "${DEFAULT_BUILD_TRIPLE}" "LLVM build triple"
valopt host-triples "${CFG_BUILD_TRIPLE}" "LLVM host triples"
valopt target-triples "${CFG_HOST_TRIPLES}" "LLVM target triples"
387 388
valopt android-cross-path "/opt/ndk_standalone" "Android NDK standalone path"
valopt mingw32-cross-path "" "MinGW32 cross compiler path"
389

390 391 392 393
# Validate Options
step_msg "validating $CFG_SELF args"
validate_opt

B
Brian Anderson 已提交
394 395 396 397 398 399
if [ $HELP -eq 1 ]
then
    echo ""
    exit 0
fi

400

401
step_msg "looking for build programs"
B
Brian Anderson 已提交
402

403 404
probe_need CFG_PERL        perl
probe_need CFG_CURL        curl
405 406 407 408 409 410
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
411 412 413 414 415

# 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 已提交
416
    probe CFG_GIT          git
417 418 419
    msg "git: no git directory. disabling submodules"
    CFG_DISABLE_MANAGE_SUBMODULES=1
else
B
Brian Anderson 已提交
420
    probe_need CFG_GIT     git
421 422
fi

423
probe CFG_CLANG            clang++
424
probe CFG_GCC              gcc
425
probe CFG_LD               ld
426
probe CFG_VALGRIND         valgrind
427
probe CFG_PERF             perf
428
probe CFG_ISCC             iscc
429 430 431
probe CFG_LLNEXTGEN        LLnextgen
probe CFG_PANDOC           pandoc
probe CFG_PDFLATEX         pdflatex
432 433
probe CFG_XETEX            xetex
probe CFG_LUATEX           luatex
434
probe CFG_NODE             nodejs node
435
probe CFG_GDB              gdb
436 437 438 439 440
if [ "$CFG_OSTYPE" = "unknown-linux-gnu" ]
then
    probe CFG_PAXCTL           paxctl /sbin/paxctl
    probe CFG_ZCAT             zcat
fi
441

Y
Young-il Choi 已提交
442 443 444 445
step_msg "looking for target specific programs"

probe CFG_ADB        adb

446 447
if [ ! -z "$CFG_PANDOC" ]
then
448 449 450 451 452 453 454
    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/')

    # these patterns are shell globs, *not* regexps
    PV_MAJOR=${PV_MAJOR_MINOR% *}
    PV_MINOR=${PV_MAJOR_MINOR#* }
455
    if [ "$PV_MAJOR" -lt "1" ] || [ "$PV_MINOR" -lt "8" ]
456
    then
457 458
		step_msg "pandoc $PV_MAJOR.$PV_MINOR is too old. disabling"
		BAD_PANDOC=1
459 460 461
    fi
fi

462 463
if [ "$CFG_OSTYPE" = "unknown-linux-gnu" ]
then
464
    if [ ! -z "$CFG_ENABLE_PAX_FLAGS" -a -z "$CFG_PAXCTL" ]
465 466 467 468
    then
        err "enabled PaX markings but no paxctl binary found"
    fi

469
    if [ -z "$CFG_DISABLE_PAX_FLAGS" ]
470 471 472 473 474
    then
        # GRSecurity/PaX detection. This can be very flaky.
        GRSEC_DETECTED=

        # /dev/grsec only exists if CONFIG_GRKERNSEC_NO_RBAC is not set.
475
        # /proc/sys/kernel/grsecurity is not available if ÇONFIG_GRKERNSEC_SYSCTL is not set.
476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496
        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
497
                CFG_ENABLE_PAX_FLAGS=1
498
            else
499
                warn "GRSecurity kernel detected but no paxctl binary found: not setting CFG_ENABLE_PAX_FLAGS"
500 501 502 503 504 505 506
            fi
        else
            step_msg "GRSecurity: no"
        fi
    fi
fi

507
if [ ! -z "$CFG_ENABLE_LOCAL_RUST" ]
508
then
509 510 511 512 513 514 515
    if [ ! -f ${CFG_LOCAL_RUST_ROOT}/bin/rustc ]
    then
        err "no local rust to use"
    else
        LRV=`${CFG_LOCAL_RUST_ROOT}/bin/rustc --version`
        step_msg "using rustc at: ${CFG_LOCAL_RUST_ROOT} with version: " $LRV
    fi
516 517
fi

518 519 520 521 522 523 524 525 526
# 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


527
if [ -z "$CFG_ENABLE_CLANG" -a -z "$CFG_GCC" ]
528 529 530 531
then
    err "either clang or gcc is required"
fi

532 533
if [ ! -z "$CFG_LLVM_ROOT" -a -e "$CFG_LLVM_ROOT/bin/llvm-config" ]
then
534
    step_msg "using custom LLVM at $CFG_LLVM_ROOT"
535 536

    LLVM_CONFIG="$CFG_LLVM_ROOT/bin/llvm-config"
537
    LLVM_VERSION=$($LLVM_CONFIG --version)
538 539

    case $LLVM_VERSION in
S
Seo Sanghyeon 已提交
540
	(3.3|3.3svn|3.2|3.2svn)
B
Brian Anderson 已提交
541
	    msg "found ok version of LLVM: $LLVM_VERSION"
542 543
	    ;;
	(*)
544
	    err "bad LLVM version: $LLVM_VERSION, need >=3.0svn"
545 546
	    ;;
    esac
547 548
fi

549
if [ ! -z "$CFG_ENABLE_CLANG" ]
550
then
551 552 553 554
    if [ -z "$CFG_CLANG" ]
    then
	err "clang requested but not found"
    fi
555 556 557
    CFG_CLANG_VERSION=$("$CFG_CLANG" \
                      --version \
                      | grep version \
J
Jyun-Yan You 已提交
558 559
                      | sed 's/.*\(version .*\)/\1/' \
                      | cut -d ' ' -f 2)
560 561

    case $CFG_CLANG_VERSION in
562
        (3.0svn | 3.0 | 3.1* | 3.2* | 3.3* | 4.0* | 4.1* | 4.2*)
563
        step_msg "found ok version of CLANG: $CFG_CLANG_VERSION"
564
        CFG_C_COMPILER="clang"
565 566
        ;;
        (*)
B
Brian Anderson 已提交
567
        err "bad CLANG version: $CFG_CLANG_VERSION, need >=3.0svn"
568 569
        ;;
    esac
570 571
else
    CFG_C_COMPILER="gcc"
572
fi
573

574
# a little post-processing of various config values
575

576
CFG_PREFIX=${CFG_PREFIX%/}
B
Brian Anderson 已提交
577
CFG_HOST_TRIPLES="$(echo $CFG_HOST_TRIPLES | tr ',' ' ')"
578
CFG_TARGET_TRIPLES="$(echo $CFG_TARGET_TRIPLES | tr ',' ' ')"
579
CFG_SUPPORTED_TARGET_TRIPLES="$(grep ^CC_*=* $CFG_SRC_DIR/mk/platform.mk | sed -e 's/^CC_//' -e 's/\([^=]*\).*/\1/' | xargs)"
N
Niko Matsakis 已提交
580

581 582 583 584 585 586 587 588 589 590 591
# copy host-triples to target-triples so that hosts are a subset of targets
V_TEMP=""
for i in $CFG_HOST_TRIPLES $CFG_TARGET_TRIPLES;
do
   echo "$V_TEMP" | grep -qF $i || V_TEMP="$V_TEMP${V_TEMP:+ }$i"
done
CFG_TARGET_TRIPLES=$V_TEMP

# check target-specific tool-chains
for i in $CFG_TARGET_TRIPLES
do
592 593 594 595 596 597 598 599 600 601 602 603 604 605
    L_CHECK=false
    for j in $CFG_SUPPORTED_TARGET_TRIPLES
    do
        if [ $i = $j ]
        then
            L_CHECK=true
        fi
    done

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

606
    case $i in
607
        arm-linux-androideabi)
608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626

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

        *)
            ;;
    esac
done
N
Niko Matsakis 已提交
627 628 629 630 631

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

633 634
if [ ! -z "$CFG_PERF" ]
then
G
Graydon Hoare 已提交
635
    HAVE_PERF_LOGFD=`$CFG_PERF stat --log-fd 2>&1 | grep 'unknown option'`
636 637 638 639 640 641 642
    if [ -z "$HAVE_PERF_LOGFD" ];
    then
        CFG_PERF_WITH_LOGFD=1
        putvar CFG_PERF_WITH_LOGFD
    fi
fi

643
step_msg "making directories"
644

645
for i in \
646
    doc doc/std doc/extra \
647
    dl tmp
648 649 650 651
do
    make_dir $i
done

652
make_dir llvm
653
for t in $CFG_HOST_TRIPLES
654 655 656 657
do
    make_dir llvm/$t
done

658
make_dir rustllvm
659
for t in $CFG_HOST_TRIPLES
660 661 662 663
do
    make_dir rustllvm/$t
done

664 665 666 667 668
make_dir rt
for t in $CFG_TARGET_TRIPLES
do
  make_dir rt/$t
  for i in                                          \
669 670
    isaac linenoise sync test \
    arch/i386 arch/x86_64 arch/arm arch/mips  \
671
    libuv libuv/src/ares libuv/src/eio libuv/src/ev
672 673 674 675 676
  do
    make_dir rt/$t/$i
  done
done

677 678
# On windows we just store the libraries in the bin directory because
# there's no rpath
679
# FIXME: Thise needs to parameterized over target triples. Do it in platform.mk
680 681 682 683 684 685
CFG_LIBDIR=lib
if [ "$CFG_OSTYPE" = "pc-mingw32" ]
then
    CFG_LIBDIR=bin
fi

686
for h in $CFG_HOST_TRIPLES
687
do
N
Niko Matsakis 已提交
688
    for t in $CFG_TARGET_TRIPLES
689
    do
N
Niko Matsakis 已提交
690 691 692 693
        for i in 0 1 2 3
        do
            # host bin dir
            make_dir $h/stage$i/bin
694

N
Niko Matsakis 已提交
695
            # host lib dir
696
            make_dir $h/stage$i/$CFG_LIBDIR
697

A
Alex Crichton 已提交
698 699 700
            # host test dir
            make_dir $h/stage$i/test

N
Niko Matsakis 已提交
701
            # target bin dir
702
            make_dir $h/stage$i/$CFG_LIBDIR/rustc/$t/bin
703

N
Niko Matsakis 已提交
704
            # target lib dir
705
            make_dir $h/stage$i/$CFG_LIBDIR/rustc/$t/$CFG_LIBDIR
N
Niko Matsakis 已提交
706
        done
707
    done
N
Niko Matsakis 已提交
708 709

    make_dir $h/test/run-pass
710
    make_dir $h/test/run-pass-fulldeps
N
Niko Matsakis 已提交
711 712 713 714 715
    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 已提交
716
    make_dir $h/test/debug-info
B
Brian Anderson 已提交
717
    make_dir $h/test/doc-tutorial
718 719 720
    make_dir $h/test/doc-tutorial-ffi
    make_dir $h/test/doc-tutorial-macros
    make_dir $h/test/doc-tutorial-borrowed-ptr
721
    make_dir $h/test/doc-tutorial-tasks
722
    make_dir $h/test/doc-rust
723 724
done

725 726 727 728
# Configure submodules
step_msg "configuring submodules"

# Have to be in the top of src directory for this
729 730
if [ -z $CFG_DISABLE_MANAGE_SUBMODULES ]
then
731
    cd ${CFG_SRC_DIR}
732

733
    msg "git: submodule sync"
734 735 736
    "${CFG_GIT}" submodule --quiet sync

    msg "git: submodule update"
737
    "${CFG_GIT}" submodule --quiet update --init
738 739
    need_ok "git failed"

740
    msg "git: submodule foreach sync"
741
    "${CFG_GIT}" submodule --quiet foreach --recursive 'if test -e .gitmodules; then git submodule sync; fi'
742 743
    need_ok "git failed"

744 745 746 747 748 749 750 751 752
    msg "git: submodule foreach update"
    "${CFG_GIT}" submodule --quiet update --init --recursive
    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

753 754 755 756 757 758
    msg "git: submodule clobber"
    "${CFG_GIT}" submodule --quiet foreach --recursive git clean -dxf
    need_ok "git failed"
    "${CFG_GIT}" submodule --quiet foreach --recursive git checkout .
    need_ok "git failed"

759
    cd ${CFG_BUILD_DIR}
760 761
fi

762 763
# Configure llvm, only if necessary
step_msg "looking at LLVM"
764
CFG_LLVM_SRC_DIR=${CFG_SRC_DIR}src/llvm/
765
for t in $CFG_HOST_TRIPLES
766
do
767 768
    do_reconfigure=1

769 770
    if [ -z $CFG_LLVM_ROOT ]
    then
771
        LLVM_BUILD_DIR=${CFG_BUILD_DIR}llvm/$t
772 773
        if [ ! -z "$CFG_DISABLE_OPTIMIZE_LLVM" ]
        then
B
Brian Anderson 已提交
774
            LLVM_DBG_OPTS="--enable-debug-symbols --disable-optimized"
775 776 777 778 779 780 781 782 783 784 785 786 787 788
            # Just use LLVM straight from its build directory to
            # avoid 'make install' time
            LLVM_INST_DIR=$LLVM_BUILD_DIR/Debug+Asserts
        else
            LLVM_DBG_OPTS="--enable-optimized"
            LLVM_INST_DIR=$LLVM_BUILD_DIR/Release+Asserts
        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
789

N
Niko Matsakis 已提交
790

791
    if [ ${do_reconfigure} -ne 0 ]
N
Niko Matsakis 已提交
792
    then
793 794 795 796 797 798
    # 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
799
            config_status="${CFG_BUILD_DIR}llvm/$t/config.status"
800 801 802 803 804 805 806 807
            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 已提交
808
    fi
809 810 811 812 813

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

J
Jyun-Yan You 已提交
814
        LLVM_TARGETS="--enable-targets=x86,x86_64,arm,mips"
815 816 817 818 819
        LLVM_BUILD="--build=$t"
        LLVM_HOST="--host=$t"
        LLVM_TARGET="--target=$t"

        # Disable unused LLVM features
Z
Zack Corr 已提交
820
        LLVM_OPTS="$LLVM_DBG_OPTS --disable-docs \
821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868
                   --enable-bindings=none --disable-threads \
                   --disable-pthreads"

        if [ "$CFG_C_COMPILER" = "clang" ]
        then
            LLVM_CXX_32="clang++ -m32"
            LLVM_CC_32="clang -m32"

            LLVM_CXX_64="clang++"
            LLVM_CC_64="clang"
        else
            LLVM_CXX_32="g++ -m32"
            LLVM_CC_32="gcc -m32"

            LLVM_CXX_64="g++"
            LLVM_CC_64="gcc"
        fi

        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 \
869
                        $LLVM_HOST $LLVM_TARGET --with-python=$CFG_PYTHON"
870 871 872 873 874 875 876 877 878 879 880 881 882

        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]:*)
883
                ${CFG_LLVM_SRC_DIR}configure $LLVM_FLAGS
884 885
                ;;
            *)
886
                ${CFG_BUILD_DIR}${CFG_LLVM_SRC_DIR}configure \
887 888 889 890
                    $LLVM_FLAGS
                ;;
        esac
        need_ok "LLVM configure failed"
B
Brian Anderson 已提交
891 892 893 894

        # Hack the tools Makefile to turn off the clang build
        sed -i 's/clang//g' tools/Makefile

895
        cd $CFG_BUILD_DIR
896
    fi
897

898 899 900 901 902 903 904 905 906 907
    # 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 已提交
908 909 910 911 912 913 914 915 916 917
done


step_msg "writing configuration"

putvar CFG_SRC_DIR
putvar CFG_BUILD_DIR
putvar CFG_OSTYPE
putvar CFG_CPUTYPE
putvar CFG_CONFIGURE_ARGS
918
putvar CFG_PREFIX
919 920
putvar CFG_BUILD_TRIPLE
putvar CFG_HOST_TRIPLES
B
Brian Anderson 已提交
921 922
putvar CFG_TARGET_TRIPLES
putvar CFG_C_COMPILER
923
putvar CFG_LIBDIR
B
Brian Anderson 已提交
924
putvar CFG_DISABLE_MANAGE_SUBMODULES
925 926
putvar CFG_ANDROID_CROSS_PATH
putvar CFG_MINGW32_CROSS_PATH
B
Brian Anderson 已提交
927

928
if [ ! -z "$CFG_ENABLE_PAX_FLAGS" ]
929
then
930
    putvar CFG_ENABLE_PAX_FLAGS
931 932 933
    putvar CFG_PAXCTL
fi

934 935 936 937 938 939
if [ ! -z $BAD_PANDOC ]
then
    CFG_PANDOC=
    putvar CFG_PANDOC
fi

B
Brian Anderson 已提交
940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957
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

958
for t in $CFG_HOST_TRIPLES
B
Brian Anderson 已提交
959 960 961
do
    CFG_LLVM_BUILD_DIR=$(echo CFG_LLVM_BUILD_DIR_${t} | tr - _)
    CFG_LLVM_INST_DIR=$(echo CFG_LLVM_INST_DIR_${t} | tr - _)
962 963 964
    putvar $CFG_LLVM_BUILD_DIR
    putvar $CFG_LLVM_INST_DIR
done
965 966 967

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

B
Brian Anderson 已提交
971
msg
972 973 974
copy_if_changed ${CFG_SRC_DIR}Makefile.in ./Makefile
move_if_changed config.tmp config.mk
rm -f config.tmp
975
touch config.stamp
976

977
step_msg "complete"