add a clang build script

This commit is contained in:
Thomas Pöchtrager 2014-11-10 20:43:14 +01:00
parent 44d7d0d07a
commit e8443ae7d3
3 changed files with 188 additions and 4 deletions

View File

@ -27,8 +27,15 @@ Then ensure you have the following installed on your Linux/BSD box:
`Clang 3.2+`, `llvm-devel`, `automake`, `autogen`, `libtool`, `patch`, `Clang 3.2+`, `llvm-devel`, `automake`, `autogen`, `libtool`, `patch`,
`libxml2-devel` (<=10.5 only), `uuid-devel`, `openssl-devel` and the `bash shell`. `libxml2-devel` (<=10.5 only), `uuid-devel`, `openssl-devel` and the `bash shell`.
Hint 1: You can run 'sudo tools/get_dependencies.sh' to get these automatically. \--
Hint 2: On Ubuntu 12.04 LTS you can use [llvm.org/apt](http://llvm.org/apt) to get a newer version of clang. You can run 'sudo tools/get\_dependencies.sh' to get these automatically.
'[INSTALLPREFIX=...] ./build_clang.sh' can be used to build a recent clang version
from source (requires gcc and g++).
On debian like systems you can also use [llvm.org/apt](http://llvm.org/apt) to get a newer version of clang.
But be careful, that repository is known to cause [troubles](https://github.com/tpoechtrager/osxcross/issues/16).
\--
Then run `./build.sh` to build the cross toolchain. Then run `./build.sh` to build the cross toolchain.
(It will search 'tarballs' for your SDK and then build in its own directory.) (It will search 'tarballs' for your SDK and then build in its own directory.)

174
build_clang.sh Executable file
View File

@ -0,0 +1,174 @@
#!/usr/bin/env bash
pushd "${0%/*}" &>/dev/null
DESC=clang
USESYSTEMCOMPILER=1
source tools/tools.sh
if [ -z "$SKIP_GCC_CHECK" ]; then
if [ $PLATFORM != "Darwin" -a "$PLATFORM" != "FreeBSD" ]; then
which "g++${GCC_SUFFIX}" &>/dev/null && \
{
export CC="gcc${GCC_SUFFIX}"
export CXX="g++${GCC_SUFFIX}"
test="
#define GCC_VERSION_AT_LEAST(major, minor, patch) \
(defined(__GNUC__) && \
(__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) >= \
(major * 10000 + minor * 100 + patch))
#if !GCC_VERSION_AT_LEAST(4, 7, 0)
not_gcc_47_or_later
#endif"
echo "$test" | $CXX -fsyntax-only -xc++ - &>/dev/null || \
{
echo "Your GCC installation is too old to build recent clang releases."
echo "Building clang 3.4.2 instead."
CLANG_VERSION=3.4
CLANG_VERSION_PATCH=.2
}
} || \
{
echo "Can not detect GCC installation." 1>&2
echo "You may want to try 'GCC_SUFFIX=<suffix> $0'" 1>&2
echo "(i.e. GCC_SUFFIX=-4.7 $0)" 1>&2
exit 1
}
fi
fi
source $BASE_DIR/tools/trap_exit.sh
MIRROR="http://llvm.org"
#MIRROR="http://archive.ubuntu.com"
if [ -z "$CLANG_VERSION" ]; then
CLANG_VERSION=3.5
CLANG_VERSION_PATCH=.0
fi
if [[ $MIRROR == *ubuntu* ]] && [ $CLANG_VERSION_PATCH == .0 ]; then
CLANG_VERSION_PATCH=
fi
CLANG_VERSION_MMP="${CLANG_VERSION}${CLANG_VERSION_PATCH}"
if [ -z "$INSTALLPREFIX" ]; then
INSTALLPREFIX="/usr/local"
fi
require wget
function warn_if_installed()
{
which $1 &>/dev/null && \
{
echo ""
echo "It is highly recommended to uninstall previous $2 versions first:"
echo "-> $(which $1 2>/dev/null)"
echo ""
}
}
if [ $PLATFORM != "Darwin" -a "$PLATFORM" != "FreeBSD" ]; then
warn_if_installed clang clang
warn_if_installed llvm-config llvm
fi
echo "Building Clang/LLVM $CLANG_VERSION may take a long time."
echo "Installation Prefix: $INSTALLPREFIX"
read -p "Press enter to start building."
echo ""
pushd $OSXCROSS_BUILD_DIR &>/dev/null
pushd $OSXCROSS_TARBALL_DIR &>/dev/null
if [[ $MIRROR == *ubuntu* ]]; then
LLVM_PKG="$MIRROR/ubuntu/pool/main/l/llvm-toolchain-${CLANG_VERSION}/"
LLVM_PKG+="llvm-toolchain-${CLANG_VERSION}_${CLANG_VERSION_MMP}"
LLVM_PKG+=".orig.tar.bz2"
CLANG_PKG="$MIRROR/ubuntu/pool/main/l/llvm-toolchain-${CLANG_VERSION}/"
CLANG_PKG+="llvm-toolchain-${CLANG_VERSION}_${CLANG_VERSION_MMP}"
CLANG_PKG+=".orig-clang.tar.bz2"
else
if [ -z "$PKGCOMPRESSOR" ]; then
PKGCOMPRESSOR="tar.xz"
[ $CLANG_VERSION == "3.4" ] && PKGCOMPRESSOR="tar.gz"
fi
LLVM_PKG="$MIRROR/releases/${CLANG_VERSION_MMP}/"
LLVM_PKG+="llvm-${CLANG_VERSION_MMP}.src.${PKGCOMPRESSOR}"
CLANG_PKG="$MIRROR/releases/${CLANG_VERSION_MMP}/"
CLANG_PKG+="cfe-${CLANG_VERSION_MMP}.src.${PKGCOMPRESSOR}"
fi
wget -c $LLVM_PKG
wget -c $CLANG_PKG
popd &>/dev/null
echo "cleaning up ..."
rm -rf llvm* 2>/dev/null
extract "$OSXCROSS_TARBALL_DIR/$(basename $LLVM_PKG)" 2 0
pushd llvm* &>/dev/null
pushd tools &>/dev/null
extract "$OSXCROSS_TARBALL_DIR/$(basename $CLANG_PKG)" 1
[ -e clang* ] && mv clang* clang
[ -e cfe* ] && mv cfe* clang
popd &>/dev/null
function build()
{
stage=$1
mkdir -p $stage
pushd $stage &>/dev/null
../configure --prefix=$INSTALLPREFIX --enable-optimized --disable-assertions
$MAKE $2 -j $JOBS VERBOSE=1
popd &>/dev/null
}
if [ -n "$DISABLE_BOOTSTRAP" ]; then
build build
else
CFLAGS="-O1" CXXFLAGS="-O1" \
build build_stage1 clang-only
export CC=$PWD/build_stage1/Release/bin/clang
export CXX=$PWD/build_stage1/Release/bin/clang++
if [ -z "$PORTABLE" ]; then
export CFLAGS="-march=native"
export CXXFLAGS="-march=native"
fi
build build_stage2
if [ -n "$ENABLE_FULL_BOOTSTRAP" ]; then
CC=$PWD/build_stage2/Release/bin/clang \
CXX=$PWD/build_stage2/Release/bin/clang++ \
build build_stage3
fi
fi
echo ""
echo "Done!"
echo ""
echo -n "cd into '$PWD/$stage' and type 'make install' to install "
echo "clang/llvm to '$INSTALLPREFIX'"
echo ""
popd &>/dev/null # llvm
popd &>/dev/null

View File

@ -18,8 +18,11 @@ function _exit()
echo "" echo ""
echo "exiting with abnormal exit code ($EC)" echo "exiting with abnormal exit code ($EC)"
test -n "$OCDEBUG" || echo "run 'OCDEBUG=1 ./$SCRIPT' to enable debug messages" test -n "$OCDEBUG" || echo "run 'OCDEBUG=1 ./$SCRIPT' to enable debug messages"
declare -f -F remove_locks &>/dev/null && \
{
echo "removing stale locks..." echo "removing stale locks..."
remove_locks remove_locks
}
echo "if it is happening the first time, then just re-run the script" echo "if it is happening the first time, then just re-run the script"
echo "" echo ""
test $SCRIPT = "build.sh" && check_for_bug_1242300 test $SCRIPT = "build.sh" && check_for_bug_1242300