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.
|
|
|
|
#
|
package/pkg-cargo: ensure host/target rustflags are properly split
In Cargo, it is quite typical for "build scripts" to be written in Rust
and therefore they need to be compiled as part of the overall build. In
cross-compilation, that means a mixed host and target build.
Unfortunately, by default Cargo makes no distinction between the
RUSTFLAGS used for the host and the target. There is, however, an
unstable feature to make this distinction [1][2].
We already have CARGO_TARGET_APPLIES_TO_HOST="false". This makes sure
that any configuration that we make for the target doesn't automatically
apply to the host as well. However, this only applies for per-target
configuration, for example the setting of "cc" in the config.toml
generated by package/rust/rust.mk. Flags that are passed with RUSTFLAGS
still apply to both host and target. Therefore, we need to use the
CARGO_TARGET_<tuple>_RUSTFLAGS environment variable instead of plain
RUSTFLAGS.
This, however, doesn't allow us to specify flags that apply only to the
host. We could use CARGO_TARGET_<hosttuple>_RUSTFLAGS for that, but that
doesn't work in case the host and target tuple are the same. For this,
we need another unstable feature, enabled with
CARGO_UNSTABLE_HOST_CONFIG="true". With this enabled, we can specify
flags that apply only for the host build using CARGO_HOST_RUSTFLAGS.
Currently, we don't have any such flags, but we really should: we should
pass the proper link flags to point to $(HOST_DIR)/lib. Therefore, add
CARGO_HOST_RUSTFLAGS doing exactly that.
[1] https://doc.rust-lang.org/nightly/cargo/reference/unstable.html#host-config
[2] https://github.com/rust-lang/cargo/pull/10395
Signed-off-by: James Hilliard <james.hilliard1@gmail.com>
Signed-off-by: Arnout Vandecappelle <arnout@mind.be>
2023-04-10 10:32:52 +02:00
|
|
|
# CARGO_UNSTABLE_HOST_CONFIG="true" enables the host specific
|
|
|
|
# configuration feature
|
|
|
|
#
|
|
|
|
# CARGO_UNSTABLE_TARGET_APPLIES_TO_HOST="true" enables the nightly
|
2022-01-09 09:47:32 +01:00
|
|
|
# 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" \
|
package/pkg-cargo: ensure host/target rustflags are properly split
In Cargo, it is quite typical for "build scripts" to be written in Rust
and therefore they need to be compiled as part of the overall build. In
cross-compilation, that means a mixed host and target build.
Unfortunately, by default Cargo makes no distinction between the
RUSTFLAGS used for the host and the target. There is, however, an
unstable feature to make this distinction [1][2].
We already have CARGO_TARGET_APPLIES_TO_HOST="false". This makes sure
that any configuration that we make for the target doesn't automatically
apply to the host as well. However, this only applies for per-target
configuration, for example the setting of "cc" in the config.toml
generated by package/rust/rust.mk. Flags that are passed with RUSTFLAGS
still apply to both host and target. Therefore, we need to use the
CARGO_TARGET_<tuple>_RUSTFLAGS environment variable instead of plain
RUSTFLAGS.
This, however, doesn't allow us to specify flags that apply only to the
host. We could use CARGO_TARGET_<hosttuple>_RUSTFLAGS for that, but that
doesn't work in case the host and target tuple are the same. For this,
we need another unstable feature, enabled with
CARGO_UNSTABLE_HOST_CONFIG="true". With this enabled, we can specify
flags that apply only for the host build using CARGO_HOST_RUSTFLAGS.
Currently, we don't have any such flags, but we really should: we should
pass the proper link flags to point to $(HOST_DIR)/lib. Therefore, add
CARGO_HOST_RUSTFLAGS doing exactly that.
[1] https://doc.rust-lang.org/nightly/cargo/reference/unstable.html#host-config
[2] https://github.com/rust-lang/cargo/pull/10395
Signed-off-by: James Hilliard <james.hilliard1@gmail.com>
Signed-off-by: Arnout Vandecappelle <arnout@mind.be>
2023-04-10 10:32:52 +02:00
|
|
|
CARGO_UNSTABLE_HOST_CONFIG="true" \
|
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)" \
|
package/pkg-cargo: ensure host/target rustflags are properly split
In Cargo, it is quite typical for "build scripts" to be written in Rust
and therefore they need to be compiled as part of the overall build. In
cross-compilation, that means a mixed host and target build.
Unfortunately, by default Cargo makes no distinction between the
RUSTFLAGS used for the host and the target. There is, however, an
unstable feature to make this distinction [1][2].
We already have CARGO_TARGET_APPLIES_TO_HOST="false". This makes sure
that any configuration that we make for the target doesn't automatically
apply to the host as well. However, this only applies for per-target
configuration, for example the setting of "cc" in the config.toml
generated by package/rust/rust.mk. Flags that are passed with RUSTFLAGS
still apply to both host and target. Therefore, we need to use the
CARGO_TARGET_<tuple>_RUSTFLAGS environment variable instead of plain
RUSTFLAGS.
This, however, doesn't allow us to specify flags that apply only to the
host. We could use CARGO_TARGET_<hosttuple>_RUSTFLAGS for that, but that
doesn't work in case the host and target tuple are the same. For this,
we need another unstable feature, enabled with
CARGO_UNSTABLE_HOST_CONFIG="true". With this enabled, we can specify
flags that apply only for the host build using CARGO_HOST_RUSTFLAGS.
Currently, we don't have any such flags, but we really should: we should
pass the proper link flags to point to $(HOST_DIR)/lib. Therefore, add
CARGO_HOST_RUSTFLAGS doing exactly that.
[1] https://doc.rust-lang.org/nightly/cargo/reference/unstable.html#host-config
[2] https://github.com/rust-lang/cargo/pull/10395
Signed-off-by: James Hilliard <james.hilliard1@gmail.com>
Signed-off-by: Arnout Vandecappelle <arnout@mind.be>
2023-04-10 10:32:52 +02:00
|
|
|
CARGO_HOST_RUSTFLAGS="$(addprefix -C link-args=,$(HOST_LDFLAGS))" \
|
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)
|
package/pkg-cargo: ensure host/target rustflags are properly split
In Cargo, it is quite typical for "build scripts" to be written in Rust
and therefore they need to be compiled as part of the overall build. In
cross-compilation, that means a mixed host and target build.
Unfortunately, by default Cargo makes no distinction between the
RUSTFLAGS used for the host and the target. There is, however, an
unstable feature to make this distinction [1][2].
We already have CARGO_TARGET_APPLIES_TO_HOST="false". This makes sure
that any configuration that we make for the target doesn't automatically
apply to the host as well. However, this only applies for per-target
configuration, for example the setting of "cc" in the config.toml
generated by package/rust/rust.mk. Flags that are passed with RUSTFLAGS
still apply to both host and target. Therefore, we need to use the
CARGO_TARGET_<tuple>_RUSTFLAGS environment variable instead of plain
RUSTFLAGS.
This, however, doesn't allow us to specify flags that apply only to the
host. We could use CARGO_TARGET_<hosttuple>_RUSTFLAGS for that, but that
doesn't work in case the host and target tuple are the same. For this,
we need another unstable feature, enabled with
CARGO_UNSTABLE_HOST_CONFIG="true". With this enabled, we can specify
flags that apply only for the host build using CARGO_HOST_RUSTFLAGS.
Currently, we don't have any such flags, but we really should: we should
pass the proper link flags to point to $(HOST_DIR)/lib. Therefore, add
CARGO_HOST_RUSTFLAGS doing exactly that.
[1] https://doc.rust-lang.org/nightly/cargo/reference/unstable.html#host-config
[2] https://github.com/rust-lang/cargo/pull/10395
Signed-off-by: James Hilliard <james.hilliard1@gmail.com>
Signed-off-by: Arnout Vandecappelle <arnout@mind.be>
2023-04-10 10:32:52 +02:00
|
|
|
PKG_CARGO_ENV += \
|
|
|
|
CARGO_TARGET_$(call UPPERCASE,$(RUSTC_TARGET_NAME))_RUSTFLAGS="-Clink-arg=-Wl,--allow-multiple-definition"
|
2022-02-18 00:06:38 +01:00
|
|
|
endif
|
|
|
|
|
2022-01-09 10:47:56 +01:00
|
|
|
HOST_PKG_CARGO_ENV = \
|
2022-07-24 23:47:43 +02:00
|
|
|
$(PKG_COMMON_CARGO_ENV) \
|
|
|
|
RUSTFLAGS="$(addprefix -C link-args=,$(HOST_LDFLAGS))"
|
2022-01-09 10:47:56 +01:00
|
|
|
|
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
|
|
|
|
|
package/pkg-cargo: handle licensing terms for host-only packages
The licensing terms are inherited from the target variant to the host
variant: when the host _LICENSE is empty, then the value of the target
_LICENSE is used.
However, for the cargo infra, we want to append a little blurb about
vendored depndencies. If the package is a host-only, then it would
inherit the target _LICENSE, i.e. the variable without the leading
HOST_. If that is defined, this is inherited in the generic-package part
of the infra, but in the cargo infra, we saw an empty variable, and so
we would not add the vendoring blurb.
We can't move the condition appending that blurb, after we called into
the generic-package infra, otherwise in that case, we'd have the
opposite issue for packages that are both target and host packages,
where the blurb would be duplicated for host packages...
Instead, we workaround the issue by duplicating the heuristic to inherit
the target value, from the generic- into the cargo-package infra.
Signed-off-by: Yann E. MORIN <yann.morin@orange.com>
Signed-off-by: Arnout Vandecappelle <arnout@mind.be>
2023-11-02 17:09:21 +01:00
|
|
|
# Because we append vendored info, we can't rely on the values being empty
|
|
|
|
# once we eventually get into the generic-package infra. So, we duplicate
|
|
|
|
# the heuristics here
|
|
|
|
ifndef $(2)_LICENSE
|
|
|
|
ifdef $(3)_LICENSE
|
|
|
|
$(2)_LICENSE = $$($(3)_LICENSE)
|
|
|
|
endif
|
|
|
|
endif
|
|
|
|
|
2020-12-19 16:35:20 +01:00
|
|
|
# Due to vendoring, it is pretty likely that not all licenses are
|
2023-11-02 17:09:20 +01:00
|
|
|
# listed in <pkg>_LICENSE. If the license is unset, it is "unknown"
|
|
|
|
# so adding unknowns to some unknown is still some other unkown,
|
|
|
|
# so don't append the blurb in that case.
|
|
|
|
ifneq ($$($(2)_LICENSE),)
|
2020-12-19 16:35:20 +01:00
|
|
|
$(2)_LICENSE += , vendored dependencies licenses probably not listed
|
2023-11-02 17:09:20 +01:00
|
|
|
endif
|
2020-12-19 16:35:20 +01:00
|
|
|
|
|
|
|
# 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) \
|
|
|
|
$$(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) \
|
|
|
|
$$(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)
|