Add -Werror to xcompile's testcc
[coreboot.git] / util / xcompile / xcompile
index 79d4bfe5adce40a49f322bb4e0adee2a9fd7eee9..49263941dfa10d9d1ae47d884b661fa960f76ed1 100644 (file)
@@ -1,3 +1,31 @@
+#!/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
@@ -7,40 +35,82 @@ for make in make gmake gnumake; do
 done
 
 GCCPREFIX=invalid
-TMP=`mktemp /tmp/temp.XXXX`
-echo "mov %eax, %eax" > ${TMP}.s
-printf "\x7fELF" > ${TMP}.compare
-for gccprefixes in `pwd`/util/crossgcc/xgcc/bin/i386-elf- i386-elf- ""; do
-       if which ${gccprefixes}as 2>/dev/null >/dev/null; then
-               printf ""
-       else
+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 ${TMP}.o
-       if ${gccprefixes}as --32 -o ${TMP}.o ${TMP}.s; then
-               dd bs=4 count=1 if=${TMP}.o > ${TMP}.test 2>/dev/null
-               if cmp ${TMP}.test ${TMP}.compare; then
+       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 $TMP ${TMP}.s ${TMP}.o ${TMP}.compare ${TMP}.test
+rm -f $TMPFILE ${TMPFILE}.o
 
 if [ "$GCCPREFIX" = "invalid" ]; then
        echo '$(error no suitable gcc found)'
        exit 1
 fi
 
-cat << afteroptions
-AS:=${GCCPREFIX}as --32
-CC:=${GCCPREFIX}gcc -m32
-CPP:=${GCCPREFIX}cpp
+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 -b elf32-i386
+LD:=${GCCPREFIX}ld ${LDFLAGS}
 STRIP:=${GCCPREFIX}strip
 NM:=${GCCPREFIX}nm
 OBJCOPY:=${GCCPREFIX}objcopy
 OBJDUMP:=${GCCPREFIX}objdump
-HOSTCC:=gcc
-afteroptions
+
+IASL:=${IASL}
+
+# native toolchain
+HOSTCC:=${HOSTCC}
+EOF
+