File:  [cvs.NetBSD.org] / pkgsrc / doc / HOWTO-use-crosscompile
Revision 1.18: download - view: text, annotated - select for diffs
Thu Jun 6 02:38:02 2024 UTC (4 months, 3 weeks ago) by riastradh
Branches: MAIN
CVS tags: pkgsrc-2024Q3-base, pkgsrc-2024Q3, pkgsrc-2024Q2-base, pkgsrc-2024Q2, HEAD
Diff to: previous 1.17: preferred, colored
Changes since revision 1.17: +2 -17 lines
doc/HOWTO-use-crosscompile: Nix obsolete note about ABI.

CROSS_ABI has obsoleted it.  Should maybe document that too but it's
such a niche thing that I didn't feel inclined to work out all the
details of its semantics and intended use-cases.

Cross-compilation in pkgsrc (user's guide)              -*- outline -*-
Taylor R. Campbell <riastradh@NetBSD.org>

$NetBSD: HOWTO-use-crosscompile,v 1.18 2024/06/06 02:38:02 riastradh Exp $

The following steps enable you to build binary packages for a machine
architecture other than the one you are building on.  For example, you
might use them on your beefy umpteen-core amd64-based build machine
(the `native' machine) to build packages for your feeble powerpc-based
network appliance (the `target' machine).

These instructions assume you use the conventional privileged paths:
/usr/src for the NetBSD source tree, /usr/obj for the NetBSD object
tree, and /usr/pkgsrc for the pkgsrc tree.  If you want to do it
unprivileged, see `* Unprivileged notes' below.

XXX This currently works only for NetBSD.

* Build NetBSD tools and distribution for the target system

Use build.sh to build NetBSD tools and a distribution, and remember
what the destdir and tooldir are -- you'll need them for pkgsrc's
mk.conf.

   $ cd /usr/src
   $ ./build.sh -m evbppc tools
   $ ./build.sh -m evbppc distribution

By default, the destdir will be /usr/obj/destdir.evbppc, and the
tooldir will be (say) /usr/obj/tooldir.NetBSD-6.1-amd64 if you're
running NetBSD 6.1 on amd64.

* Set up mk.conf

In addition to whatever else you want in your mk.conf for pkgsrc, add:

   # Cross-compile by default.  (Alternatively, instead of having this
   # setting in mk.conf, you can cross-build packages by just running
   # `make package USE_CROSS_COMPILE=yes'.)
   #
   # Note: This must use `?=' so it doesn't override pkgsrc's internal
   # USE_CROSS_COMPILE=no when recursively building toolchain packages
   # that have to run on the host.
   USE_CROSS_COMPILE?=  yes

   # Point pkgsrc at the NetBSD tooldir and destdir for cross builds.
   TOOLDIR=             /usr/obj/tooldir.NetBSD-6.1-amd64
   CROSS_DESTDIR=       /usr/obj/destdir.evbppc

   # Specify the machine architecture of target packages.
   CROSS_MACHINE_ARCH=  powerpc

   # Specify the OS of target packages.
   CROSS_OPSYS=		NetBSD
   CROSS_OS_VERSION=	10.0
   CROSS_OPSYS_VERSION=	100000
   CROSS_LOWER_OPSYS=   netbsd
   CROSS_LOWER_OPSYS_VERSUFFIX= # empty
   CROSS_LOWER_OS_VARIANT=      # empty
   CROSS_LOWER_VARIANT_VERSION= # empty
   CROSS_LOWER_VENDOR=          # empty
   CROSS_OBJECT_FMT=	ELF

Optionally, you can set CROSS_LOCALBASE, CROSS_SYSCONFBASE, and
CROSS_VARBASE for cross-compiled packages separately from LOCALBASE,
SYSCONFBASE, and VARBASE for natively compiled packages.  For example,
you can use an unprivileged pkgsrc build into /home/user/cross/pkg that
will create packages which install to /opt/pkg:

   LOCALBASE=		/home/user/cross/pkg
   CROSS_LOCALBASE=	/opt/pkg

By default, pkgsrc will assume:

   CROSS_LOCALBASE=	/usr/pkg
   CROSS_SYSCONFBASE=	/etc
   CROSS_VARBASE=	/var

That is, no matter what you set LOCALBASE, SYSCONFBASE, and VARBASE to
in mk.conf for native packages, like directores under /home/user, by
default cross-compiled packages will see LOCALBASE=/usr/pkg,
SYSCONFBASE=/etc, and VARBASE=/var.

** Bootstrapped pkgsrc

You can bootstrap pkgsrc or not; it shouldn't make a difference for
cross-compilation.  If you do, replace `make' by `bmake' below:

* Make some packages

Now packages you build normally will be cross-compiled for the target:

   $ cd /usr/pkgsrc/net/isc-dhcpd4 && make package

You can find the shiny new powerpc package at

   /usr/pkgsrc/packages.powerpc/

Any packages needed on natively to build the target packages will be
built and installed automatically, but if for some reason you want to
build a native package, you can run

   $ cd /usr/pkgsrc/net/isc-dhcpd4 && make package USE_CROSS_COMPILE=no

* Unprivileged notes

I do all this stuff unprivileged in directories under my home
directory so that it's easy for me to nuke build products without
messing with the package installations I use for development.

   NetBSD srcdir:       ~/netbsd/current/src
   NetBSD objdir:       ~/netbsd/current/obj.evbppc
   NetBSD tooldir:      ~/netbsd/current/obj.evbppc/tooldir.NetBSD-6.1-amd64
   NetBSD destdir:      ~/netbsd/current/obj.evbppc/destdir.evbppc
   pkgsrc:              ~/pkgsrc/current/pkgsrc
   pkgsrc LOCALBASE:    ~/pkgsrc/current/pkg

(~/netbsd/current/src and ~/pkgsrc/current/pkgsrc are actually
read-only null mounts of ~/netbsd/current/src-cvs and
~/pkgsrc/current/pkgsrc-cvs, respectively.)

To build NetBSD, I run:

   $ cd ~/netbsd/current/src
   $ ./build.sh -O ../obj.evbppc -U -u -m evbppc -j12 tools
   $ ./build.sh -O ../obj.evbppc -U -u -m evbppc -j12 distribution

My mk.conf additionally has UNPRIVILEGED=yes, and I bootstrap pkgsrc
with

   $ cd ~/pkgsrc/current/pkgsrc/bootstrap
   $ ./bootstrap \
        --gzip-binary-kit ~/pkgsrc/current/bootstrap/20130422.tgz \
        --mk-fragment ~/pkgsrc/current/bootstrap/20130422.mk \
        --prefix ~/pkgsrc/current/pkg \
        --unprivileged \
        --workdir /tmp/bootwork

and various other crud to customize the build and package options.
This requires putting ~/pkgsrc/current/pkg/{bin,sbin} before
/usr/{bin,sbin} in your PATH so that you see bmake and use the right
pkg_* tools.  Send me a note if you have questions about my setup.

* Terminology

This document and the relevant pkgsrc variables call the machine on
which the packages are built the `native' machine, and the machine on
which the packages are to be run the `target' machine.

This is different from the GNU build system, which considers three
different machines for so-called Canadian cross-builds, which pkgsrc
does not support:

   The `build' machine is the machine on which the software is built.
   The `host' machine is the machine on which the software will run.
   The `target' machine is the machine that the software is being
     configured to operate on, such as a cross-compiler or cross-linker.

These correspond to the pkgsrc nomenclature as follows:

- Native packages configured for native compilation:

        GNU     pkgsrc
        ---     ------
        build   native
        host    native
        target  native

- Native packages configured for cross-compilation:

        GNU     pkgsrc
        ---     ------
        build   native
        host    native
        target  target

- Target packages:

        GNU     pkgsrc
        ---     ------
        build   native
        host    target
        target  target

CVSweb <webmaster@jp.NetBSD.org>