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

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

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

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

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

22 23 24 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 44
make_dir() {
    if [ ! -d $1 ]
    then
        msg "mkdir -p $1"
        mkdir -p $1
    fi
}

copy() {
45
    msg "cp $1 $2"
46 47
    cp $1 $2
}
48

49 50 51
putvar() {
    local T
    eval T=\$$1
52 53 54 55 56 57 58
    eval TLEN=\${#$1}
    if [ $TLEN -gt 35 ]
    then
        printf "configure: %-20s := %.35s ...\n" $1 "$T"
    else
        printf "configure: %-20s := %s\n" $1 "$T"
    fi
59
    printf "%-20s := %s\n" $1 "$T" >>config.mk
60 61 62 63
}

probe() {
    local V=$1
64 65
    shift
    local P
66
    local T
67 68 69 70 71 72 73 74 75 76
    for P
    do
        T=$(which $P 2>&1)
        if [ $? -eq 0 ]
        then
            break
        else
            T=""
        fi
    done
77 78 79 80
    eval $V=\$T
    putvar $V
}

81 82
probe_need() {
    local V=$1
83
    probe $*
84 85 86
    eval VV=\$$V
    if [ -z "$VV" ]
    then
87
        err "needed, but unable to find any of: $*"
88 89 90
    fi
}

91 92 93 94 95 96 97 98
valopt() {
    local OP=$1
    local DEFAULT=$2
    shift
    shift
    local DOC="$*"
    if [ $HELP -eq 0 ]
    then
99
        local UOP=$(echo $OP | tr '[:lower:]' '[:upper:]' | tr '\-' '\_')
E
Elly Jones 已提交
100 101
        local V="CFG_${UOP}"
        eval $V="$DEFAULT"
102 103 104 105 106 107 108 109 110 111
        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 已提交
112 113 114 115 116 117
        if [ -z "$DEFAULT" ]
        then
            DEFAULT="<none>"
        fi
        OP="${OP}=[${DEFAULT}]"
        printf "    --%-30s %s\n" "$OP" "$DOC"
118 119 120
    fi
}

121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
opt() {
    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
143
                OP=$(echo $OP | tr 'a-z-' 'A-Z_')
144 145 146 147 148 149 150 151 152 153 154 155 156 157 158
                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
}

B
Brian Anderson 已提交
159

160 161 162
msg "looking for configure programs"
need_cmd mkdir
need_cmd printf
163 164 165 166 167
need_cmd cut
need_cmd grep
need_cmd xargs
need_cmd cp
need_cmd find
168 169
need_cmd uname
need_cmd date
G
Graydon Hoare 已提交
170
need_cmd tr
P
Patrick Walton 已提交
171
need_cmd sed
172

B
Brian Anderson 已提交
173

174 175 176 177
msg "inspecting environment"

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

179 180 181 182 183 184 185 186 187
if [ $CFG_OSTYPE = Darwin -a $CFG_CPUTYPE = i386 ]
then
    # Darwin's `uname -s` lies and always returns i386. We have to use sysctl
    # instead.
    if sysctl hw.optional.x86_64 | grep ': 1'
    then
        CFG_CPUTYPE=x86_64
    fi
fi
188

189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218
# 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
        ;;

    *)
        err "unknown OS type: $CFG_OSTYPE"
        ;;
esac


case $CFG_CPUTYPE in

    i386 | i486 | i686 | i786 | x86)
219
        CFG_CPUTYPE=i686
220 221 222 223 224 225
        ;;

    xscale | arm)
        CFG_CPUTYPE=arm
        ;;

U
User Jyyou 已提交
226
    x86_64 | x86-64 | x64 | amd64)
227
        CFG_CPUTYPE=x86_64
228 229 230 231 232 233
        ;;

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

N
Niko Matsakis 已提交
234
DEFAULT_HOST_TRIPLE="${CFG_CPUTYPE}-${CFG_OSTYPE}"
235

236
CFG_SELF=$(echo $0 | tr '\\' '/')
G
Graydon Hoare 已提交
237
CFG_SRC_DIR=${CFG_SELF%${CFG_SELF##*/}}
238
CFG_BUILD_DIR=$(echo $PWD | tr '\\' '/')
239 240
CFG_CONFIGURE_ARGS="$@"

241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257
OPTIONS=""
HELP=0
if [ "$1" = "--help" ]
then
    HELP=1
    shift
    echo ""
    echo "Usage: $CFG_SELF [options]"
    echo ""
    echo "Options:"
    echo ""
else
    msg "recreating config.mk"
    echo '' >config.mk

    step_msg "processing $CFG_SELF args"
fi
258

259
opt sharedstd 1 "build libstd as a shared library"
260 261
opt valgrind 1 "run tests with valgrind"
opt docs     1 "build documentation"
262
opt optimize 1 "build optimized rust code"
N
Niko Matsakis 已提交
263
opt optimize-cxx 1 "build optimized C++ code"
N
Niko Matsakis 已提交
264
opt optimize-llvm 1 "build optimized LLVM"
265
opt manage-submodules 1 "let the build manage the git submodules"
266
opt mingw-cross 0 "cross-compile for win32 using mingw"
267
opt clang 0 "prefer clang to gcc for building the runtime"
268
valopt prefix "/usr/local" "set installation prefix"
B
Brian Anderson 已提交
269
valopt llvm-root "" "set LLVM root"
N
Niko Matsakis 已提交
270
valopt host-triple "$DEFAULT_HOST_TRIPLE" "primary LLVM host triple"
271
valopt target-triples "" "LLVM target triples (defaults to host if unset)"
272

B
Brian Anderson 已提交
273 274 275 276 277 278
if [ $HELP -eq 1 ]
then
    echo ""
    exit 0
fi

279

280
step_msg "looking for build programs"
B
Brian Anderson 已提交
281

282
probe_need CFG_PERL         perl
283
probe_need CFG_PYTHON       python python2.6 python2 python3
284
probe_need CFG_CURL         curl
285

286
probe CFG_GIT              git
287
probe CFG_CLANG            clang++
288
probe CFG_GCC              gcc
289
probe CFG_LLVM_CONFIG      llvm-config
290
probe CFG_VALGRIND         valgrind
291
probe CFG_PERF             perf
292
probe CFG_MAKENSIS         makensis
293
probe CFG_NATURALDOCS      NaturalDocs naturaldocs
294 295 296
probe CFG_LLNEXTGEN        LLnextgen
probe CFG_PANDOC           pandoc
probe CFG_PDFLATEX         pdflatex
297 298
probe CFG_XETEX            xetex
probe CFG_LUATEX           luatex
299
probe CFG_NODE             nodejs node
300

301

302 303 304 305 306 307 308 309 310 311
if [ ! -z "$CFG_PANDOC" ]
then
    PV=$(pandoc --version | awk '/^pandoc/ {print $2}')
    if [ "$PV" \< "1.8" ]
    then
	step_msg "pandoc $PV is too old. disabling"
	BAD_PANDOC=1
    fi
fi

312
if [ -z "$CFG_ENABLE_CLANG" -a -z "$CFG_GCC" ]
313 314 315 316
then
    err "either clang or gcc is required"
fi

317 318
if [ ! -z "$CFG_LLVM_ROOT" -a -e "$CFG_LLVM_ROOT/bin/llvm-config" ]
then
319
    step_msg "using custom LLVM at $CFG_LLVM_ROOT"
320 321

    LLVM_CONFIG="$CFG_LLVM_ROOT/bin/llvm-config"
322
    LLVM_VERSION=$($LLVM_CONFIG --version)
323 324

    case $LLVM_VERSION in
325
	(3.1svn)
B
Brian Anderson 已提交
326
	    msg "found ok version of LLVM: $LLVM_VERSION"
327 328
	    ;;
	(*)
329
	    err "bad LLVM version: $LLVM_VERSION, need >=3.0svn"
330 331
	    ;;
    esac
332 333
fi

334
if [ ! -z "$CFG_ENABLE_CLANG" ]
335
then
336 337 338 339
    if [ -z "$CFG_CLANG" ]
    then
	err "clang requested but not found"
    fi
340 341 342 343 344 345
    CFG_CLANG_VERSION=$("$CFG_CLANG" \
                      --version \
                      | grep version \
                      | cut -d ' ' -f 3)

    case $CFG_CLANG_VERSION in
R
Reuben Morais 已提交
346
        (3.0svn | 3.0 | 3.1)
347
        step_msg "found ok version of CLANG: $CFG_CLANG_VERSION"
348
        CFG_C_COMPILER="clang"
349 350
        ;;
        (*)
B
Brian Anderson 已提交
351
        err "bad CLANG version: $CFG_CLANG_VERSION, need >=3.0svn"
352 353
        ;;
    esac
354 355
else
    CFG_C_COMPILER="gcc"
356
fi
357

358 359 360 361 362
if [ -z "$CFG_PREFIX" ]
then
    CFG_PREFIX=/usr/local
fi

363 364 365 366 367
if [ -z "$CFG_HOST_TRIPLE" ]
then
    CFG_HOST_TRIPLE="$DEFAULT_HOST_TRIPLE"
fi

368 369 370
if [ -z "$CFG_TARGET_TRIPLES" ]
then
    CFG_TARGET_TRIPLES="${CFG_HOST_TRIPLE}"
371
else
B
Brian Anderson 已提交
372
    CFG_TARGET_TRIPLES="$(echo $CFG_TARGET_TRIPLES | tr ',' ' ')"
373
fi
374

N
Niko Matsakis 已提交
375 376 377 378 379 380 381 382 383
case $CFG_TARGET_TRIPLES in
    (*$CFG_HOST_TRIPLE*) ;;
    (*) err "Host triple is not among the target triples." ;;
esac

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

385 386 387 388 389 390 391 392 393 394
if [ ! -z "$CFG_PERF" ]
then
    HAVE_PERF_LOGFD=`$CFG_PERF stat --log-fd 2>&1 | grep 'unknown option'`
    if [ -z "$HAVE_PERF_LOGFD" ];
    then
        CFG_PERF_WITH_LOGFD=1
        putvar CFG_PERF_WITH_LOGFD
    fi
fi

395
step_msg "making directories"
396

397
for i in \
398 399
    doc doc/core doc/std \
    nd nd/core nd/std \
400
    dl tmp
401 402 403 404
do
    make_dir $i
done

405 406 407 408 409 410
make_dir llvm
for t in $CFG_TARGET_TRIPLES
do
    make_dir llvm/$t
done

411 412 413 414 415 416
make_dir rustllvm
for t in $CFG_TARGET_TRIPLES
do
    make_dir rustllvm/$t
done

417 418 419 420 421 422 423 424 425 426 427 428
make_dir rt
for t in $CFG_TARGET_TRIPLES
do
  make_dir rt/$t
  for i in                                          \
    isaac bigint sync test arch/i386 arch/x86_64    \
    libuv libuv/src/ares libuv/src/eio libuv/src/ev
  do
    make_dir rt/$t/$i
  done
done

429 430 431 432 433 434 435 436
# On windows we just store the libraries in the bin directory because
# there's no rpath
CFG_LIBDIR=lib
if [ "$CFG_OSTYPE" = "pc-mingw32" ]
then
    CFG_LIBDIR=bin
fi

N
Niko Matsakis 已提交
437
for h in $CFG_TARGET_TRIPLES
438
do
N
Niko Matsakis 已提交
439
    for t in $CFG_TARGET_TRIPLES
440
    do
N
Niko Matsakis 已提交
441 442 443 444
        for i in 0 1 2 3
        do
            # host bin dir
            make_dir $h/stage$i/bin
445

N
Niko Matsakis 已提交
446
            # host lib dir
447
            make_dir $h/stage$i/$CFG_LIBDIR
448

N
Niko Matsakis 已提交
449
            # target bin dir
450
            make_dir $h/stage$i/$CFG_LIBDIR/rustc/$t/bin
451

N
Niko Matsakis 已提交
452
            # target lib dir
453
            make_dir $h/stage$i/$CFG_LIBDIR/rustc/$t/$CFG_LIBDIR
N
Niko Matsakis 已提交
454
        done
455
    done
N
Niko Matsakis 已提交
456 457 458 459 460 461 462

    make_dir $h/test/run-pass
    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
463 464
done

465 466 467
# Configure submodules
step_msg "configuring submodules"

468 469 470 471 472 473 474 475
# 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
    msg "git: no git directory. disabling submodules"
    CFG_DISABLE_MANAGE_SUBMODULES=1
fi

476 477 478
# Have to be in the top of src directory for this
cd ${CFG_SRC_DIR}

479 480
if [ -z $CFG_DISABLE_MANAGE_SUBMODULES ]
then
481 482 483 484 485
SUBMODULE_STATUS=$("${CFG_GIT}" submodule status)
NEED_INIT_COUNT=$(echo "$SUBMODULE_STATUS" | grep -c "^-")
NEED_UPDATE_COUNT=$(echo "$SUBMODULE_STATUS" | grep -c "^+")
NEED_INIT=$(test $NEED_INIT_COUNT -gt 0)$?
NEED_UPDATE=$(test "($NEED_INIT)" -o "$NEED_UPDATE_COUNT" -gt 0)$?
486 487 488 489
else
NEED_INIT=
NEED_UPDATE=
fi
490 491 492 493

if [ $NEED_INIT ]
then
    msg "git: submodule init"
B
Brian Anderson 已提交
494
    "${CFG_GIT}" submodule init --quiet
495
    need_ok "git failed"
496 497 498 499 500
fi

if [ $NEED_UPDATE ]
then
    msg "git: submodule update"
B
Brian Anderson 已提交
501
    "${CFG_GIT}" submodule update --quiet
502
    need_ok "git failed"
503 504 505 506 507
fi

cd ${CFG_BUILD_DIR}


508
# Configure llvm. Here we go...
509
CFG_LLVM_SRC_DIR=${CFG_SRC_DIR}src/llvm
510

511 512 513 514 515 516 517 518 519 520 521 522
for t in $CFG_TARGET_TRIPLES
do
    if [ -z $CFG_LLVM_ROOT ]
    then
	step_msg "configuring LLVM for $t"

	LLVM_BUILD_DIR=$CFG_BUILD_DIR/llvm/$t

	LLVM_TARGETS="--enable-targets=x86,x86_64"
	LLVM_BUILD="--build=$t"
	LLVM_HOST="--host=$t"
	LLVM_TARGET="--target=$t"
N
Niko Matsakis 已提交
523 524

    if [ ! -z "$CFG_DISABLE_OPTIMIZE_LLVM" ]
N
Niko Matsakis 已提交
525 526 527 528 529 530
    then
        LLVM_DBG_OPTS=""
        # Just use LLVM straight from its build directory to
        # avoid 'make install' time
	    LLVM_INST_DIR=$LLVM_BUILD_DIR/Debug+Asserts
    else
N
Niko Matsakis 已提交
531
        LLVM_DBG_OPTS="--enable-optimized"
N
Niko Matsakis 已提交
532 533
	    LLVM_INST_DIR=$LLVM_BUILD_DIR/Release+Asserts
    fi
534 535
	# Disable unused LLVM features
	LLVM_OPTS="$LLVM_DBG_OPTS --disable-docs --disable-jit --enable-bindings=none --disable-threads --disable-pthreads"
536 537 538 539 540 541 542

	LLVM_CXX_32="g++ -m32"
	LLVM_CC_32="gcc -m32"
	LLVM_CFLAGS_32="-m32"
	LLVM_CXXFLAGS_32="-m32"
	LLVM_LDFLAGS_32="-m32"

B
Brian Anderson 已提交
543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562
	LLVM_CXX_64="g++"
	LLVM_CC_64="gcc"
	LLVM_CFLAGS_64=""
	LLVM_CXXFLAGS_64=""
	LLVM_LDFLAGS_64=""

	if echo $t | grep 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
563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581

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

	LLVM_FLAGS="$LLVM_TARGETS $LLVM_OPTS $LLVM_BUILD $LLVM_HOST $LLVM_TARGET"

	msg "configuring LLVM with:"
	msg "$LLVM_FLAGS"

	export CXX
	export CC
	export CFLAGS
	export CXXFLAGS
	export LDFLAGS

	cd $LLVM_BUILD_DIR
582 583 584 585 586 587 588 589
	case $CFG_SRC_DIR in
	    /* | [a-z]:* | [A-Z]:*)
		${CFG_LLVM_SRC_DIR}/configure $LLVM_FLAGS
		;;
	    *)
		${CFG_BUILD_DIR}/${CFG_LLVM_SRC_DIR}/configure $LLVM_FLAGS
		;;
	esac
590
    need_ok "LLVM configure failed"
591 592
	cd $CFG_BUILD_DIR
    else
B
Brian Anderson 已提交
593
	LLVM_BUILD_DIR=
594 595 596
        # The user is using their own LLVM
	LLVM_INST_DIR=$CFG_LLVM_ROOT
    fi
597

598 599 600 601 602 603 604 605 606 607
    # 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 已提交
608 609 610 611 612 613 614 615 616 617 618 619 620 621
done


step_msg "writing configuration"

putvar CFG_SRC_DIR
putvar CFG_BUILD_DIR
putvar CFG_OSTYPE
putvar CFG_CPUTYPE
putvar CFG_CONFIGURE_ARGS
putvar CFG_HOST_TRIPLE
putvar CFG_TARGET_TRIPLES
putvar CFG_C_COMPILER
putvar CFG_PREFIX
622
putvar CFG_LIBDIR
B
Brian Anderson 已提交
623

624 625 626 627 628 629
# Setting this again because it may have been changed
if [ $CFG_DISABLE_MANAGE_SUBMODULES ]
then
    putvar CFG_DISABLE_MANAGE_SUBMODULES
fi

630 631 632 633 634 635 636
# Ditto for pandoc
if [ ! -z $BAD_PANDOC ]
then
    CFG_PANDOC=
    putvar CFG_PANDOC
fi

B
Brian Anderson 已提交
637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658
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

for t in $CFG_TARGET_TRIPLES
do
    CFG_LLVM_BUILD_DIR=$(echo CFG_LLVM_BUILD_DIR_${t} | tr - _)
    CFG_LLVM_INST_DIR=$(echo CFG_LLVM_INST_DIR_${t} | tr - _)
659 660 661
    putvar $CFG_LLVM_BUILD_DIR
    putvar $CFG_LLVM_INST_DIR
done
662 663 664 665 666 667


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

B
Brian Anderson 已提交
669
msg
670
copy ${CFG_SRC_DIR}Makefile.in ./Makefile
671

672
step_msg "complete"