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