From e8443ae7d3026edb6584286f7bfbcbd13e3a6f93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20P=C3=B6chtrager?= Date: Mon, 10 Nov 2014 20:43:14 +0100 Subject: [PATCH] add a clang build script --- README.md | 11 ++- build_clang.sh | 174 +++++++++++++++++++++++++++++++++++++++++++++ tools/trap_exit.sh | 7 +- 3 files changed, 188 insertions(+), 4 deletions(-) create mode 100755 build_clang.sh diff --git a/README.md b/README.md index d1f7a1e..d5d0347 100755 --- a/README.md +++ b/README.md @@ -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`, `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. (It will search 'tarballs' for your SDK and then build in its own directory.) diff --git a/build_clang.sh b/build_clang.sh new file mode 100755 index 0000000..fc97302 --- /dev/null +++ b/build_clang.sh @@ -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= $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 diff --git a/tools/trap_exit.sh b/tools/trap_exit.sh index e62ffc2..023e478 100755 --- a/tools/trap_exit.sh +++ b/tools/trap_exit.sh @@ -18,8 +18,11 @@ function _exit() echo "" echo "exiting with abnormal exit code ($EC)" test -n "$OCDEBUG" || echo "run 'OCDEBUG=1 ./$SCRIPT' to enable debug messages" - echo "removing stale locks..." - remove_locks + declare -f -F remove_locks &>/dev/null && \ + { + echo "removing stale locks..." + remove_locks + } echo "if it is happening the first time, then just re-run the script" echo "" test $SCRIPT = "build.sh" && check_for_bug_1242300