|
| 1 | +How to build a rust bootstrap kit using pkgsrc |
| 2 | +---------------------------------------------- |
| 3 | + |
| 4 | +A rust bootstrap kit is simply a pre-compiled binary of rust and |
| 5 | +the rust standard library, and contains the "rust" and "rust-std" |
| 6 | +build results, found in |
| 7 | + |
| 8 | + work/rustc-<version>/build/dist/ |
| 9 | +as |
| 10 | + rust-<version>-<target>.tar.xz |
| 11 | +and |
| 12 | + rust-std-<version>-<target>.tar.xz |
| 13 | + |
| 14 | +These result files are produced when the "dist" build target is |
| 15 | +used, ref. BUILD_TARGET. For a normal native build of the rust |
| 16 | +pkgsrc package, the default BUILD_TARGET is "build", not "dist". |
| 17 | + |
| 18 | +There are two possible ways to produce a bootstrap kit: |
| 19 | + |
| 20 | +1) a native build. This requires minimum preparation, except |
| 21 | + possibly for setting rust.BUILD_TARGET to "dist" via e.g. |
| 22 | + /etc/mk.conf. Note that on NetBSD, using the "BUILD_TARGET" == |
| 23 | + "dist" results in the "rust-cargo-static" option being set, ref. |
| 24 | + options.mk. This is so that the resulting bootstrap kits are |
| 25 | + built with mostly-static linking, reducing the run-time dependencies |
| 26 | + of the bootstrap kits. |
| 27 | + |
| 28 | +2) a cross-build. This requires a bit of preparation: |
| 29 | + |
| 30 | + For each target you want to cross-build rust for, you need |
| 31 | + - the cross toolchain resulting from "build.sh tools" for |
| 32 | + the intended target |
| 33 | + - an OS distribution extracted, including the comp.tgz |
| 34 | + set so that the target's include files can be used |
| 35 | + - for 32-bit ports, the "libatomic" package needs to be |
| 36 | + available. I'm sure there's a clever and long-winded |
| 37 | + use of pkg_install which can be used to effect this; |
| 38 | + I on my hand have always just extracted the tgz file |
| 39 | + and done the minimal cleanup of the "cruft" files |
| 40 | + which are part of the package meta-data. |
| 41 | + - Pick a root directory for the target, e.g. /u/i386. |
| 42 | + Below this directory place the "tools" containing |
| 43 | + the cross-compiler in a "tools" sub-directory. |
| 44 | + Similarly, the extracted OS distribution in the "dest" |
| 45 | + sub-directory. |
| 46 | + |
| 47 | + There are two methods available for doing the cross-compile: |
| 48 | + |
| 49 | + a) Using the "cross.mk" file. For an i386 build against i586, the |
| 50 | + following settings should be active: |
| 51 | + |
| 52 | +CROSS_ROOT= /u/i386 |
| 53 | +MAKE_ENV+= CROSS_ROOT=${CROSS_ROOT} |
| 54 | +GNU_CROSS_TARGET= i486--netbsdelf |
| 55 | +MAKE_ENV+= GNU_CROSS_TARGET=${GNU_CROSS_TARGET} |
| 56 | +TARGET= i586-unknown-netbsd |
| 57 | +SCRIPTS= ${WRKDIR}/scripts |
| 58 | +CONFIGURE_ARGS+= --host=${TARGET} |
| 59 | +CONFIGURE_ARGS+= --target=${TARGET} |
| 60 | +CONFIGURE_ARGS+= --set=target.${TARGET}.cc=${SCRIPTS}/gcc-wrap |
| 61 | +CONFIGURE_ARGS+= --set=target.${TARGET}.cxx=${SCRIPTS}/c++-wrap |
| 62 | +CONFIGURE_ARGS+= --set=target.${TARGET}.linker=${SCRIPTS}/gcc-wrap |
| 63 | +CONFIGURE_ARGS+= --set=target.${TARGET}.ar=${CROSS_ROOT}/tools/bin/${GNU_CROSS_TARGET}-ar |
| 64 | + |
| 65 | + Then doing a "make" will cross-build rust, including the LLVM |
| 66 | + embedded in the rust distribution, ref. the defaulting of that |
| 67 | + option when TARGET is defined ref. options.mk. |
| 68 | + |
| 69 | + Note that when TARGET is set, the default build target for |
| 70 | + the rust makefile becomes "dist", so there's no need to set |
| 71 | + rust.BUILD_TARGET for cross-builds. |
| 72 | + |
| 73 | + b) Using the "do-cross.mk" Makefile. This will attempt to |
| 74 | + cross-build rust for all the targets listed in the SHORT_TARGETS |
| 75 | + variable in that file. Overriding the root directories for |
| 76 | + the various targets can be done by making your own "local-roots.mk" |
| 77 | + file, ref. "do-cross.mk". |
| 78 | + |
| 79 | + This will create a "dist" subdirectory in the rust pkgsrc |
| 80 | + directory, and the bootstrap kits for each architecture, plus |
| 81 | + the library source kit will be placed in this directory. |
| 82 | + |
| 83 | +The bootstrap kits can then be placed in /usr/pkgsrc/distfiles, and |
| 84 | +be used by the "next" rust version, where you can use "make makesum" |
| 85 | +to compute the updated checksums for the bootstrap kits. |
0 commit comments