#!/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 -Werror $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 XGCCPATH=${1:-"`pwd`/util/crossgcc/xgcc/bin/"} echo '#XGCCPATH='${XGCCPATH} 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 ${XGCCPATH}${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 " # GCC 4.6 is much more picky about unused variables. Turn off it's warnings for # now: testcc "$CC" "$CFLAGS-Wno-unused-but-set-variable " && \ CFLAGS="$CFLAGS-Wno-unused-but-set-variable " if which gcc 2>/dev/null >/dev/null; then HOSTCC=gcc else HOSTCC=cc fi if [ "`${XGCCPATH}/iasl 2>/dev/null | grep -c ACPI`" -gt 0 ]; then IASL=${XGCCPATH}iasl else IASL=iasl fi cat << EOF # elf${TWIDTH}-${TARCH} toolchain AS:=${GCCPREFIX}as ${ASFLAGS} CC:=${GCCPREFIX}gcc ${CFLAGS} AR:=${GCCPREFIX}ar LD:=${GCCPREFIX}ld ${LDFLAGS} STRIP:=${GCCPREFIX}strip NM:=${GCCPREFIX}nm OBJCOPY:=${GCCPREFIX}objcopy OBJDUMP:=${GCCPREFIX}objdump IASL:=${IASL} # native toolchain HOSTCC:=${HOSTCC} EOF