Cross-compiling for embedded FreeBSD using NetBSD pkgsrc
Bruce M Simpson
bms at incunabulum.net
Tue May 27 00:15:52 UTC 2008
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
-------------- next part --------------
# $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
More information about the freebsd-embedded
mailing list