2020-12-19 16:35:20 +01:00
|
|
|
################################################################################
|
|
|
|
# Cargo package infrastructure
|
|
|
|
#
|
|
|
|
# This file implements an infrastructure that eases development of package
|
|
|
|
# .mk files for Cargo packages. It should be used for all packages that use
|
|
|
|
# Cargo as their build system.
|
|
|
|
#
|
|
|
|
# See the Buildroot documentation for details on the usage of this
|
|
|
|
# infrastructure
|
|
|
|
#
|
|
|
|
# In terms of implementation, this Cargo 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 Cargo behaviour. The package can also define some
|
|
|
|
# post operation hooks.
|
|
|
|
#
|
|
|
|
################################################################################
|
|
|
|
|
package/pkg-cargo: move CARGO_HOME into DL_DIR
CARGO_HOME is where Cargo stores its downloaded artefacts. See
https://doc.rust-lang.org/cargo/reference/environment-variables.html:
CARGO_HOME — Cargo maintains a local cache of the registry index and
of git checkouts of crates. By default these are stored under
$HOME/.cargo (%USERPROFILE%\.cargo on Windows), but this variable
overrides the location of this directory. Once a crate is cached it
is not removed by the clean command. For more details refer to the
guide.
We currently make it point to $(HOST_DIR)/share/cargo, but this has a
number of drawbacks:
(1) It is not shared between Buildroot builds. Each Buildroot build
will re-download the crates index, and the crates themselves,
unless of course the final vendored tarball is already there.
(2) With BR2_PER_PACKAGE_DIRECTORIES=y, it is even worse: CARGO_HOME
is not even shared between packages, as $(HOST_DIR)/share/cargo
is per package. So each package in the build that needs vendoring
of Cargo crates will download the crates index and the crates in
its own CARGO_HOME location.
To solve this, this commit moves CARGO_HOME into $(DL_DIR), so that it
is shared between builds and packages.
Even though not the best/most authoritative source,
https://github.com/rust-lang/cargo/issues/6930 indicates that there is
a lock when accessing CARGO_HOME, because a user even complains that
this lock has even become more coarse-grained than it used to be
(which for us is fine, it just means that two Cargo fetch operations
from two different packages will be serialized, not a big deal).
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
Tested-by: Moritz Bitsch <moritz@h6t.eu>
[yann.morin.1998@free.fr: rename directory: s/\.cargo/br-cargo-home/]
Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>
2022-11-03 23:45:38 +01:00
|
|
|
BR_CARGO_HOME = $(DL_DIR)/br-cargo-home
|
2022-11-03 23:45:37 +01:00
|
|
|
|
2022-01-09 10:47:56 +01:00
|
|
|
PKG_COMMON_CARGO_ENV = \
|
2022-11-03 23:45:37 +01:00
|
|
|
CARGO_HOME=$(BR_CARGO_HOME)
|
2022-01-09 10:47:56 +01:00
|
|
|
|
2020-12-19 16:35:20 +01:00
|
|
|
# __CARGO_TEST_CHANNEL_OVERRIDE_DO_NOT_USE_THIS is needed to allow
|
|
|
|
# passing the -Z target-applies-to-host, which is needed together with
|
|
|
|
# CARGO_TARGET_APPLIES_TO_HOST to fix build problems when target
|
|
|
|
# architecture == host architecture.
|
2022-01-09 09:47:32 +01:00
|
|
|
|
|
|
|
# __CARGO_TEST_CHANNEL_OVERRIDE_DO_NOT_USE_THIS="nightly" is to allow
|
|
|
|
# using nighly features on stable releases, i.e features that are not
|
|
|
|
# yet considered stable.
|
|
|
|
#
|
|
|
|
# CARGO_UNSTABLE_TARGET_APPLIES_TO_HOST="true" "enables the nightly
|
|
|
|
# configuration option target-applies-to-host value to be set
|
|
|
|
#
|
|
|
|
# CARGO_TARGET_APPLIES_TO_HOST="false" is actually setting the value
|
|
|
|
# for this feature, which we disable, to make sure builds where target
|
|
|
|
# arch == host arch work correctly
|
2020-12-19 16:35:20 +01:00
|
|
|
PKG_CARGO_ENV = \
|
2022-01-09 10:47:56 +01:00
|
|
|
$(PKG_COMMON_CARGO_ENV) \
|
2020-12-19 16:35:20 +01:00
|
|
|
__CARGO_TEST_CHANNEL_OVERRIDE_DO_NOT_USE_THIS="nightly" \
|
2022-01-09 09:47:32 +01:00
|
|
|
CARGO_UNSTABLE_TARGET_APPLIES_TO_HOST="true" \
|
2022-01-09 10:51:56 +01:00
|
|
|
CARGO_TARGET_APPLIES_TO_HOST="false" \
|
2022-01-09 11:40:04 +01:00
|
|
|
CARGO_BUILD_TARGET="$(RUSTC_TARGET_NAME)" \
|
2022-01-09 18:52:59 +01:00
|
|
|
CARGO_TARGET_$(call UPPERCASE,$(RUSTC_TARGET_NAME))_LINKER=$(notdir $(TARGET_CROSS))gcc
|
2020-12-19 16:35:20 +01:00
|
|
|
|
2022-02-18 00:06:38 +01:00
|
|
|
#
|
|
|
|
# This is a workaround for https://github.com/rust-lang/compiler-builtins/issues/420
|
|
|
|
# and should be removed when fixed upstream
|
|
|
|
#
|
|
|
|
ifeq ($(NORMALIZED_ARCH),arm)
|
|
|
|
PKG_CARGO_ENV += RUSTFLAGS="-Clink-arg=-Wl,--allow-multiple-definition"
|
|
|
|
endif
|
|
|
|
|
2022-01-09 10:47:56 +01:00
|
|
|
HOST_PKG_CARGO_ENV = \
|
|
|
|
$(PKG_COMMON_CARGO_ENV)
|
|
|
|
|
2020-12-19 16:35:20 +01:00
|
|
|
################################################################################
|
|
|
|
# inner-cargo-package -- defines how the configuration, compilation and
|
|
|
|
# installation of a cargo package should be done, implements a few hooks
|
|
|
|
# to tune the build process for cargo specifities 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-cargo-package
|
|
|
|
|
2022-02-10 16:29:26 +01:00
|
|
|
# We need host-rustc to run cargo at download time (for vendoring),
|
|
|
|
# and at build and install time.
|
2020-12-19 16:35:20 +01:00
|
|
|
$(2)_DOWNLOAD_DEPENDENCIES += host-rustc
|
2022-02-10 16:29:26 +01:00
|
|
|
$(2)_DEPENDENCIES += host-rustc
|
2020-12-19 16:35:20 +01:00
|
|
|
|
|
|
|
$(2)_DOWNLOAD_POST_PROCESS = cargo
|
2022-11-03 23:45:37 +01:00
|
|
|
$(2)_DL_ENV += CARGO_HOME=$$(BR_CARGO_HOME)
|
2020-12-19 16:35:20 +01:00
|
|
|
|
2022-02-10 16:29:25 +01:00
|
|
|
# If building in a sub directory, use that to find the Cargo.toml
|
|
|
|
ifneq ($$($(2)_SUBDIR),)
|
|
|
|
$(2)_DL_ENV += BR_CARGO_MANIFEST_PATH=$$($(2)_SUBDIR)/Cargo.toml
|
|
|
|
endif
|
|
|
|
|
2020-12-19 16:35:20 +01:00
|
|
|
# Due to vendoring, it is pretty likely that not all licenses are
|
|
|
|
# listed in <pkg>_LICENSE.
|
|
|
|
$(2)_LICENSE += , vendored dependencies licenses probably not listed
|
|
|
|
|
|
|
|
# Note: in all the steps below, we "cd" into the build directory to
|
|
|
|
# execute the "cargo" tool instead of passing $(@D)/Cargo.toml as the
|
|
|
|
# manifest-path. Indeed while the latter seems to work, it in fact
|
|
|
|
# breaks in subtle ways as the way cargo searches for its
|
|
|
|
# configuration file is based (among other rules) on the current
|
|
|
|
# directory. This means that if cargo is started outside of a package
|
|
|
|
# directory, its configuration file will not be taken into account.
|
|
|
|
#
|
|
|
|
# Also, we pass:
|
|
|
|
# * --offline to prevent cargo from downloading anything: all
|
|
|
|
# dependencies should have been built by the download post
|
|
|
|
# process logic
|
|
|
|
# * --locked to force cargo to use the Cargo.lock file, which ensures
|
|
|
|
# that a fixed set of dependency versions is used
|
|
|
|
|
|
|
|
#
|
|
|
|
# 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
|
2022-02-10 16:29:25 +01:00
|
|
|
cd $$($$(PKG)_SRCDIR) && \
|
2020-12-19 16:35:20 +01:00
|
|
|
$$(TARGET_MAKE_ENV) \
|
|
|
|
$$(TARGET_CONFIGURE_OPTS) \
|
|
|
|
$$(PKG_CARGO_ENV) \
|
|
|
|
$$($(2)_CARGO_ENV) \
|
|
|
|
cargo build \
|
|
|
|
--offline \
|
2022-01-29 10:42:22 +01:00
|
|
|
$$(if $$(BR2_ENABLE_DEBUG),,--release) \
|
2020-12-19 16:35:20 +01:00
|
|
|
--manifest-path Cargo.toml \
|
|
|
|
--locked \
|
|
|
|
$$($(2)_CARGO_BUILD_OPTS)
|
|
|
|
endef
|
|
|
|
else # ifeq ($(4),target)
|
|
|
|
define $(2)_BUILD_CMDS
|
2022-02-10 16:29:25 +01:00
|
|
|
cd $$($$(PKG)_SRCDIR) && \
|
2020-12-19 16:35:20 +01:00
|
|
|
$$(HOST_MAKE_ENV) \
|
|
|
|
RUSTFLAGS="$$(addprefix -C link-args=,$$(HOST_LDFLAGS))" \
|
|
|
|
$$(HOST_CONFIGURE_OPTS) \
|
2022-01-09 10:47:56 +01:00
|
|
|
$$(HOST_PKG_CARGO_ENV) \
|
2020-12-19 16:35:20 +01:00
|
|
|
$$($(2)_CARGO_ENV) \
|
|
|
|
cargo build \
|
|
|
|
--offline \
|
|
|
|
--release \
|
|
|
|
--manifest-path Cargo.toml \
|
|
|
|
--locked \
|
|
|
|
$$($(2)_CARGO_BUILD_OPTS)
|
|
|
|
endef
|
|
|
|
endif # ifeq ($(4),target)
|
|
|
|
endif # ifndef $(2)_BUILD_CMDS
|
|
|
|
|
|
|
|
#
|
|
|
|
# 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
|
2022-02-10 16:29:25 +01:00
|
|
|
cd $$($$(PKG)_SRCDIR) && \
|
2020-12-19 16:35:20 +01:00
|
|
|
$$(TARGET_MAKE_ENV) \
|
|
|
|
$$(TARGET_CONFIGURE_OPTS) \
|
|
|
|
$$(PKG_CARGO_ENV) \
|
|
|
|
$$($(2)_CARGO_ENV) \
|
|
|
|
cargo install \
|
|
|
|
--offline \
|
|
|
|
--root $$(TARGET_DIR)/usr/ \
|
|
|
|
--bins \
|
|
|
|
--path ./ \
|
|
|
|
--force \
|
|
|
|
--locked \
|
|
|
|
-Z target-applies-to-host \
|
|
|
|
$$($(2)_CARGO_INSTALL_OPTS)
|
|
|
|
endef
|
|
|
|
endif
|
|
|
|
|
|
|
|
ifndef $(2)_INSTALL_CMDS
|
|
|
|
define $(2)_INSTALL_CMDS
|
2022-02-10 16:29:25 +01:00
|
|
|
cd $$($$(PKG)_SRCDIR) && \
|
2020-12-19 16:35:20 +01:00
|
|
|
$$(HOST_MAKE_ENV) \
|
|
|
|
RUSTFLAGS="$$(addprefix -C link-args=,$$(HOST_LDFLAGS))" \
|
|
|
|
$$(HOST_CONFIGURE_OPTS) \
|
2022-01-09 10:47:56 +01:00
|
|
|
$$(HOST_PKG_CARGO_ENV) \
|
2020-12-19 16:35:20 +01:00
|
|
|
$$($(2)_CARGO_ENV) \
|
|
|
|
cargo install \
|
|
|
|
--offline \
|
|
|
|
--root $$(HOST_DIR) \
|
|
|
|
--bins \
|
|
|
|
--path ./ \
|
|
|
|
--force \
|
|
|
|
--locked \
|
|
|
|
$$($(2)_CARGO_INSTALL_OPTS)
|
|
|
|
endef
|
|
|
|
endif
|
|
|
|
|
|
|
|
# Call the generic package infrastructure to generate the necessary
|
|
|
|
# make targets
|
|
|
|
$(call inner-generic-package,$(1),$(2),$(3),$(4))
|
|
|
|
|
|
|
|
endef
|
|
|
|
|
|
|
|
################################################################################
|
|
|
|
# cargo-package -- the target generator macro for Cargo packages
|
|
|
|
################################################################################
|
|
|
|
|
|
|
|
cargo-package = $(call inner-cargo-package,$(pkgname),$(call UPPERCASE,$(pkgname)),$(call UPPERCASE,$(pkgname)),target)
|
|
|
|
host-cargo-package = $(call inner-cargo-package,host-$(pkgname),$(call UPPERCASE,host-$(pkgname)),$(call UPPERCASE,$(pkgname)),host)
|