#!/bin/sh # # This file is part of the coreboot project. # # Copyright (C) 2007-2010 coresystems GmbH # Copyright (C) 2012 Google Inc # # 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. # TMPFILE="" die() { echo "ERROR: $*" >&2 exit 1 } clean_up() { if [ -n "$TMPFILE" ]; then rm -f "$TMPFILE" "$TMPFILE.c" "$TMPFILE.o" fi } program_exists() { type "$1" >/dev/null 2>&1 } testcc() { local tmp_c="$TMPFILE.c" local tmp_o="$TMPFILE.o" rm -f "$tmp_c" "$tmp_o" echo "_start(void) {}" >"$tmp_c" "$1" -nostdinc -nostdlib -Werror $2 "$tmp_c" -o "$tmp_o" >/dev/null 2>&1 } testas() { local gccprefixes="$1" local twidth="$2" local arch="$3" local use_dash_twidth="$4" local obj_file="$TMPFILE.o" local full_arch="elf$twidth-$arch" rm -f "$obj_file" [ -n "$use_dash_twidth" ] && use_dash_twidth="--$twidth" ${gccprefixes}as $use_dash_twidth -o "$obj_file" $TMPFILE 2>/dev/null || return 1 # Check output content type. local obj_type="$(${gccprefixes}objdump -p $obj_file)" local obj_arch="$(expr "$obj_type" : '.*format \(.[a-z0-9-]*\)')" [ "$obj_arch" = "$full_arch" ] || return 1 # Architecture matched. GCCPREFIX="$gccprefixes" if [ -z "$use_dash_twidth" ]; then ASFLAGS="" CFLAGS="" LDFLAGS="" else ASFLAGS="--$twidth" CFLAGS="-m$twidth" LDFLAGS="-b $full_arch" fi # Special parameters only available in dash_twidth mode. [ -n "$use_dash_twidth" ] && case "$full_arch" in "elf32-i386" ) LDFLAGS="$LDFLAGS -melf_i386" CFLAGS="$CFLAGS -Wl,-b,elf32-i386 -Wl,-melf_i386" ;; esac return 0 } detect_special_flags() { local architecture="$1" # 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 " # Use bfd linker instead of gold if available: testcc "$CC" "$CFLAGS -fuse-ld=bfd" && CFLAGS="$CFLAGS -fuse-ld=bfd" && LINKER_SUFFIX='.bfd' 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" case "$architecture" in arm ) # testcc "$CC" "$CFLAGS -mcpu=cortex-a9" && # CFLAGS="$CFLAGS -mcpu=cortex-a9" ;; arm64-generic ) ;; mips ) testcc "$CC" "CFLAGS -mxgot" && CFLAGS="$CFLAGS -mxgot" ;; esac } report_arch_toolchain() { cat <&2 continue fi CC="${GCCPREFIX}"gcc detect_special_flags "$architecture" report_arch_toolchain done if [ "$(${XGCCPATH}/iasl 2>/dev/null | grep -c ACPI)" -gt 0 ]; then IASL=${XGCCPATH}iasl else IASL=iasl fi if program_exists gcc; then HOSTCC=gcc else HOSTCC=cc fi cat <