| 
 | 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