[coreboot-gerrit] New patch to review for coreboot: 1bba13f crossgcc: Add clang support

Stefan Reinauer (stefan.reinauer@coreboot.org) gerrit at coreboot.org
Thu Jun 4 02:16:01 CEST 2015


Stefan Reinauer (stefan.reinauer at 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 at 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 at 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 at coresystems.de> and
+#            Stefan Reinauer <stefan.reinauer at 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/${CLANG_VERSION}/llvm-${CLANG_VERSION}.src.tar.xz"
+CFE_ARCHIVE="http://llvm.org/releases/${CLANG_VERSION}/cfe-${CLANG_VERSION}.src.tar.xz"
+CRT_ARCHIVE="http://llvm.org/releases/${CLANG_VERSION}/compiler-rt-${CLANG_VERSION}.src.tar.xz"
+CTE_ARCHIVE="http://llvm.org/releases/${CLANG_VERSION}/clang-tools-extra-${CLANG_VERSION}.src.tar.xz"
+
+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



More information about the coreboot-gerrit mailing list