Author: stepan
Date: Tue Apr 20 19:19:20 2010
New Revision: 5465
URL: https://tracker.coreboot.org/trac/coreboot/changeset/5465

Log:
Allow easy libpayload compilation using xcompile.

Signed-off-by: Stefan Reinauer <ste...@coresystems.de>
Acked-by: Stefan Reinauer <ste...@coresystems.de>

Added:
   trunk/payloads/libpayload/util/xcompile/
   trunk/payloads/libpayload/util/xcompile/xcompile
Modified:
   trunk/payloads/libpayload/Makefile

Modified: trunk/payloads/libpayload/Makefile
==============================================================================
--- trunk/payloads/libpayload/Makefile  Tue Apr 20 18:20:48 2010        (r5464)
+++ trunk/payloads/libpayload/Makefile  Tue Apr 20 19:19:20 2010        (r5465)
@@ -49,7 +49,10 @@
 Q := @
 endif
 
-CC = gcc
+$(if $(wildcard .xcompile),,$(eval $(shell bash util/xcompile/xcompile > 
.xcompile)))
+include .xcompile
+
+CC ?= gcc
 HOSTCC = gcc
 HOSTCXX = g++
 HOSTCFLAGS := -I$(srck) -I$(objk) -pipe

Added: trunk/payloads/libpayload/util/xcompile/xcompile
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ trunk/payloads/libpayload/util/xcompile/xcompile    Tue Apr 20 19:19:20 
2010        (r5465)
@@ -0,0 +1,103 @@
+#!/bin/sh
+#
+# This file is part of the coreboot project.
+#
+# Copyright (C) 2007-2010 coresystems GmbH
+#
+# 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., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
+#
+
+testcc()
+{
+       echo "_start(void) {}" > .$$$$.c
+       $1 -nostdlib $2 .$$$$.c -o .$$$$.tmp 2>/dev/null >/dev/null
+       ret=$?
+       rm -f .$$$$.c .$$$$.tmp
+       return $ret
+}
+
+for make in make gmake gnumake; do
+       if [ "`$make --version 2>/dev/null | grep -c GNU`" -gt 0 ]; then
+               MAKE=$make
+               break
+       fi
+done
+
+GCCPREFIX=invalid
+TMPFILE=`mktemp /tmp/temp.XXXX 2>/dev/null || echo /tmp/temp.78gOIUGz`
+touch $TMPFILE
+
+# This should be a loop over all supported architectures
+TARCH=i386
+TWIDTH=32
+for gccprefixes in `pwd`/util/crossgcc/xgcc/bin/${TARCH}-elf- ${TARCH}-elf- 
""; do
+       if ! which ${gccprefixes}as 2>/dev/null >/dev/null; then
+               continue
+       fi
+       rm -f ${TMPFILE}.o
+       if ${gccprefixes}as -o ${TMPFILE}.o ${TMPFILE}; then
+               TYPE=`${gccprefixes}objdump -p ${TMPFILE}.o`
+               if [ ${TYPE##* } == "elf${TWIDTH}-${TARCH}" ]; then
+                       GCCPREFIX=$gccprefixes
+                       ASFLAGS=
+                       CFLAGS=
+                       LDFLAGS=
+                       break
+               fi
+       fi
+       if ${gccprefixes}as --32 -o ${TMPFILE}.o ${TMPFILE}; then
+               TYPE=`${gccprefixes}objdump -p ${TMPFILE}.o`
+               if [ ${TYPE##* } == "elf${TWIDTH}-${TARCH}" ]; then
+                       GCCPREFIX=$gccprefixes
+                       ASFLAGS=--32
+                       CFLAGS="-m32 "
+                       LDFLAGS="-b elf32-i386"
+                       break
+               fi
+       fi
+done
+rm -f $TMPFILE ${TMPFILE}.o
+
+if [ "$GCCPREFIX" = "invalid" ]; then
+       echo '$(error no suitable gcc found)'
+       exit 1
+fi
+
+CC="${GCCPREFIX}gcc"
+testcc "$CC" "$CFLAGS-Wa,--divide " && CFLAGS="$CFLAGS-Wa,--divide "
+testcc "$CC" "$CFLAGS-fno-stack-protector " && 
CFLAGS="$CFLAGS-fno-stack-protector "
+testcc "$CC" "$CFLAGS-Wl,--build-id=none " && 
CFLAGS="$CFLAGS-Wl,--build-id=none "
+
+if which gcc 2>/dev/null >/dev/null; then
+       HOSTCC=gcc
+else
+       HOSTCC=cc
+fi
+
+cat << EOF
+# elf${TWIDTH}-${TARCH} toolchain
+AS:=${GCCPREFIX}as ${ASFLAGS}
+CC:=${GCCPREFIX}gcc ${CFLAGS}
+CPP:=${GCCPREFIX}cpp
+AR:=${GCCPREFIX}ar
+LD:=${GCCPREFIX}ld ${LDFLAGS}
+STRIP:=${GCCPREFIX}strip
+NM:=${GCCPREFIX}nm
+OBJCOPY:=${GCCPREFIX}objcopy
+OBJDUMP:=${GCCPREFIX}objdump
+
+# native toolchain
+HOSTCC:=${HOSTCC}
+EOF
+

-- 
coreboot mailing list: coreboot@coreboot.org
http://www.coreboot.org/mailman/listinfo/coreboot

Reply via email to