Magellan Linux

Contents of /branches/magellan-next/include/cross_tools.sminc

Parent Directory Parent Directory | Revision Log Revision Log


Revision 6654 - (show annotations) (download)
Tue Sep 14 16:46:32 2010 UTC (14 years, 2 months ago) by niro
File size: 12551 byte(s)
imported from trunk
1 # $Header: /magellan-cvs/smage/include/cross_tools.sminc,v 1.3 2008/10/06 17:55:48 niro Exp $
2 # Cross-tools generic functions
3
4 # needed vars:
5 # TARGET_DEST dir
6 : ${TARGET_DEST="/opt/cross-tools"}
7
8 # needed vars
9 #TARGET_ARCH="i686" # must be set outside
10 : ${CROSS_CHOST="${ARCH}-cross-linux-gnu"}
11 : ${TARGET_CHOST="${TARGET_ARCH}-pc-linux-gnu"}
12
13 : ${PNAME="cross-tools-${TARGET_ARCH}"}
14
15 : ${PCATEGORIE="dev-cross"}
16
17 : ${DESCRIPTION="A crosscompile toolchain to compile programms for the ${TARGET_ARCH} arch."}
18 : ${HOMEPAGE="http://magellan-linux.de/"}
19
20 # binutils
21 #BINUTILS_PVER="2.16.91.0.3"
22 : ${BINUTILS_SRCFILE="binutils-${BINUTILS_PVER}.tar.bz2"}
23 : ${BINUTILS_SRCDIR="${BUILDDIR}/binutils-${BINUTILS_PVER}"}
24
25 # kernel-headers
26 #LINUX_HEADERS_PVER="2.6.12.0"
27 : ${LINUX_HEADERS_SRCFILE="linux-${LINUX_HEADERS_PVER}.tar.bz2"}
28 : ${LINUX_HEADERS_SRCDIR="${BUILDDIR}/linux-${LINUX_HEADERS_PVER}"}
29
30 # glibc-headers and libc
31 #GLIBC_PVER="2.3.5_20051107"
32 : ${GLIBC_SRCFILE="glibc-${GLIBC_PVER}.tar.bz2"}
33 #: ${GLIBC_LINUXTHREADS="glibc-linuxthreads-${GLIBC_PVER}.tar.bz2"}
34 : ${GLIBC_SRCDIR="${BUILDDIR}/glibc-${GLIBC_PVER}"}
35
36 # gcc
37 #GCC_PVER="${PVER}"
38 : ${GCC_SRCFILE="gcc-${GCC_PVER}.tar.bz2"}
39 : ${GCC_SRCDIR="${BUILDDIR}/gcc-${GCC_PVER}"}
40
41 # do not get the idea to strip the resulting binaries!
42 # you must have build the strip program on the same arch,
43 # but this is propably not the case. so we force stripping off.
44 NOSTRIP=true
45
46 # fetch sources
47 SRC_URI=(
48 ${SRC_URI[*]}
49 http://www.kernel.org/pub/linux/devel/binutils/${BINUTILS_SRCFILE}
50 mirror://binutils/${BINUTILS_SRCFILE}
51 http://www.kernel.org/pub/linux/kernel/v${LINUX_HEADERS_PVER:0:3}/${LINUX_HEADERS_SRCFILE}
52 mirror://linux-libc-headers/${LINUX_HEADERS_SRCFILE}
53 gnu://glibc/${GLIBC_SRCFILE}
54 mirror://glibc/${GLIBC_SRCFILE}
55 gnu://gcc/gcc-${GCC_PVER}/${GCC_SRCFILE}
56 mirror://gcc/${GCC_SRCFILE}
57 mirror://glibc/glibc-2.3.5-localedef_segfault-1.patch
58 mirror://glibc/glibc-2.3.5-libgcc_eh-1.patch
59 mirror://gcc/gcc-${GCC_PVER}-no-fixincludes.patch
60 mirror://gcc/gcc-${GCC_PVER}-magellan-version.patch
61 mirror://gcc/gcc-${GCC_PVER}-cross-search-paths.patch
62 mirror://gcc/gcc-${GCC_PVER}-specs.patch
63 )
64
65 binutils_src_prepare()
66 {
67 munpack ${BINUTILS_SRCFILE} || die
68 install -d ${BINUTILS_SRCDIR}/build || die
69 }
70
71 binutils_src_compile()
72 {
73 cd ${BINUTILS_SRCDIR}/build
74
75 AR=ar AS=as \
76 ../configure \
77 --host=${CROSS_CHOST} \
78 --target=${TARGET_CHOST} \
79 --prefix=${TARGET_DEST} \
80 --with-lib-path=${TARGET_DEST}/lib \
81 --disable-nls \
82 --enable-shared \
83 --disable-multilib \
84 || die
85
86 make configure-host || die
87 mmake || die
88 }
89
90 binutils_src_install()
91 {
92 cd ${BINUTILS_SRCDIR}/build
93
94 make install || die
95
96 install -d ${TARGET_DEST}/include || die
97 cp ../include/libiberty.h ${TARGET_DEST}/include || die
98 }
99
100 linux_headers_src_prepare()
101 {
102 munpack ${LINUX_HEADERS_SRCFILE} || die
103 }
104
105 linux_headers_src_compile()
106 {
107 cd ${LINUX_HEADERS_SRCDIR}
108 make mrproper || die
109 make ARCH=${ARCH/i*86/x86} headers_check || die
110 }
111
112 linux_headers_src_install()
113 {
114 cd ${LINUX_HEADERS_SRCDIR}
115 make ARCH=${ARCH/i*86/x86} INSTALL_HDR_PATH=${BINDIR}/${TARGET_DEST} headers_install || die
116 }
117
118 # building the glibc-headers
119 glibc_headers_src_prepare()
120 {
121 glibc_generic_src_prepare
122 cd ${GLIBC_SRCDIR}/build
123
124 # remove gcc dependencies
125 sed -i 's/3.4/3.[0-9]/g' ../configure || die
126 }
127
128 glibc_headers_src_compile()
129 {
130 cd ${GLIBC_SRCDIR}/build
131
132 # do not enable addons here
133 ../configure \
134 --host=${CHOST} \
135 --target=${TARGET_CHOST} \
136 --prefix=${TARGET_DEST} \
137 --enable-kernel=2.6.0 \
138 --without-cvs \
139 --with-headers=${TARGET_DEST}/include \
140 --with-binutils=${TARGET_DEST}/${TARGET_CHOST}/bin \
141 --disable-sanity-checks \
142 --disable-nls \
143 || die
144 }
145
146 glibc_headers_src_install()
147 {
148 cd ${GLIBC_SRCDIR}/build
149 make install-headers || die
150
151 # needed directories
152 install -d ${TARGET_DEST}/include/{bits,gnu} || die
153
154 # using correct arch
155 local myarch=${TARGET_ARCH}
156 [[ ${myarch} = i?86 ]] && myarch=i386
157
158 # missing headers
159 cp bits/stdio_lim.h ${TARGET_DEST}/include/bits || die
160 touch ${TARGET_DEST}/include/gnu/stubs.h || die
161 cp ../nptl/sysdeps/pthread/pthread.h ${TARGET_DEST}/include || die
162 cp ../nptl/sysdeps/unix/sysv/linux/${myarch}/bits/pthreadtypes.h \
163 ${TARGET_DEST}/include || die
164 }
165
166 # generic glibc unpack
167 glibc_generic_src_prepare()
168 {
169 munpack ${GLIBC_SRCFILE} || die
170 cd ${GLIBC_SRCDIR}
171
172 # disable binutils -as-needed
173 sed -i 's/^have-as-needed.*/have-as-needed = no/' \
174 ${GLIBC_SRCDIR}/config.make.in || die
175
176 # fix segfault of localdef on arches beside x86-32
177 mpatch glibc-2.3.5-localedef_segfault-1.patch || die
178
179 # fix permissions on some of the scripts
180 chmod u+x ${GLIBC_SRCDIR}/scripts/*.sh || die
181
182 install -d ${GLIBC_SRCDIR}/build || die
183 }
184
185 # final glibc
186 glibc_src_prepare()
187 {
188 glibc_generic_src_prepare
189 cd ${GLIBC_SRCDIR}
190
191 # remove dependencies on libgcc_eh
192 mpatch glibc-2.3.5-libgcc_eh-1.patch || die
193 }
194
195 glibc_src_compile()
196 {
197 cd ${GLIBC_SRCDIR}/build
198
199 local my_glibc_CFLAGS
200 local my_glibc_CXXFLAGS
201 # glibc-2.6.1 and above needs march CFLAGS: -march=${ARCH} -mtune=generic
202 [[ ${TARGET_ARCH} = i*86 ]] && my_glibc_CFLAGS="${CFLAGS} -march=${TARGET_ARCH}" # only i*86
203 my_glibc_CFLAGS="${my_glibc_CFLAGS} -mtune=generic" # all arches
204
205 # force nptl support (may not detected always)
206 echo "libc_cv_forced_unwind=yes" > config.cache || die
207 echo "libc_cv_c_cleanup=yes" >> config.cache || die
208
209 BUILD_CC="gcc" \
210 CC="${TARGET_CHOST}-gcc" \
211 AR="${TARGET_CHOST}-ar" \
212 RANLIB="${TARGET_CHOST}-ranlib" \
213 CFLAGS="${my_glibc_CFLAGS}" \
214 ../configure \
215 --host=${TARGET_CHOST} \
216 --build=${CROSS_CHOST} \
217 --prefix=${TARGET_DEST} \
218 --disable-profile \
219 --enable-add-ons=nptl --with-tls \
220 --with-__thread \
221 --enable-kernel=2.6.0 \
222 --without-cvs \
223 --with-headers=${TARGET_DEST}/include \
224 --with-binutils=${TARGET_DEST}/bin \
225 --cache-file=config.cache \
226 || die
227
228 make PARALLELMFLAGS="-j2" || die
229 }
230
231 glibc_src_install()
232 {
233 cd ${GLIBC_SRCDIR}/build
234 make install || die
235 }
236
237 # static gcc, only c
238 gcc_static_src_prepare()
239 {
240 gcc_generic_src_prepare
241 }
242
243 gcc_static_src_compile()
244 {
245 cd ${GCC_SRCDIR}/build
246
247 ../configure \
248 --host=${CROSS_CHOST} \
249 --target=${TARGET_CHOST} \
250 --prefix=${TARGET_DEST} \
251 --with-local-prefix=${TARGET_DEST} \
252 --disable-nls \
253 --disable-shared \
254 --disable-threads \
255 --enable-languages=c \
256 --disable-multilib \
257 || die
258
259 mmake all-gcc || die
260 }
261
262 gcc_static_src_install()
263 {
264 cd ${GCC_SRCDIR}/build
265 make install-gcc || die
266 }
267
268 # final gcc, c and c++
269 gcc_src_prepare()
270 {
271 gcc_generic_src_prepare
272 cd ${GCC_SRCDIR}
273
274 # disable -B in configure, so it doesn't pick up the host's header files
275 sed -i '/FLAGS_FOR_TARGET.*\/lib\//s@-B[^ ]*/lib/@@g' configure || die
276 }
277
278 gcc_src_compile()
279 {
280 cd ${GCC_SRCDIR}/build
281
282 ../configure \
283 --host=${CHOST} \
284 --target=${TARGET_CHOST} \
285 --prefix=${TARGET_DEST} \
286 --with-local-prefix=${TARGET_DEST} \
287 --enable-shared \
288 --enable-threads=posix \
289 --enable-__cxa_atexit \
290 --enable-c99 \
291 --enable-long-long \
292 --enable-languages=c,c++ \
293 --disable-nls \
294 --disable-multilib \
295 || die
296 #--with-system-zlib \
297 #--enable-clocale=gnu \
298 #--disable-checking \
299 #--disable-libunwind-exceptions \
300 #--enable-cstdio=stdio \
301
302 make \
303 AS_FOR_TARGET="${TARGET_DEST}/bin/${TARGET_CHOST}-as" \
304 LD_FOR_TARGET="${TARGET_DEST}/bin/${TARGET_CHOST}-ld" \
305 || die
306 }
307
308 gcc_src_install()
309 {
310 cd ${GCC_SRCDIR}/build
311 make install || die
312 }
313
314 gcc_generic_src_prepare()
315 {
316 munpack ${GCC_SRCFILE} || die
317 cd ${GCC_SRCDIR}
318
319 mpatch gcc-${GCC_PVER}-no-fixincludes.patch || die
320 mpatch gcc-${GCC_PVER}-magellan-version.patch || die
321
322 # fixes location of the dynamic linker and not append include
323 # search path to /usr/include
324 # but first set the location to ${TARGET_DEST} and than patch
325 sed "s:/tools/lib/:${TARGET_DEST}/lib/:g" \
326 ${SOURCEDIR}/${PNAME}/gcc-${GCC_PVER}-specs.patch | patch -Np1 || die
327
328 # do not search the /usr directory for libgcc_s.so when cross-compiling
329 mpatch gcc-${GCC_PVER}-cross-search-paths.patch || die
330
331 # suppress installation of libiberty, as we will be
332 # using the one from binutils
333 #sed -i 's/install_to_$(INSTALL_DEST) //' libiberty/Makefile.in || die
334
335 # fix up the startfile spec to search /opt/cross-tools/lib
336 # fixes errors like this on the final cross-gcc compilation
337 # /opt/cross-tools/i686-cross-linux-gnu/bin/ld: crti.o: No such file: No such file or directory
338 # collect2: ld returned 1 exit status
339 echo "
340 #undef STARTFILE_PREFIX_SPEC
341 #define STARTFILE_PREFIX_SPEC \"${TARGET_DEST}/lib/\"" >> ${GCC_SRCDIR}/gcc/config/linux.h || die
342
343 # change header search path to look only in $TARGET_DEST/include
344 # and not the hosts own include pathes
345 sed -i "s@\(^CROSS_SYSTEM_HEADER_DIR =\).*@\1 ${TARGET_DEST}/include@g" \
346 ${GCC_SRCDIR}/gcc/Makefile.in || die
347
348 install -d ${GCC_SRCDIR}/build || die
349 }
350
351 cross_tools_src_prepare()
352 {
353 if [[ -e ${TARGET_DEST} ]] || [[ -L ${TARGET_DEST} ]]
354 then
355 echo
356 echo "Please uninstall any cross-tools packages first."
357 echo "To build the tools I'll create a fake symlink to ${TARGET_DEST},"
358 echo "so this directory must not exist."
359 echo
360 die "${TARGET_DEST} exists."
361 fi
362
363 if [[ ${CHOST} = ${TARGET_CHOST} ]]
364 then
365 echo
366 echo "\$CHOST and \$TARGET_CHOST have the same values."
367 echo " CHOST=${CHOST}"
368 echo " TARGET_CHOST=${TARGET_CHOST}"
369 echo
370 echo "You cannot build a cross-compiler with these settings,"
371 echo "please use the native gcc-\${ARCH} builds."
372 echo
373 die "\$CHOST equal \$TARGET_CHOST."
374 fi
375
376 # create a fake build-root
377 install -d ${BINDIR}/${TARGET_DEST} || die
378 ln -snf ${BINDIR}/${TARGET_DEST} ${TARGET_DEST} || die
379 }
380
381 cross_tools_src_compile()
382 {
383 # setup a proper build environment
384 export PATH=${TARGET_DEST}/bin:${PATH}
385
386 ##############################
387 # first of all build binutils#
388 ##############################
389 binutils_src_prepare
390 binutils_src_compile
391 binutils_src_install
392
393
394 #################################
395 # now install the linux-headers #
396 #################################
397 linux_headers_src_prepare
398 linux_headers_src_compile
399 linux_headers_src_install
400
401
402 ############################
403 # create the glibc-headers #
404 ############################
405 glibc_headers_src_prepare
406 glibc_headers_src_compile
407 glibc_headers_src_install
408
409 # remove GLIBC_SRCDIR
410 rm -rf ${GLIBC_SRCDIR} || die
411
412
413 ##############################
414 # build a static minimal gcc #
415 ##############################
416 gcc_static_src_prepare
417 gcc_static_src_compile
418 gcc_static_src_install
419
420 # remove GCC_SRCDIR
421 rm -rf ${GCC_SRCDIR} || die
422
423
424 ################################
425 # build the final cross-glibc #
426 ################################
427 glibc_src_prepare
428 glibc_src_compile
429 glibc_src_install
430
431
432 ##############################
433 # build the final cross-gcc #
434 ##############################
435 gcc_src_prepare
436 gcc_src_compile
437 gcc_src_install
438 }
439
440 cross_tools_src_install()
441 {
442 # remove unneeded man and info pages to save some space
443 local dir
444 for dir in info man
445 do
446 [ -d ${BINDIR}/${dir} ] && { rm -rf ${BINDIR}/${dir} || die; }
447 done
448
449 # remove ${TARGET_DEST} fake root symlink
450 [[ -L ${TARGET_DEST} ]] && { rm ${TARGET_DEST} || die; }
451
452 # # setup environment
453 # install -d ${BINDIR}/etc/env.d || die
454 #
455 # echo "PATH=${TARGET_DEST}/bin" > ${BINDIR}/etc/env.d/99cross-${TARGET_ARCH} || die
456 # echo "ROOTPATH=${TARGET_DEST}/bin" >> ${BINDIR}/etc/env.d/99cross-${TARGET_ARCH} || die
457 # echo "LDPATH=${TARGET_DEST}/lib" >> ${BINDIR}/etc/env.d/99cross-${TARGET_ARCH} || die
458
459 # # setup cross-tools script
460 # echo "#!/bin/sh" > ${TARGET_DEST}/bin/setup-cross-tools
461 # echo "export TARGET_CHOST=${TARGET_ARCH}-pc-linux-gnu" >> ${TARGET_DEST}/bin/setup-cross-tools
462 # echo "export CROSS_CHOST=${ARCH}-cross-linux-gnu" >> ${TARGET_DEST}/bin/setup-cross-tools
463 # echo "export CC=${TARGET_CHOST}-gcc" >> ${TARGET_DEST}/bin/setup-cross-tools
464 # echo "export CXX=${TARGET_CHOST}-g++" >> ${TARGET_DEST}/bin/setup-cross-tools
465 # echo "export AR=${TARGET_CHOST}-ar" >> ${TARGET_DEST}/bin/setup-cross-tools
466 # echo "export AS=${TARGET_CHOST}-as" >> ${TARGET_DEST}/bin/setup-cross-tools
467 # echo "export RANLIB=${TARGET_CHOST}-ranlib" >> ${TARGET_DEST}/bin/setup-cross-tools
468 # echo "export LD=${TARGET_CHOST}-ld" >> ${TARGET_DEST}/bin/setup-cross-tools
469 # echo "export STRIP=${TARGET_CHOST}-strip" >> ${TARGET_DEST}/bin/setup-cross-tools
470 # echo "export PATH=${TARGET_DEST}/bin:${PATH}" >> ${TARGET_DEST}/bin/setup-cross-tools
471 # chmod 0755 ${TARGET_DEST}/bin/setup-cross-tools || die
472
473 echo "Building of ${PNAME}-toolchain finished ..."
474 }
475
476 export_inherits cross_tools src_prepare src_compile src_install