Stefan Reinauer (stefan.reinauer@coreboot.org) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/10415
-gerrit
commit 1bba13fd53da3c6cba8b658a47b1c65ac636e859 Author: Stefan Reinauer stefan.reinauer@coreboot.org Date: Wed Jun 3 17:13:23 2015 -0700
crossgcc: Add clang support
Add a new script, buildclang, which builds and installs a clang based toolchain, similarly to our buildgcc script. This toolchain will carry the required patches needed to successfully build coreboot, and also install clang's famous scan-build script.
Change-Id: I1aea7cd6002edc4f3bb2b46dc1f69a212ad18f77 Signed-off-by: Stefan Reinauer stefan.reinauer@coreboot.org --- util/crossgcc/buildclang | 372 +++++++++++++++++++++ util/crossgcc/patches/cfe-3.6.1.src_frontend.patch | 75 +++++ util/crossgcc/sum/cfe-3.6.1.src.tar.xz.cksum | 1 + .../sum/clang-tools-extra-3.6.1.src.tar.xz.cksum | 1 + .../sum/compiler-rt-3.6.1.src.tar.xz.cksum | 1 + util/crossgcc/sum/llvm-3.6.1.src.tar.xz.cksum | 1 + 6 files changed, 451 insertions(+)
diff --git a/util/crossgcc/buildclang b/util/crossgcc/buildclang new file mode 100755 index 0000000..10665f4 --- /dev/null +++ b/util/crossgcc/buildclang @@ -0,0 +1,372 @@ +#!/bin/sh +# +# Copyright (C) 2008-2010 by coresystems GmbH +# written by Patrick Georgi patrick.georgi@coresystems.de and +# Stefan Reinauer stefan.reinauer@coresystems.de +# +# Copyright (C) 2011 by Sage Electronic Engineering +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; version 2 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc. +# + +cd `dirname $0` + +CROSSGCC_DATE="June 3rd, 2015" +CROSSGCC_VERSION="0.1" + +# default settings +TARGETDIR=`pwd`/xgcc +TARGETARCH=i386-elf +DESTDIR= + +# version numbers +CLANG_VERSION=3.6.1 + +# archive locations +LLVM_ARCHIVE="http://llvm.org/releases/$%7BCLANG_VERSION%7D/llvm-$%7BCLANG_VERSION%7D.src...." +CFE_ARCHIVE="http://llvm.org/releases/$%7BCLANG_VERSION%7D/cfe-$%7BCLANG_VERSION%7D.src.t..." +CRT_ARCHIVE="http://llvm.org/releases/$%7BCLANG_VERSION%7D/compiler-rt-$%7BCLANG_VERSION%..." +CTE_ARCHIVE="http://llvm.org/releases/$%7BCLANG_VERSION%7D/clang-tools-extra-$%7BCLANG_VE..." + +LLVM_DIR="llvm-${CLANG_VERSION}.src" +CFE_DIR="cfe-${CLANG_VERSION}.src" +CRT_DIR="compiler-rt-${CLANG_VERSION}.src" +CTE_DIR="clang-tools-extra-${CLANG_VERSION}.src" + +unset MAKELEVEL MAKEFLAGS + +SAVETEMPS=0 + +red='\033[0;31m' +RED='\033[1;31m' +green='\033[0;32m' +GREEN='\033[1;32m' +blue='\033[0;34m' +BLUE='\033[1;34m' +cyan='\033[0;36m' +CYAN='\033[1;36m' +NC='\033[0m' # No Color + +UNAME=`uname` + +normalize_dirs() +{ + mkdir -p $DESTDIR$TARGETDIR/lib + test -d $DESTDIR$TARGETDIR/lib32 && mv $DESTDIR$TARGETDIR/lib32/* $DESTDIR$TARGETDIR/lib + test -d $DESTDIR$TARGETDIR/lib64 && mv $DESTDIR$TARGETDIR/lib64/* $DESTDIR$TARGETDIR/lib + rmdir -p $DESTDIR$TARGETDIR/lib32 $DESTDIR$TARGETDIR/lib64 + + perl -pi -e "s,/lib32,/lib," $DESTDIR$TARGETDIR/lib/*.la + perl -pi -e "s,/lib64,/lib," $DESTDIR$TARGETDIR/lib/*.la +} + +searchtool() +{ + # $1 short name + # $2 search string + # $3 soft fail if set + # result: file name of that tool on stdout + # or no output if nothing suitable was found + search=GNU + if [ -n "$2" ]; then + search="$2" + fi + for i in "$1" "g$1" "gnu$1"; do + if test -x "`which $i 2>/dev/null`"; then + if test `cat /dev/null | $i --version 2>&1 |grep -c "$search"` \ + -gt 0; then + echo $i + return + fi + fi + done + # A workaround for OSX 10.9 and some BSDs, whose nongnu + # patch and tar also work. + if [ $UNAME = "Darwin" -o $UNAME = "FreeBSD" -o $UNAME = "NetBSD" -o $UNAME = "OpenBSD" ]; then + if [ "$1" = "patch" -o "$1" = "tar" ]; then + if test -x "`which $1 2>/dev/null`"; then + echo $1 + return + fi + fi + fi + if [ "`echo $1 | cut -b -3`" = "sha" ]; then + if [ $UNAME = "FreeBSD" ]; then + if test -x "`which sha1 2>/dev/null`"; then + echo sha1 + return + fi + fi + if [ $UNAME = "NetBSD" ]; then + if test -x "`which cksum 2>/dev/null`"; then + echo cksum -a `echo $1 | sed -e 's,sum,,'` + return + fi + fi + if [ $UNAME = "Darwin" ]; then + if test -x "`which openssl 2>/dev/null`"; then + echo openssl `echo $1 | sed -e 's,sum,,'` + return + fi + fi + fi + printf "${RED}ERROR:${red} Missing tool: Please install $1 (eg using your OS packaging system)${NC}\n" >&2 + [ -z "$3" ] && exit 1 + false +} + +TAR=`searchtool tar` || exit $? +PATCH=`searchtool patch` || exit $? +MAKE=`searchtool make` || exit $? +CMAKE=`searchtool cmake "cmake"` || exit $? + +searchtool m4 > /dev/null +searchtool bison > /dev/null +searchtool flex flex > /dev/null +searchtool g++ "Free Software Foundation" nofail > /dev/null || \ +searchtool clang "clang version" > /dev/null +searchtool wget > /dev/null +searchtool bzip2 "bzip2," > /dev/null + +wait_for_build() { + # $1: directory in which log file and failure marker are stored + cat > "$1/crossgcc-build.log" + test -r "$1/.failed" && printf "${RED}failed${NC}. Check $1/crossgcc-build.log.\n" || \ + printf "${green}ok${NC}\n" + test -r "$1/.failed" && exit 1 + true +} + +SHA1SUM=`searchtool sha1sum` +SHA512SUM=`searchtool sha512sum` +CHECKSUM=$SHA1SUM + +cleanup() +{ + printf "Cleaning up temporary files... " + rm -rf ${BUILDDIRPREFIX}-* combined gcc-* gmp-* mpfr-* mpc-* libelf-* binutils-* + rm -rf gdb-* acpica-* python-* expat-* + rm -rf ${LLVM_DIR} ${CFE_DIR} ${CRT_DIR} ${CTE_DIR} ${BUILDDIR} + printf "${green}ok${NC}\n" +} + +myhelp() +{ + printf "Usage: $0 [-V] [-c] [-p <platform>] [-d <target directory>] [-D <dest dir>] [-G] [-S]\n" + printf " $0 [-V|--version]\n" + printf " $0 [-h|--help]\n\n" + + printf "Options:\n" + printf " [-V|--version] print version number and exit\n" + printf " [-h|--help] print this help and exit\n" + printf " [-c|--clean] remove temporary files before build\n" + printf " [-t|--savetemps] don't remove temporary files after build\n" + printf " [-y|--ccache] Use ccache when building cross compiler\n" + printf " [-j|--jobs <num>] run <num> jobs in parallel in make\n" + printf " [-p|--platform <platform>] target platform to build cross compiler for\n" + printf " (defaults to $TARGETARCH)\n" + printf " [-d|--directory <target dir>] target directory to install cross compiler to\n" + printf " (defaults to $TARGETDIR)\n\n" + printf " [-D|--destdir <dest dir>] destination directory to install cross compiler to\n" + printf " (for RPM builds, default unset)\n" + printf " [-G|--gdb] build GNU debugger\n" + printf " [-S|--scripting] build scripting support for GDB\n\n" +} + +myversion() +{ + # version tag is always printed, so just print the license here + + cat << EOF +Copyright (C) 2008-2010 by coresystems GmbH +Copyright (C) 2011 by Sage Electronic Engineering + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +EOF +} + +printf "${blue}Welcome to the ${red}coreboot${blue} LLVM toolchain builder v$CROSSGCC_VERSION ($CROSSGCC_DATE)${NC}\n\n" + +# Look if we have getopt. If not, build it. +export PATH=$PATH:. +getopt - > /dev/null 2>/dev/null || gcc -o getopt getopt.c + +# parse parameters.. try to find out whether we're running GNU getopt +getoptbrand="`getopt -V | sed -e '1!d' -e 's,^(......).*,\1,'`" +if [ "${getoptbrand}" = "getopt" ]; then + # Detected GNU getopt that supports long options. + args=`getopt -l version,help,clean,directory:,platform:,jobs:,destdir:,savetemps,skip-gdb,ccache Vhcd:p:j:D:tGy -- "$@"` + eval set "$args" +else + # Detected non-GNU getopt + args=`getopt Vhcd:p:j:D:tGy $*` + set -- $args +fi + +if [ $? != 0 ]; then + myhelp + exit 1 +fi + +while true ; do + case "$1" in + -V|--version) shift; myversion; exit 0;; + -h|--help) shift; myhelp; exit 0;; + -c|--clean) shift; clean=1;; + -t|--savetemps) shift; SAVETEMPS=1;; + -d|--directory) shift; TARGETDIR="$1"; shift;; + -p|--platform) shift; TARGETARCH="$1"; shift;; + -D|--destdir) shift; DESTDIR="$1"; shift;; + -j|--jobs) shift; JOBS="-j $1"; shift;; + -G|--gdb) shift; SKIPGDB=0;; + -S|--scripting) shift; SKIPPYTHON=0;; + -y|--ccache) shift; USECCACHE=1;; + --) shift; break;; + -*) printf "Invalid option\n\n"; myhelp; exit 1;; + *) break;; + esac +done + +case "$TARGETARCH" in + x86_64-elf) ;; + x86_64*) TARGETARCH=x86_64-elf;; + i386-elf) ;; + i386-mingw32) ;; + mipsel-elf) ;; + riscv-elf) ;; + i386*) TARGETARCH=i386-elf;; + arm*) TARGETARCH=armv7-a-eabi;; + aarch64*) TARGETARCH=aarch64-elf;; + *) printf "${red}WARNING: Unsupported architecture $TARGETARCH.${NC}\n\n"; ;; +esac + +echo "Target arch is now $TARGETARCH" +BUILDDIRPREFIX=build-${TARGETARCH} + +if [ "$clean" = "1" ]; then + cleanup +fi + +# coreboot does not like the GOLD linker +# USE_GOLD="--enable-gold" +USE_GOLD="" +GCC_OPTIONS="--enable-lto" + +printf "Downloading tar balls ... \n" +mkdir -p tarballs +for ARCHIVE in $LLVM_ARCHIVE $CFE_ARCHIVE $CRT_ARCHIVE $CTE_ARCHIVE; do + FILE=`basename $ARCHIVE` + printf " * $FILE " + + ##create the sum + #test -f sum/$FILE.cksum || ( + # $CHECKSUM tarballs/$FILE > sum/$FILE.cksum + # continue + #) + + test -f tarballs/$FILE && \ + (test -z "$CHECKSUM" || \ + test "`cat sum/$FILE.cksum 2>/dev/null | sed -e 's,.*([0-9a-f]{40}).*,\1,'`" = "`$CHECKSUM tarballs/$FILE 2>/dev/null | sed -e 's,.*([0-9a-f]{40}).*,\1,'`" ) && \ + printf "(cached)" || ( + printf "(downloading)" + rm -f tarballs/$FILE + cd tarballs + wget --no-check-certificate -q $ARCHIVE + cd .. + test ! -f sum/$FILE.cksum && test -f tarballs/$FILE && \ + (test -z "$CHECKSUM" || $CHECKSUM tarballs/$FILE > sum/$FILE.cksum ) && \ + printf "(checksum created. ${RED}Note. Please upload sum/$FILE.cksum if the corresponding archive is upgraded.${NC})" + ) + test -f tarballs/$FILE || \ + printf "\n${RED}Failed to download $FILE.${NC}\n" + test -f tarballs/$FILE || exit 1 + printf "\n" +done +printf "Downloaded tar balls ... " +printf "${green}ok${NC}\n" + +printf "Unpacking and patching ... \n" +for PACKAGE in LLVM CFE CRT CTE; do + archive=$PACKAGE"_ARCHIVE" + archive="`eval echo '$'$archive`" + dir=$PACKAGE"_DIR" + dir="`eval echo '$'${dir}`" + test -d ${dir} && test -f ${dir}/.unpack_success || ( + printf " * `basename $archive`\n" + FLAGS=zxf + suffix=`echo $archive | sed 's,.*.,,'` + test "$suffix" = "gz" && FLAGS=zxf + test "$suffix" = "bz2" && FLAGS=jxf + test "$suffix" = "xz" && FLAGS="--xz -xf" + test "$suffix" = "lzma" && FLAGS="--lzma -xf" + $TAR $FLAGS tarballs/`basename $archive` + for patch in patches/${dir}_*.patch; do + test -r $patch || continue + printf " o `basename $patch`\n" + $PATCH -s -N -p0 < `echo $patch` || \ + printf "\n${RED}Failed $patch.${NC}\n" + done + touch ${dir}/.unpack_success + ) +done +printf "Unpacked and patched ... " +printf "${green}ok${NC}\n" + +if [ "$USECCACHE" = 1 ]; then + CC="ccache $CC" +fi + +printf "Building CLANG ${CLANG_VERSION} ... " +BUILDDIR=$PWD/build-clang +mkdir -p ${BUILDDIR} +( + ln -sf $PWD/$CFE_DIR $LLVM_DIR/tools/clang + ln -sf $PWD/$CTE_DIR $LLVM_DIR/tools/clang/tools/extra + ln -sf $PWD/$CRT_DIR $LLVM_DIR/projects/compiler-rt + + cd ${BUILDDIR} + + $CMAKE -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=$DESTDIR$TARGETDIR \ + -DCMAKE_BUILD_TYPE=Release ../$LLVM_DIR || touch .failed + $MAKE $JOBS || touch .failed + $MAKE install || touch .failed + + cd - + + cp -a $CFE_DIR/tools/scan-build/* $DESTDIR$TARGETDIR/bin + cp -a $CFE_DIR/tools/scan-view/* $DESTDIR$TARGETDIR/bin + + if [ ! -f .failed ]; then touch .success; fi +) 2>&1 | wait_for_build "${BUILDDIR}" || exit 1 + +PROGNAME=`basename "$0"` +rm -f "$DESTDIR$TARGETDIR/$PROGNAME".commit.* +cp "$PROGNAME" $DESTDIR$TARGETDIR/"$PROGNAME.commit.`git describe`" + +if [ $SAVETEMPS -eq 0 ]; then + cleanup +else + printf "Leaving temporary files around... ${green}ok${NC}\n" +fi + +printf "\n${green}You can now run your CLANG toolchain from $TARGETDIR.${NC}\n" + diff --git a/util/crossgcc/patches/cfe-3.6.1.src_frontend.patch b/util/crossgcc/patches/cfe-3.6.1.src_frontend.patch new file mode 100644 index 0000000..594e08a --- /dev/null +++ b/util/crossgcc/patches/cfe-3.6.1.src_frontend.patch @@ -0,0 +1,75 @@ +Index: include/clang/Driver/Driver.h +=================================================================== +--- cfe-3.6.1.src/include/clang/Driver/Driver.h (revision 211898) ++++ cfe-3.6.1.src/include/clang/Driver/Driver.h (working copy) +@@ -325,6 +325,14 @@ + // FIXME: This should be in CompilationInfo. + std::string GetFilePath(const char *Name, const ToolChain &TC) const; + ++ /// GetCompilerRTPath - Find Compiler-RT library path ++ /// ++ /// \param TC - The provided tool chain for additional information on ++ /// directories to search. ++ // ++ // FIXME: This should be in CompilationInfo. ++ std::string GetCompilerRTPath(const ToolChain &TC) const; ++ + /// GetProgramPath - Lookup \p Name in the list of program search paths. + /// + /// \param TC - The provided tool chain for additional information on +Index: include/clang/Driver/Options.td +=================================================================== +--- cfe-3.6.1.src/include/clang/Driver/Options.td (revision 211898) ++++ cfe-3.6.1.src/include/clang/Driver/Options.td (working copy) +@@ -1269,6 +1269,8 @@ + HelpText<"Enable Objective-C Ivar layout bitmap print trace">; + def print_libgcc_file_name : Flag<["-", "--"], "print-libgcc-file-name">, + HelpText<"Print the library path for "libgcc.a"">; ++def print_librt_file_name : Flag<["-", "--"], "print-librt-file-name">, ++ HelpText<"Print the library path for "libclang_rt.builtins-ARCH.a"">; + def print_multi_directory : Flag<["-", "--"], "print-multi-directory">; + def print_multi_lib : Flag<["-", "--"], "print-multi-lib">; + def print_multi_os_directory : Flag<["-", "--"], "print-multi-os-directory">; +Index: lib/Driver/Driver.cpp +=================================================================== +--- cfe-3.6.1.src/lib/Driver/Driver.cpp (revision 211898) ++++ cfe-3.6.1.src/lib/Driver/Driver.cpp (working copy) +@@ -756,6 +756,11 @@ + return false; + } + ++ if (C.getArgs().hasArg(options::OPT_print_librt_file_name)) { ++ llvm::outs() << GetCompilerRTPath(TC) << "\n"; ++ return false; ++ } ++ + if (C.getArgs().hasArg(options::OPT_print_multi_lib)) { + const MultilibSet &Multilibs = TC.getMultilibs(); + +@@ -1820,6 +1825,26 @@ + return Name; + } + ++std::string Driver::GetCompilerRTPath(const ToolChain &TC) const { ++ // The runtimes are located in the OS-specific resource directory. ++ SmallString<128> Res(TC.getDriver().ResourceDir); ++ const llvm::Triple &Triple = TC.getTriple(); ++ ++ // TC.getOS() yield "freebsd10.0" whereas "freebsd" is expected. ++ StringRef OSLibName = (Triple.getOS() == llvm::Triple::FreeBSD) ? ++ "freebsd" : TC.getOS(); ++ llvm::sys::path::append(Res, "lib", OSLibName); ++ ++ StringRef archName = TC.getArchName(); ++ // Until ARM libraries are build separately, we have them all in one library ++ if (TC.getArch() == llvm::Triple::arm || ++ TC.getArch() == llvm::Triple::armeb) ++ archName = "arm"; ++ ++ llvm::sys::path::append(Res, Twine("libclang_rt.builtins-") + archName + ".a"); ++ return Res.str(); ++} ++ + std::string Driver::GetProgramPath(const char *Name, + const ToolChain &TC) const { + // FIXME: Needs a better variable than DefaultTargetTriple diff --git a/util/crossgcc/sum/cfe-3.6.1.src.tar.xz.cksum b/util/crossgcc/sum/cfe-3.6.1.src.tar.xz.cksum new file mode 100644 index 0000000..661bf9c --- /dev/null +++ b/util/crossgcc/sum/cfe-3.6.1.src.tar.xz.cksum @@ -0,0 +1 @@ +b7221d8fdd27e3ed519d0281646e82e17b51122c tarballs/cfe-3.6.1.src.tar.xz diff --git a/util/crossgcc/sum/clang-tools-extra-3.6.1.src.tar.xz.cksum b/util/crossgcc/sum/clang-tools-extra-3.6.1.src.tar.xz.cksum new file mode 100644 index 0000000..17d55cb --- /dev/null +++ b/util/crossgcc/sum/clang-tools-extra-3.6.1.src.tar.xz.cksum @@ -0,0 +1 @@ +d93136f56999d8ae1ffebb9cd0cd7f3c27ba77c4 tarballs/clang-tools-extra-3.6.1.src.tar.xz diff --git a/util/crossgcc/sum/compiler-rt-3.6.1.src.tar.xz.cksum b/util/crossgcc/sum/compiler-rt-3.6.1.src.tar.xz.cksum new file mode 100644 index 0000000..51e426b --- /dev/null +++ b/util/crossgcc/sum/compiler-rt-3.6.1.src.tar.xz.cksum @@ -0,0 +1 @@ +85dccdc6ccd9675e871dfd2786b45fbf53518485 tarballs/compiler-rt-3.6.1.src.tar.xz diff --git a/util/crossgcc/sum/llvm-3.6.1.src.tar.xz.cksum b/util/crossgcc/sum/llvm-3.6.1.src.tar.xz.cksum new file mode 100644 index 0000000..5ca7065 --- /dev/null +++ b/util/crossgcc/sum/llvm-3.6.1.src.tar.xz.cksum @@ -0,0 +1 @@ +01ecab99adc9030ee34e9a2e19e65dfe64e1affe tarballs/llvm-3.6.1.src.tar.xz