Contents of /branches/magellan-next/include/cross_tools.sminc
Parent Directory | 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)
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 |