Date: Tue, 27 May 2008 00:57:40 +0100 From: Bruce M Simpson <bms@incunabulum.net> To: freebsd-embedded@freebsd.org Subject: Cross-compiling for embedded FreeBSD using NetBSD pkgsrc Message-ID: <483B4E74.1090902@incunabulum.net>
next in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format. --------------070001020009020107060601 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Just for a laugh, I decided to try cross-compiling some binaries using NetBSD pkgsrc, for a FreeBSD target. I found I needed to do the following: 1. Build a FreeBSD cross-compiler for the target (in this example, arm): cd /usr/src && make TARGET_ARCH=arm toolchain 2. Grab a pkgsrc-current.tar.gz tarball from a NetBSD FTP mirror [1] 3. Untar it, cd into bootstrap, and as per instructions [2] mkdir -p /var/db/pkgsrc && run ./bootstrap --pkgdb=/var/db/pkgsrc 4. Replace pkgsrc/mk/tools/tools.FreeBSD.mk with the attached file. 4. Add the following to /usr/pkg/etc/mk.conf: %%% USE_CROSS_COMPILE= yes .if defined(USE_CROSS_COMPILE) && !empty(USE_CROSS_COMPILE:M[yY][eE][sS]) USE_DESTDIR= full DEPENDS_TARGET= package-install TOOLDIR= /usr/obj/arm/usr/src/tmp CROSS_DESTDIR= ${TOOLDIR} TARGET_ARCH= arm MACHINE_PLATFORM= FreeBSD-7.0-arm MACHINE_GNU_PLATFORM= arm-unknown-freebsd PKGSRC_COMPILER= gcc USE_PKGSRC_GCC= no USE_NATIVE_GCC= yes .endif # end cross-compilation settings %%% I don't have an arm box to test with at the moment. I found I had to force pkgsrc not to try building its own cross-compiler. This seemed to work for me for a few simple targets - vis, osh -- although stuff with several dependencies didn't build, and not all targets install under the CROSS_DESTDIR correctly. libtool in particular! CROSS_DESTDIR *has* to point to the staging area containing the base system headers/libraries. I didn't do a full world build, so I pointed at the intermediate stage built by "make toolchain" in src. I guess this could be further refined to be attempted on a system image during a NanoBSD session. So it's not completely foolproof, but it's a start. cheers BMS --------------070001020009020107060601 Content-Type: text/plain; name="tools.FreeBSD.mk" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="tools.FreeBSD.mk" # $NetBSD: tools.FreeBSD.mk,v 1.31 2007/08/20 11:00:33 joerg Exp $ # # System-supplied tools for the FreeBSD operating system. TOOLS_PLATFORM.[?= [ # shell builtin TOOLS_PLATFORM.awk?= /usr/bin/awk TOOLS_PLATFORM.basename?= /usr/bin/basename TOOLS_PLATFORM.byacc?= /usr/bin/yacc TOOLS_PLATFORM.bzcat?= /usr/bin/bzcat TOOLS_PLATFORM.bzip2?= /usr/bin/bzip2 TOOLS_PLATFORM.cat?= /bin/cat TOOLS_PLATFORM.chgrp?= /usr/bin/chgrp TOOLS_PLATFORM.chmod?= /bin/chmod TOOLS_PLATFORM.chown?= /usr/sbin/chown TOOLS_PLATFORM.cmp?= /usr/bin/cmp TOOLS_PLATFORM.cp?= /bin/cp TOOLS_PLATFORM.csh?= /bin/csh TOOLS_PLATFORM.cut?= /usr/bin/cut TOOLS_PLATFORM.date?= /bin/date TOOLS_PLATFORM.diff?= /usr/bin/diff TOOLS_PLATFORM.diff3?= /usr/bin/diff3 TOOLS_PLATFORM.dirname?= /usr/bin/dirname TOOLS_PLATFORM.echo?= echo # shell builtin TOOLS_PLATFORM.egrep?= /usr/bin/egrep TOOLS_PLATFORM.env?= /usr/bin/env TOOLS_PLATFORM.expr?= /bin/expr TOOLS_PLATFORM.false?= false # shell builtin TOOLS_PLATFORM.fgrep?= /usr/bin/fgrep TOOLS_PLATFORM.file?= /usr/bin/file TOOLS_PLATFORM.find?= /usr/bin/find TOOLS_PLATFORM.flex?= /usr/bin/lex TOOLS_PLATFORM.grep?= /usr/bin/grep TOOLS_PLATFORM.groff?= /usr/bin/groff TOOLS_PLATFORM.gunzip?= /usr/bin/gunzip -f TOOLS_PLATFORM.gzcat?= /usr/bin/gzcat TOOLS_PLATFORM.gzip?= /usr/bin/gzip -nf ${GZIP} TOOLS_PLATFORM.head?= /usr/bin/head TOOLS_PLATFORM.hostname?= /bin/hostname TOOLS_PLATFORM.id?= /usr/bin/id TOOLS_PLATFORM.ident?= /usr/bin/ident .if empty(USE_CROSS_COMPILE:M[yY][eE][sS]) TOOLS_PLATFORM.install?= /usr/bin/install .else TOOLS_PLATFORM.install?= ${TOOLDIR}/legacy/usr/bin/install .endif .if exists(/usr/bin/install-info) TOOLS_PLATFORM.install-info?= /usr/bin/install-info .endif TOOLS_PLATFORM.ldconfig?= /sbin/ldconfig TOOLS_PLATFORM.lex?= /usr/bin/lex TOOLS_PLATFORM.ln?= /bin/ln TOOLS_PLATFORM.ls?= /bin/ls TOOLS_PLATFORM.m4?= /usr/bin/m4 TOOLS_PLATFORM.mail?= /usr/bin/mail .if exists(/usr/bin/makeinfo) TOOLS_PLATFORM.makeinfo?= /usr/bin/makeinfo .endif TOOLS_PLATFORM.mkdir?= /bin/mkdir -p TOOLS_PLATFORM.mktemp?= /usr/bin/mktemp TOOLS_PLATFORM.mtree?= /usr/sbin/mtree TOOLS_PLATFORM.mv?= /bin/mv TOOLS_PLATFORM.nice?= /usr/bin/nice TOOLS_PLATFORM.nroff?= /usr/bin/nroff TOOLS_PLATFORM.openssl?= /usr/bin/openssl TOOLS_PLATFORM.patch?= /usr/bin/patch TOOLS_PLATFORM.pax?= /bin/pax TOOLS_PLATFORM.printf?= /usr/bin/printf TOOLS_PLATFORM.pwd?= /bin/pwd .if empty(USE_CROSS_COMPILE:M[yY][eE][sS]) TOOLS_PLATFORM.readelf?= /usr/bin/readelf .else TOOLS_PLATFORM.readelf?= ${TOOLDIR}/usr/bin/readelf .endif TOOLS_PLATFORM.rm?= /bin/rm TOOLS_PLATFORM.rmdir?= /bin/rmdir TOOLS_PLATFORM.sdiff?= /usr/bin/sdiff TOOLS_PLATFORM.sed?= /usr/bin/sed TOOLS_PLATFORM.sh?= /bin/sh TOOLS_PLATFORM.sleep?= /bin/sleep TOOLS_PLATFORM.soelim?= /usr/bin/soelim TOOLS_PLATFORM.sort?= /usr/bin/sort .if empty(USE_CROSS_COMPILE:M[yY][eE][sS]) TOOLS_PLATFORM.strip?= /usr/bin/strip .else TOOLS_PLATFORM.strip?= ${TOOLDIR}/usr/bin/strip .endif TOOLS_PLATFORM.tail?= /usr/bin/tail TOOLS_PLATFORM.tar?= /usr/bin/tar TOOLS_PLATFORM.tbl?= /usr/bin/tbl TOOLS_PLATFORM.tee?= /usr/bin/tee TOOLS_PLATFORM.test?= test # shell builtin TOOLS_PLATFORM.touch?= /usr/bin/touch TOOLS_PLATFORM.tr?= /usr/bin/tr TOOLS_PLATFORM.true?= true # shell builtin TOOLS_PLATFORM.tsort?= /usr/bin/tsort TOOLS_PLATFORM.wc?= /usr/bin/wc TOOLS_PLATFORM.xargs?= /usr/bin/xargs TOOLS_PLATFORM.yacc?= /usr/bin/yacc .if !empty(USE_CROSS_COMPILE:M[yY][eE][sS]) . for _t_ in ar as ld nm objdump ranlib readelf strip TOOLS_PATH.${MACHINE_GNU_PLATFORM}-${_t_}?= ${TOOLDIR}/usr/bin/${_t_} TOOLS_CREATE+= ${MACHINE_GNU_PLATFORM}-${_t_} . endfor TOOLS_PATH.ar?= ${TOOLDIR}/usr/bin/ar TOOLS_CREATE+= ar TOOLS_PATH.ranlib?= ${TOOLDIR}/usr/bin/ranlib TOOLS_CREATE+= ranlib TOOLS_PATH.${MACHINE_GNU_PLATFORM}-gcc?= ${TOOLDIR}/usr/bin/gcc TOOLS_CREATE+= ${MACHINE_GNU_PLATFORM}-gcc NATIVE_CC:= /usr/bin/cc #CC= ${TOOLDIR}/usr/bin/gcc CC= ${TOOLDIR}/bin/${MACHINE_GNU_PLATFORM}-gcc # XXX .endif --------------070001020009020107060601--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?483B4E74.1090902>