117 lines
3.0 KiB
Bash
117 lines
3.0 KiB
Bash
#!/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
|
|
|