aboutsummaryrefslogtreecommitdiff
path: root/util/xcompile/xcompile
blob: 49263941dfa10d9d1ae47d884b661fa960f76ed1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#!/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