| #!/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 |
| 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 |
| |