[Buildroot] [PATCH] rust: Modify Rust to be usable as host-tool only

Samuel Voss sam.voss at gmail.com
Wed Aug 22 19:04:32 UTC 2018


Hey Thomas!

Thanks for putting some time into this, I was afraid it was going to
sit forever because it's kind of a pain to test these kinds of
changes.

On Tue, Aug 21, 2018 at 3:06 PM Thomas Petazzoni
<thomas.petazzoni at bootlin.com> wrote:
>
> Hello Sam,
>
> Thanks for taking the lead on this!
>
> On Mon, 16 Jul 2018 23:29:53 -0500, sam.voss at gmail.com wrote:
> > From: Sam Voss <sam.voss at gmail.com>
> >
> > Modify host-rust virtual package to default to host-rust-bin when no
> > other selection has been made, as long as the host supports rust. This
> > allows host only tools to still use rust when the target architecture
> > does not support it.

[snip]

> >  ifeq ($(BR2_PACKAGE_JEMALLOC),y)
> >  HOST_RUST_DEPENDENCIES += jemalloc
> >  HOST_RUST_JEMALLOC_ENABLED = true
> > diff --git a/package/rustc/Config.in.host b/package/rustc/Config.in.host
> > index 2ae8f89d3f..d7f0efcd3f 100644
> > --- a/package/rustc/Config.in.host
> > +++ b/package/rustc/Config.in.host
> > @@ -14,6 +14,19 @@ config BR2_PACKAGE_HOST_RUSTC_ARCH_SUPPORTS
> >       depends on BR2_TOOLCHAIN_USES_GLIBC
> >       depends on BR2_HOSTARCH = "x86_64" || BR2_HOSTARCH = "x86"
>
> I think you need to remove all the architecture dependencies here:
> host-rust is always available, as long as the host architecture is
> x86-64 or x86.

Ah, defaulting -y instead of depending makes sense. Thanks for
pointing this out.

> The glibc dependency should also be removed, as we don't
> have any way of expressing a "we depend on a host machine with glibc"
> dependency today.
>
> > +config BR2_PACKAGE_HOST_RUSTC_TARGET_ARCH_SUPPORTS
> > +     bool
> > +     default y if BR2_i386
> > +     default y if BR2_x86_64
> > +     default y if BR2_aarch64
> > +     default y if BR2_arm && !BR2_ARM_CPU_ARMV4 && !BR2_ARM_CPU_ARMV5 \
> > +             && !(BR2_ARM_CPU_ARMV7A && BR2_ARM_EABI)
> > +     default y if BR2_powerpc || BR2_powerpc64 || BR2_powerpc64le
> > +     default y if (BR2_mips || BR2_mipsel) && !BR2_MIPS_CPU_MIPS32R6
> > +     default y if (BR2_mips64 || BR2_mips64el) && !BR2_MIPS_CPU_MIPS64R6 \
> > +             && BR2_MIPS_NABI64
>
> The glibc dependency should be re-added here.
>
> > +     depends on BR2_PACKAGE_HOST_RUSTC_ARCH_SUPPORTS
> > +
> >  config BR2_PACKAGE_HOST_RUSTC_ARCH
> >       string
> >       default "armv7"  if BR2_ARM_CPU_ARMV7A
> > @@ -66,9 +79,11 @@ config BR2_PACKAGE_HOST_RUST_BIN
> >
> >  endchoice
> >
> > +endif
> > +
> >  config BR2_PACKAGE_PROVIDES_HOST_RUSTC
> >       string
> >       default "host-rust" if BR2_PACKAGE_HOST_RUST
> > -     default "host-rust-bin" if BR2_PACKAGE_HOST_RUST_BIN
> > -
> > -endif
> > +     # Default to host-rust-bin as long as host arch supports it
> > +     default "host-rust-bin" if !BR2_PACKAGE_HOST_RUST
> > +     depends on BR2_PACKAGE_HOST_RUSTC_ARCH_SUPPORTS
>
> However, even with those changes, if I do:
>
> $ cat > .config <<EOF
> BR2_nios2=y
> BR2_TOOLCHAIN_EXTERNAL=y
> BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y
> BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y
> BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-nios2-full-2018.05.tar.bz2"
> BR2_TOOLCHAIN_EXTERNAL_GCC_6=y
> BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_16=y
> BR2_TOOLCHAIN_EXTERNAL_CUSTOM_GLIBC=y
> # BR2_TOOLCHAIN_EXTERNAL_HAS_SSP is not set
> BR2_TOOLCHAIN_EXTERNAL_CXX=y
> BR2_INIT_NONE=y
> BR2_SYSTEM_BIN_SH_NONE=y
> # BR2_PACKAGE_BUSYBOX is not set
> # BR2_TARGET_ROOTFS_TAR is not set
> EOF
> $ make olddefconfig
> $ make host-rustc
>
> Then I see:
>
> >>> host-rust-bin 1.27.1 Extracting
> xzcat /home/thomas/dl/rust-bin/rustc-1.27.1-x86_64-unknown-linux-gnu.tar.xz | tar --strip-components=1 -C /home/thomas/projets/buildroot/output/build/host-rust-bin-1.27.1   -xf -
> mkdir -p /home/thomas/projets/buildroot/output/build/host-rust-bin-1.27.1/std
> xzcat /home/thomas/dl/rust-bin/rust-std-1.27.1-x86_64-unknown-linux-gnu.tar.xz | tar -C /home/thomas/projets/buildroot/output/build/host-rust-bin-1.27.1/std  -xf -
> cd /home/thomas/projets/buildroot/output/build/host-rust-bin-1.27.1/rustc/lib/rustlib/x86_64-unknown-linux-gnu; ln -sf ../../../../std/rust-std-1.27.1-x86_64-unknown-linux-gnu/rust-std-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib
> >>> host-rust-bin 1.27.1 Patching
> >>> host-rust-bin 1.27.1 Configuring
> >>> host-rust-bin 1.27.1 Building
> >>> host-rust-bin 1.27.1 Installing to host directory
>
> And nothing gets installed in output/host. This is because
> BR2_PACKAGE_HOST_RUST_BIN is false, and therefore rust-bin.mk doesn't
> do much. I am not sure why rust-bin.mk has this condition:
>
> ifeq ($(BR2_PACKAGE_HOST_RUST_BIN),y)
>
> This condition shouldn't be necessary. So it should be removed, and
> instead HOST_RUST_BIN_INSTALL_LIBSTD_TARGET should be put within ifeq
> ($(BR2_PACKAGE_HOST_RUSTC_TARGET_ARCH_SUPPORTS),y).
>
> With this fixed, it does install a Rust compiler and host standard
> library, and I can successfully build and run a host Rust program, even
> if the NIOSII target architecture is not supported by Rust.
>
> Could you fix this issue and send an updated patch ?
>
> Note: I think your current patch is correct that the "host-rustc"
> package should *NOT* appear in menuconfig when the target architecture
> is not supported by Rust. Indeed, in such a case, Rust can only build
> host programs, and it's therefore a mere build dependency of some other
> package.
>
> Please add a comment above the definitions of
> BR2_PACKAGE_HOST_RUSTC_ARCH_SUPPORTS that all packages that use
> host-rustc to build host Rust programs should depend on this option.
> And a comment above BR2_PACKAGE_HOST_RUSTC_TARGET_ARCH_SUPPORTS to say
> that all packages that use host-rustc to build target Rust programs
> should depend on this option.

Added

>
> For the record, the current state of the patch I had after some fixes
> is at http://code.bulix.org/pqww33-400669.

Fantastic, testing now and will send a rev 2 shortly

Thanks!

Sam



More information about the buildroot mailing list