Magellan Linux

Annotation of /branches/R11-unstable/include/cross_tools.sminc

Parent Directory Parent Directory | Revision Log Revision Log


Revision 11 - (hide annotations) (download)
Fri Oct 10 19:12:41 2008 UTC (15 years, 7 months ago) by niro
Original Path: trunk/core/include/cross_tools.sminc
File size: 12551 byte(s)
-cross-compile support
1 niro 11 # $Header: /magellan-cvs/smage/include/cross_tools.sminc,v 1.3 2008/10/06 17:55:48 niro Exp $
2 niro 2 # Cross-tools generic functions
3    
4 niro 11 # needed vars:
5     # TARGET_DEST dir
6     : ${TARGET_DEST="/opt/cross-tools"}
7 niro 2
8 niro 11 # 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 niro 2 # 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 niro 11 # 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 niro 2 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 niro 11 AR=ar AS=as \
76 niro 2 ../configure \
77 niro 11 --host=${CROSS_CHOST} \
78 niro 2 --target=${TARGET_CHOST} \
79     --prefix=${TARGET_DEST} \
80     --with-lib-path=${TARGET_DEST}/lib \
81     --disable-nls \
82     --enable-shared \
83 niro 11 --disable-multilib \
84 niro 2 || 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 niro 11 }
104    
105     linux_headers_src_compile()
106     {
107 niro 2 cd ${LINUX_HEADERS_SRCDIR}
108 niro 11 make mrproper || die
109     make ARCH=${ARCH/i*86/x86} headers_check || die
110 niro 2 }
111    
112     linux_headers_src_install()
113     {
114     cd ${LINUX_HEADERS_SRCDIR}
115 niro 11 make ARCH=${ARCH/i*86/x86} INSTALL_HDR_PATH=${BINDIR}/${TARGET_DEST} headers_install || die
116 niro 2 }
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 niro 11 # fix segfault of localdef on arches beside x86-32
177     mpatch glibc-2.3.5-localedef_segfault-1.patch || die
178    
179 niro 2 # 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 niro 11 cd ${GLIBC_SRCDIR}
190    
191     # remove dependencies on libgcc_eh
192     mpatch glibc-2.3.5-libgcc_eh-1.patch || die
193 niro 2 }
194    
195     glibc_src_compile()
196     {
197     cd ${GLIBC_SRCDIR}/build
198    
199 niro 11 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 niro 2 # 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 niro 11 CC="${TARGET_CHOST}-gcc" \
211 niro 2 AR="${TARGET_CHOST}-ar" \
212     RANLIB="${TARGET_CHOST}-ranlib" \
213 niro 11 CFLAGS="${my_glibc_CFLAGS}" \
214 niro 2 ../configure \
215     --host=${TARGET_CHOST} \
216 niro 11 --build=${CROSS_CHOST} \
217 niro 2 --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 niro 11 --with-binutils=${TARGET_DEST}/bin \
225 niro 2 --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 niro 11 --host=${CROSS_CHOST} \
249 niro 2 --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 niro 11 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 niro 2 # 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 niro 11 linux_headers_src_compile
399 niro 2 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 niro 11 # # 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 niro 2 echo "Building of ${PNAME}-toolchain finished ..."
474     }
475    
476     export_inherits cross_tools src_prepare src_compile src_install