[Buildroot] [External] [PATCH 1/1] pkg-rust: new infrastructure

Juergen Stuber juergen at jstuber.net
Sat Jun 12 19:23:37 UTC 2021


Hi James, all,

On Sat, 12 Jun 2021 12:37:29 -0600
James Hilliard <james.hilliard1 at gmail.com> wrote:
> On Thu, Jun 10, 2021 at 2:11 PM Voss, Samuel M Collins
> <sam.voss at collins.com> wrote:
> >
> > Hi James,
> >  
> > >-----Original Message-----
> > >From: buildroot <buildroot-bounces at busybox.net> On Behalf Of James
> > >Hilliard Sent: Wednesday, June 09, 2021 9:07 PM
> > >To: buildroot at buildroot.org
> > >Cc: James Hilliard <james.hilliard1 at gmail.com>
> > >Subject: [External] [Buildroot] [PATCH 1/1] pkg-rust: new
> > >infrastructure
> > >
> > >Add a new infrastructure to ease the development of packages that
> > >use rust's cargo as their build system.  
> >
> > Thanks for digging into this, great to see more interest in
> > bringing rust into the ecosystem. There has been some previous
> > efforts[1] which are in differing levels of readiness.
> >
> > You may wish to look into these, as I believe there is some overlap
> > between the patch sets. I linked the latest, but there are more to
> > be found too.  
> 
> Yeah, probably best to get those merged first, I'll rebase this after,
> I was mostly testing to see if just using env variables instead of a
> cargo config file was a viable approach for configuring cargo
> properly. From my understanding cargo can generally be configured with
> env variables alone.

The advantage of env variables is that they take precedence over config
files.  I had some trouble with a config file in my home directory that
specified a different linker, and was found before the buildroot one.


Jürgen


> >
> > Sam
> >
> > 1:
> > http://patchwork.ozlabs.org/project/buildroot/list/?series=221371&state=* 
> > >
> > >Signed-off-by: James Hilliard <james.hilliard1 at gmail.com>
> > >---
> > > package/Makefile.in |   1 +
> > > package/pkg-rust.mk | 113
> > > ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 114
> > > insertions(+) create mode 100644 package/pkg-rust.mk
> > >
> > >diff --git a/package/Makefile.in b/package/Makefile.in
> > >index 955e6a8e8c..c4fb6a3cb1 100644
> > >--- a/package/Makefile.in
> > >+++ b/package/Makefile.in
> > >@@ -434,3 +434,4 @@ include package/pkg-waf.mk
> > > include package/pkg-golang.mk
> > > include package/pkg-meson.mk
> > > include package/pkg-qmake.mk
> > >+include package/pkg-rust.mk
> > >diff --git a/package/pkg-rust.mk b/package/pkg-rust.mk
> > >new file mode 100644
> > >index 0000000000..3906fc12b4
> > >--- /dev/null
> > >+++ b/package/pkg-rust.mk
> > >@@ -0,0 +1,113 @@
> > >+################################################################################
> > >+# Rust package infrastructure
> > >+#
> > >+# This file implements an infrastructure that eases development of
> > >+# package .mk files for Rust packages. It should be used for all
> > >+# packages that use Rust as their build system.
> > >+#
> > >+# See the Buildroot documentation for details on the usage of this
> > >+# infrastructure
> > >+#
> > >+# In terms of implementation, this Rust infrastructure requires
> > >+# the .mk file to only specify metadata information about the
> > >+# package: name, version, download URL, etc.
> > >+#
> > >+# We still allow the package .mk file to override what the
> > >different +# steps are doing, if needed. For example, if
> > ><PKG>_BUILD_CMDS is +# already defined, it is used as the list of
> > >commands to perform to +# build the package, instead of the
> > >default Rust behaviour. The +# package can also define some post
> > >operation hooks. +#
> > >+################################################################################
> > >+
> > >+CARGO = $(HOST_DIR)/bin/cargo
> > >+
> > >+RUSTC_TARGET_TRIPLE = $(subst -,_,$(call
> > >UPPERCASE,$(RUSTC_TARGET_NAME))) +
> > >+PKG_RUST_CARGO_ENV = \
> > >+→→→→→→CARGO_HOME=$(HOST_DIR)/share/cargo \
> > >+→→→→→→CARGO_BUILD_TARGET=$(RUSTC_TARGET_NAME) \
> > >+→→→→→→CARGO_INSTALL_ROOT=$(TARGET_DIR)/usr \
> > >+→→→→→→CARGO_TARGET_$(RUSTC_TARGET_TRIPLE)_LINKER=$(notdir
> > >$(TARGET_CROSS))gcc +
> > >+HOST_PKG_RUST_CARGO_ENV = \
> > >+→→→→→→CARGO_HOME=$(HOST_DIR)/share/cargo \
> > >+→→→→→→CARGO_INSTALL_ROOT=$(HOST_DIR) \
> > >+→→→→→→RUSTFLAGS="$(addprefix -C link-args=,$(HOST_LDFLAGS))"
> > >+
> > >+ifeq ($(BR2_ENABLE_RUNTIME_DEBUG),y)
> > >+PKG_RUST_CARGO_OPTS = --debug
> > >+else
> > >+PKG_RUST_CARGO_OPTS = --release
> > >+endif
> > >+
> > >+################################################################################
> > >+# inner-rust-package -- defines how the configuration,
> > >compilation and +# installation of a Rust package should be done,
> > >implements a few hooks to +# tune the build process and calls the
> > >generic package infrastructure to +# generate the necessary make
> > >targets +#
> > >+#  argument 1 is the lowercase package name
> > >+#  argument 2 is the uppercase package name, including a HOST_
> > >prefix +#             for host packages
> > >+#  argument 3 is the uppercase package name, without the HOST_
> > >prefix +#             for host packages
> > >+#  argument 4 is the type (target or host)
> > >+################################################################################
> > >+
> > >+define inner-rust-package
> > >+
> > >+$(2)_DEPENDENCIES += host-rustc
> > >+
> > >+#
> > >+# Build step. Only define it if not already defined by the
> > >package .mk +# file.
> > >+#
> > >+ifndef $(2)_BUILD_CMDS
> > >+ifeq ($(4),target)
> > >+define $(2)_BUILD_CMDS
> > >+→→→→→→$$(TARGET_MAKE_ENV) $$(PKG_RUST_CARGO_ENV) \
> > >+→→→→→→→→→→→→→→$$(CARGO) build $$(PKG_RUST_CARGO_OPTS)
> > >$$($$(PKG)_RUST_CARGO_OPTS)
> > >--manifest-path=$$($$(PKG)_BUILDDIR)/Cargo.toml +endef +else
> > >+define $(2)_BUILD_CMDS
> > >+→→→→→→$$(HOST_MAKE_ENV) $$(HOST_PKG_RUST_CARGO_ENV) \
> > >+→→→→→→→→→→→→→→$$(CARGO) build $$(PKG_RUST_CARGO_OPTS)
> > >$$($$(PKG)_RUST_CARGO_OPTS)
> > >--manifest-path=$$($$(PKG)_BUILDDIR)/Cargo.toml +endef +endif
> > >+endif
> > >+
> > >+#
> > >+# Host installation step. Only define it if not already defined
> > >by the +# package .mk file.
> > >+#
> > >+ifndef $(2)_INSTALL_CMDS
> > >+define $(2)_INSTALL_CMDS
> > >+→→→→→→$$(HOST_MAKE_ENV) $$(HOST_PKG_RUST_CARGO_ENV) \
> > >+→→→→→→→→→→→→→→$$(CARGO) install --offline --frozen --path
> > >$$($$(PKG)_BUILDDIR) +endef
> > >+endif
> > >+
> > >+#
> > >+# Target installation step. Only define it if not already defined
> > >by +# the package .mk file.
> > >+#
> > >+ifndef $(2)_INSTALL_TARGET_CMDS
> > >+define $(2)_INSTALL_TARGET_CMDS
> > >+→→→→→→$$(TARGET_MAKE_ENV) $$(PKG_RUST_CARGO_ENV) \
> > >+→→→→→→→→→→→→→→$$(CARGO) install --offline --frozen --path
> > >$$($$(PKG)_BUILDDIR) +endef
> > >+endif
> > >+
> > >+# Call the generic package infrastructure to generate the
> > >necessary +# make targets
> > >+$(call inner-generic-package,$(1),$(2),$(3),$(4))
> > >+
> > >+endef
> > >+
> > >+################################################################################
> > >+# rust-package -- the target generator macro for Rust packages
> > >+################################################################################
> > >+
> > >+rust-package = $(call inner-rust-package,$(pkgname),$(call
> > >UPPERCASE,$(pkgname)),$(call UPPERCASE,$(pkgname)),target)
> > >+host-rust-package = $(call
> > >inner-rust-package,host-$(pkgname),$(call
> > >UPPERCASE,host-$(pkgname)),$(call UPPERCASE,$(pkgname)),host) --
> > >2.25.1

-- 
Jürgen Stuber <juergen at jstuber.net>
http://www.jstuber.net/
Tel: +49-208-304 20 50
Mobil: +49-178-39 39 628
1B78 A579 E159 2A85 67BB  1314 C083 224B 0F9C DA21



More information about the buildroot mailing list