5ccf372755
On my machine I have two LLVM builds, one of regular HEAD and one for Rust in ~/rust-llvm - by default CFG_LLVM_CONFIG is set to /usr/local/bin/llvm-config which is wrong, because the probe for it initially happens earlier in configure and succeeds (so putvar is called.) This causes it to be emitted twice into the Makefile but the second instance wins.
421 lines
8.7 KiB
Bash
Executable File
421 lines
8.7 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
msg() {
|
|
echo "configure: $1"
|
|
}
|
|
|
|
step_msg() {
|
|
msg
|
|
msg "$1"
|
|
msg
|
|
}
|
|
|
|
warn() {
|
|
echo "configure: WARNING: $1"
|
|
}
|
|
|
|
err() {
|
|
echo "configure: error: $1"
|
|
exit 1
|
|
}
|
|
|
|
|
|
need_cmd() {
|
|
if which $1 >/dev/null 2>&1
|
|
then msg "found $1"
|
|
else err "need $1"
|
|
fi
|
|
}
|
|
|
|
make_dir() {
|
|
if [ ! -d $1 ]
|
|
then
|
|
msg "mkdir -p $1"
|
|
mkdir -p $1
|
|
fi
|
|
}
|
|
|
|
copy() {
|
|
msg "cp $1 $2"
|
|
cp $1 $2
|
|
}
|
|
|
|
putvar() {
|
|
local T
|
|
eval T=\$$1
|
|
eval TLEN=\${#$1}
|
|
if [ $TLEN -gt 35 ]
|
|
then
|
|
printf "configure: %-20s := %.35s ...\n" $1 "$T"
|
|
else
|
|
printf "configure: %-20s := %s\n" $1 "$T"
|
|
fi
|
|
printf "%-20s := %s\n" $1 "$T" >>config.mk
|
|
}
|
|
|
|
probe() {
|
|
local V=$1
|
|
local P=$2
|
|
local T
|
|
T=$(which $P 2>&1)
|
|
if [ $? -ne 0 ]
|
|
then
|
|
T=""
|
|
fi
|
|
eval $V=\$T
|
|
putvar $V
|
|
}
|
|
|
|
probe_need() {
|
|
local V=$1
|
|
local P=$2
|
|
probe $V $P
|
|
eval VV=\$$V
|
|
if [ -z "$VV" ]
|
|
then
|
|
err "required program '$P' not found"
|
|
fi
|
|
}
|
|
|
|
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
|
|
OP=$(echo $OP | tr 'a-z-' 'A-Z_')
|
|
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
|
|
}
|
|
|
|
msg "looking for configure programs"
|
|
need_cmd mkdir
|
|
need_cmd printf
|
|
need_cmd cut
|
|
need_cmd grep
|
|
need_cmd xargs
|
|
need_cmd cp
|
|
need_cmd find
|
|
need_cmd uname
|
|
need_cmd date
|
|
need_cmd tr
|
|
need_cmd sed
|
|
|
|
msg "inspecting environment"
|
|
|
|
CFG_OSTYPE=$(uname -s)
|
|
CFG_CPUTYPE=$(uname -m)
|
|
|
|
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
|
|
|
|
|
|
# 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)
|
|
CFG_CPUTYPE=i686
|
|
;;
|
|
|
|
xscale | arm)
|
|
CFG_CPUTYPE=arm
|
|
;;
|
|
|
|
x86_64 | x86-64 | x64)
|
|
CFG_CPUTYPE=x86_64
|
|
;;
|
|
|
|
*)
|
|
err "unknown CPU type: $CFG_CPUTYPE"
|
|
esac
|
|
|
|
CFG_HOST_TRIPLE="${CFG_CPUTYPE}-${CFG_OSTYPE}"
|
|
|
|
CFG_SELF=$(echo $0 | tr '\\' '/')
|
|
CFG_SRC_DIR=${CFG_SELF%${CFG_SELF##*/}}
|
|
CFG_BUILD_DIR=$(echo $PWD | tr '\\' '/')
|
|
CFG_CONFIGURE_ARGS="$@"
|
|
|
|
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
|
|
|
|
opt sharedstd 1 "build libstd as a shared library"
|
|
opt valgrind 1 "run tests with valgrind"
|
|
opt docs 1 "build documentation"
|
|
opt optimize 1 "build optimized rust code"
|
|
opt mingw-cross 0 "cross-compile for win32 using mingw"
|
|
|
|
|
|
if [ $HELP -eq 1 ]
|
|
then
|
|
echo ""
|
|
echo "Useful environment variables:"
|
|
echo ""
|
|
printf " %-32s %s\n" "CFG_LLVM_ROOT" "The host LLVM install"
|
|
printf " %-32s %s\n" "CFG_PREFIX" "The installation prefix"
|
|
echo ""
|
|
exit 0
|
|
fi
|
|
|
|
step_msg "writing out basic parameters"
|
|
putvar CFG_SRC_DIR
|
|
putvar CFG_BUILD_DIR
|
|
putvar CFG_OSTYPE
|
|
putvar CFG_CPUTYPE
|
|
putvar CFG_CONFIGURE_ARGS
|
|
|
|
step_msg "looking for build programs"
|
|
probe_need CFG_PERL perl
|
|
probe_need CFG_PYTHON python
|
|
probe_need CFG_CURL curl
|
|
|
|
probe CFG_GIT git
|
|
probe CFG_CLANG clang++
|
|
probe CFG_GCC gcc
|
|
probe CFG_LLVM_CONFIG llvm-config
|
|
probe CFG_VALGRIND valgrind
|
|
probe CFG_PERF perf
|
|
probe CFG_MAKEINFO makeinfo
|
|
probe CFG_TEXI2PDF texi2pdf
|
|
probe CFG_TEX tex
|
|
probe CFG_MAKENSIS makensis
|
|
|
|
if [ -z "$CFG_CLANG" -a -z "$CFG_GCC" ]
|
|
then
|
|
err "either clang or gcc is required"
|
|
fi
|
|
|
|
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
|
|
|
|
if [ ! -z "$CFG_LLVM_ROOT" -a -e "$CFG_LLVM_ROOT/bin/llvm-config" ]
|
|
then
|
|
CFG_LLVM_CONFIG="$CFG_LLVM_ROOT/bin/llvm-config"
|
|
fi
|
|
|
|
if [ ! -z "$CFG_LLVM_ROOT" -a -z "$CFG_LLVM_CONFIG" ]
|
|
then
|
|
CFG_LLVM_INCDIR="$CFG_LLVM_ROOT/include"
|
|
CFG_LLVM_BINDIR="$CFG_LLVM_ROOT/bin"
|
|
CFG_LLVM_LIBDIR="$CFG_LLVM_ROOT/lib"
|
|
CFG_LLVM_CXXFLAGS="-I$CFG_LLVM_INCDIR"
|
|
CFG_LLVM_LDFLAGS=""
|
|
CFG_LLVM_LIBS=$(find "$CFG_LLVM_LIBDIR" \
|
|
-name '*.lib' \
|
|
-exec echo '\"{}\"' ';' \
|
|
| xargs echo)
|
|
CFG_LLVM_VERSION=$("$CFG_LLVM_BINDIR/llc" \
|
|
--version \
|
|
| grep version \
|
|
| cut -d ' ' -f 5-)
|
|
CFG_LLVM_TRIPLE=$("$CFG_LLVM_BINDIR/llc" \
|
|
--version \
|
|
| grep Host: \
|
|
| cut -d ' ' -f 4-)
|
|
elif [ ! -z "$CFG_LLVM_CONFIG" ]
|
|
then
|
|
CFG_LLVM_VERSION=$($CFG_LLVM_CONFIG --version)
|
|
CFG_LLVM_INCDIR=$($CFG_LLVM_CONFIG --includedir)
|
|
CFG_LLVM_BINDIR=$($CFG_LLVM_CONFIG --bindir)
|
|
CFG_LLVM_LIBDIR=$($CFG_LLVM_CONFIG --libdir)
|
|
CFG_LLVM_CXXFLAGS=$($CFG_LLVM_CONFIG --cxxflags)
|
|
CFG_LLVM_LDFLAGS=$($CFG_LLVM_CONFIG --ldflags)
|
|
CFG_LLVM_LIBS=$($CFG_LLVM_CONFIG --libs)
|
|
CFG_LLVM_TRIPLE=$($CFG_LLVM_CONFIG --host-target)
|
|
else
|
|
err "either the \"CFG_LLVM_ROOT\" environment variable must be set, or a \
|
|
\"llvm-config\" script must be present"
|
|
fi
|
|
|
|
case $CFG_LLVM_VERSION in
|
|
(3.0svn | 3.0 | 3.1svn)
|
|
step_msg "found ok version of LLVM: $CFG_LLVM_VERSION"
|
|
;;
|
|
(*)
|
|
err "bad LLVM version: $CFG_LLVM_VERSION, need >=3.0svn"
|
|
;;
|
|
esac
|
|
|
|
if [ ! -z "$CFG_CLANG" ]
|
|
then
|
|
CFG_CLANG_VERSION=$("$CFG_CLANG" \
|
|
--version \
|
|
| grep version \
|
|
| cut -d ' ' -f 3)
|
|
|
|
case $CFG_CLANG_VERSION in
|
|
(3.0svn | 3.0)
|
|
step_msg "found ok version of CLANG: $CFG_CLANG_VERSION"
|
|
CFG_C_COMPILER="clang"
|
|
;;
|
|
(*)
|
|
msg "bad CLANG version: $CFG_CLANG_VERSION, need >=3.0svn; disabling"
|
|
CFG_C_COMPILER="gcc"
|
|
;;
|
|
esac
|
|
else
|
|
CFG_C_COMPILER="gcc"
|
|
fi
|
|
|
|
if [ -z "$CFG_PREFIX" ]
|
|
then
|
|
CFG_PREFIX=/usr/local
|
|
fi
|
|
|
|
if [ ! -z "$CFG_LLVM_TRIPLE" ]
|
|
then
|
|
if [ $CFG_HOST_TRIPLE != $CFG_LLVM_TRIPLE ]
|
|
then
|
|
warn "LLVM host-triple $CFG_LLVM_TRIPLE differs from"
|
|
warn "detected host triple $CFG_HOST_TRIPLE"
|
|
warn "choosing LLVM host-triple instead"
|
|
msg ""
|
|
CFG_HOST_TRIPLE=$CFG_LLVM_TRIPLE
|
|
fi
|
|
fi
|
|
|
|
# FIXME: add support for extending the target-triples list
|
|
CFG_TARGET_TRIPLES="${CFG_HOST_TRIPLE}"
|
|
|
|
putvar CFG_HOST_TRIPLE
|
|
putvar CFG_TARGET_TRIPLES
|
|
|
|
putvar CFG_C_COMPILER
|
|
putvar CFG_PREFIX
|
|
|
|
putvar CFG_LLVM_ROOT
|
|
putvar CFG_LLVM_CONFIG
|
|
putvar CFG_LLVM_INCDIR
|
|
putvar CFG_LLVM_BINDIR
|
|
putvar CFG_LLVM_LIBDIR
|
|
putvar CFG_LLVM_CXXFLAGS
|
|
putvar CFG_LLVM_LDFLAGS
|
|
putvar CFG_LLVM_LIBS
|
|
putvar CFG_LLVM_TRIPLE
|
|
|
|
# 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
|
|
|
|
step_msg "making directories"
|
|
for i in \
|
|
doc \
|
|
rt rt/isaac rt/bigint rt/sync rt/test rt/arch/i386 \
|
|
rt/libuv rt/libuv/src/ares rt/libuv/src/eio rt/libuv/src/ev \
|
|
rustllvm dl \
|
|
test/run-pass test/run-fail test/compile-fail \
|
|
test/bench test/perf test/pretty
|
|
do
|
|
make_dir $i
|
|
done
|
|
|
|
for t in $CFG_TARGET_TRIPLES
|
|
do
|
|
for i in 0 1 2 3
|
|
do
|
|
# host bin dir
|
|
make_dir stage$i/bin
|
|
|
|
# host lib dir
|
|
make_dir stage$i/lib
|
|
|
|
# target bin dir
|
|
make_dir stage$i/lib/rustc/$t/bin
|
|
|
|
# target lib dir
|
|
make_dir stage$i/lib/rustc/$t/lib
|
|
done
|
|
done
|
|
|
|
copy ${CFG_SRC_DIR}Makefile.in ./Makefile
|
|
|
|
step_msg "complete"
|