build_cross_tools_gcc4 revision 11ece173
1#!/bin/sh
2#
3# parameters <machine> <haiku sourcedir> <buildtools dir> <isntall dir>
4
5# get and check the parameters
6if [ $# -lt 4 ]; then
7	echo Usage: $0 '<machine> <haiku sourcedir> <buildtools dir>' \
8		'<install dir>' >&2
9	exit 1
10fi
11
12haikuMachine=$1
13haikuSourceDir=$2
14buildToolsDir=$3
15installDir=$4
16shift 4
17additionalMakeArgs=$*
18
19ccFlags="-O2"
20cxxFlags="-O2"
21binutilsTargets="$haikuMachine"
22case $haikuMachine in
23i586-*)
24	binutilsConfigureArgs="--disable-multilib"
25	gccConfigureArgs="--disable-multilib"
26	binutilsTargets="$binutilsTargets,i386-efi-pe,x86_64-efi-pe"
27	;;
28x86_64-*)
29	# GCC's default is to enable multilib, but there is a bug when
30	# explicitly using --enable-multilib that causes a build
31	# failure
32	binutilsConfigureArgs=""
33	binutilsTargets="$binutilsTargets,i386-efi-pe,x86_64-efi-pe"
34	;;
35m68k-*)
36	binutilsConfigureArgs="--enable-multilib"
37	gccConfigureArgs="--enable-multilib"
38	;;
39arm-*)
40	# Multilib creates a lot of confusion as the wrong libs end up being linked.
41	# For now, target Cortex-A8 devices.
42	binutilsConfigureArgs="--disable-multilib --with-float=hard
43		--with-cpu=cortex-a8 --with-fpu=vfpv3"
44	gccConfigureArgs="--disable-multilib --with-float=hard
45		--with-cpu=cortex-a8 --with-fpu=vfpv3"
46
47	# TODO: Disable building with TLS support for ARM until implemented.
48	binutilsConfigureArgs="$binutilsConfigureArgs --disable-tls"
49	gccConfigureArgs="$gccConfigureArgs --disable-tls"
50	;;
51powerpc-*)
52	binutilsConfigureArgs="--disable-multilib"
53	gccConfigureArgs="--disable-multilib"
54	binutilsTargets="$binutilsTargets,powerpc-apple-linux,powerpc-apple-freebsd,powerpc-apple-vxworks"
55	;;
56*)
57	binutilsConfigureArgs="--disable-multilib"
58	gccConfigureArgs="--disable-multilib"
59	;;
60esac
61
62if [ `uname -s` = 'Haiku' ]; then
63	# force cross-build if building on Haiku:
64	buildhostMachine=${haikuMachine}_buildhost
65	buildHostSpec="--build=$buildhostMachine --host=$buildhostMachine"
66fi
67
68if [ ! -d "$haikuSourceDir" ]; then
69	echo "No such directory: \"$haikuSourceDir\"" >&2
70	exit 1
71fi
72
73if [ ! -d "$buildToolsDir" ]; then
74	echo "No such directory: \"$buildToolsDir\"" >&2
75	exit 1
76fi
77
78
79# create the output dir
80mkdir -p "$installDir" || exit 1
81
82
83# get absolute paths
84currentDir=$(pwd)
85
86cd "$haikuSourceDir"
87haikuSourceDir=$(pwd)
88cd "$currentDir"
89
90cd "$buildToolsDir"
91buildToolsDir=$(pwd)
92cd "$currentDir"
93
94cd "$installDir"
95installDir=$(pwd)
96cd "$currentDir"
97
98binutilsSourceDir="$buildToolsDir/binutils"
99gccSourceDir="$buildToolsDir/gcc"
100
101
102# get gcc version
103gccVersion=$(cat "$gccSourceDir/gcc/BASE-VER")
104
105if [ -z "$gccVersion" ]; then
106	echo "Failed to find out gcc version." >&2
107	exit 1
108fi
109
110# touch all info files in order to avoid the dependency on makeinfo
111# (which apparently doesn't work reliably on all the different host
112# configurations and changes files which in turn appear as local changes
113# to the VCS).
114find "$binutilsSourceDir" "$gccSourceDir" -name \*.info -print0 | xargs -0 touch
115
116# create the object and installation directories for the cross compilation tools
117objDir="${installDir}-build"
118binutilsObjDir="$objDir/binutils"
119gccObjDir="$objDir/gcc"
120stdcxxObjDir="$objDir/stdcxx"
121sysrootDir="$installDir/sysroot"
122tmpIncludeDir="$sysrootDir/boot/system/develop/headers"
123tmpLibDir="$sysrootDir/boot/system/develop/lib"
124
125rm -rf "$installDir" "$objDir"
126
127mkdir -p "$installDir" "$objDir" "$binutilsObjDir" "$gccObjDir" "$stdcxxObjDir" \
128	"$tmpIncludeDir" "$tmpLibDir" || exit 1
129mkdir -p "$installDir/lib/gcc/$haikuMachine/$gccVersion"
130
131if [ "$HAIKU_USE_GCC_GRAPHITE" = 1 ]; then
132	cloogSourceDir="$buildToolsDir/cloog"
133	gmpSourceDir="$buildToolsDir/gcc/gmp"
134	islSourceDir="$buildToolsDir/isl"
135
136	islObjDir="$objDir/isl"
137	gmpObjDir="$objDir/gmp"
138	cloogObjDir="$objDir/cloog"
139	mkdir -p "$islObjDir" "$gmpObjDir" "$cloogObjDir" || exit 1
140
141	gccConfigureArgs="$gccConfigureArgs --with-cloog=$installDir \
142		--enable-cloog-backend=isl --with-isl=$installDir \
143		--with-gmp=$installDir \
144		--with-host-libstdcxx=\"-lstdc++\""
145fi
146if [ "$HAIKU_USE_GCC_PIPE" = 1 ]; then
147	ccFlags="$ccFlags -pipe"
148	cxxFlags="$cxxFlags -pipe"
149fi
150
151if [ -n "$SECONDARY_ARCH" ]; then
152	gccConfigureArgs="$gccConfigureArgs --with-hybrid-secondary=$SECONDARY_ARCH"
153fi
154
155# force the POSIX locale, as the build (makeinfo) might choke otherwise
156export LC_ALL=POSIX
157
158# build binutils
159cd "$binutilsObjDir"
160CFLAGS="$ccFlags" CXXFLAGS="$cxxFlags" "$binutilsSourceDir/configure" \
161	--prefix="$installDir" $buildHostSpec --target=$haikuMachine \
162	--enable-targets=$binutilsTargets \
163	--disable-nls --disable-shared --disable-werror \
164	--with-sysroot="$sysrootDir" \
165	$binutilsConfigureArgs \
166	|| exit 1
167$MAKE $additionalMakeArgs || exit 1
168$MAKE $additionalMakeArgs install || exit 1
169
170export PATH=$PATH:"$installDir/bin"
171
172if [ "$HAIKU_USE_GCC_GRAPHITE" = 1 ]; then
173	# build gmp
174	cd "$gmpObjDir"
175	CFLAGS="$ccFlags" CXXFLAGS="$cxxFlags" "$gmpSourceDir/configure" \
176		--prefix="$installDir" --disable-shared --enable-cxx || exit 1
177	$MAKE $additionalMakeArgs || exit 1
178	$MAKE $additionalMakeArgs install || exit 1
179
180	# build isl
181	cd "$islObjDir"
182	CFLAGS="$ccFlags" CXXFLAGS="$cxxFlags" "$islSourceDir/configure" \
183		--prefix="$installDir" --disable-nls --disable-shared \
184		 --with-gmp-prefix="$installDir" || exit 1
185	$MAKE $additionalMakeArgs || exit 1
186	$MAKE $additionalMakeArgs install || exit 1
187
188	# build cloog
189	cd "$cloogObjDir"
190	CFLAGS="$ccFlags" CXXFLAGS="$cxxFlags" "$cloogSourceDir/configure" \
191		--prefix="$installDir" --disable-nls --disable-shared \
192		--with-gmp-prefix="$installDir" --with-isl-prefix=="$installDir" \
193		|| exit 1
194	$MAKE $additionalMakeArgs || exit 1
195	$MAKE $additionalMakeArgs install || exit 1
196fi
197
198# build gcc
199
200# prepare the include files
201copy_headers()
202{
203	sourceDir=$1
204	targetDir=$2
205
206	headers="$(find $sourceDir -name \*\.h)"
207	headers="$(echo $headers | sed -e s@$sourceDir/@@g)"
208	for f in $headers; do
209		headerTargetDir="$targetDir/$(dirname $f)"
210		mkdir -p "$headerTargetDir"
211		cp "$sourceDir/$f" "$headerTargetDir"
212	done
213}
214
215copy_headers "$haikuSourceDir/headers/config" "$tmpIncludeDir/config"
216copy_headers "$haikuSourceDir/headers/os" "$tmpIncludeDir/os"
217copy_headers "$haikuSourceDir/headers/posix" "$tmpIncludeDir/posix"
218
219# configure gcc
220cd "$gccObjDir"
221CFLAGS="$ccFlags" CXXFLAGS="$cxxFlags" "$gccSourceDir/configure" \
222	--prefix="$installDir" $buildHostSpec --target=$haikuMachine \
223	--disable-nls --disable-shared --with-system-zlib \
224	--enable-languages=c,c++ --enable-lto --enable-frame-pointer \
225	--with-sysroot="$sysrootDir" --disable-threads --disable-tls \
226	--disable-libatomic \
227	$gccConfigureArgs \
228	|| exit 1
229
230# make gcc
231$MAKE $additionalMakeArgs || {
232	echo "ERROR: Building gcc failed." >&2
233	exit 1
234}
235
236# install gcc
237$MAKE $additionalMakeArgs install || {
238	echo "ERROR: Installing the cross compiler failed." >&2
239	exit 1
240}
241
242case $haikuMachine in
243x86_64-*)
244	# pick up the 32-bit libraries for the bootloader
245	bootLibgcc=`$installDir/bin/$haikuMachine-gcc -m32 -print-file-name=libgcc.a`
246	$installDir/bin/$haikuMachine-strip --strip-debug $bootLibgcc
247	bootLibsupcxx=`$installDir/bin/$haikuMachine-gcc -m32 -print-file-name=libsupc++.a`
248	$installDir/bin/$haikuMachine-strip --strip-debug $bootLibsupcxx
249	;;
250esac
251
252# cleanup
253
254# remove the system headers from the installation dir
255# Only the ones from the source tree should be used.
256rm -rf "$installDir/$haikuMachine/sys-include"
257
258# remove the sysroot dir
259rm -rf "$sysrootDir"
260
261# remove the objects dir
262rm -rf "$objDir"
263
264
265echo "binutils and gcc for cross compilation have been built successfully!"
266