commit:     11e91de6642a4b329566bb21b3a58a083994745f
Author:     James Le Cuirot <chewi <AT> gentoo <DOT> org>
AuthorDate: Wed Jul 24 14:26:34 2024 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Tue Aug  6 08:30:10 2024 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=11e91de6

cargo.eclass: Add cargo_env helper and use it in compile, test, install

Rust packages have a tendency to rebuild parts during test and install.
It is not clear whether this can be addressed. We were therefore relying
on some environment variables set during the compile phase for
cross-compiling to work in the later phases. This is not ideal,
especially if you need to build for multiple targets.

These environment variables can also be useful in other contexts, such
as the build runner in app-misc/anki.

This change moves the setting of these variables into a separate helper
that is now used in all these phases and can be used by ebuilds too. The
variables are now kept local to each invocation of this helper,
preventing leakage.

Signed-off-by: James Le Cuirot <chewi <AT> gentoo.org>
Signed-off-by: Michał Górny <mgorny <AT> gentoo.org>

 eclass/cargo.eclass | 37 +++++++++++++++++++++++--------------
 1 file changed, 23 insertions(+), 14 deletions(-)

diff --git a/eclass/cargo.eclass b/eclass/cargo.eclass
index aab28dbbac16..de4a012354ee 100644
--- a/eclass/cargo.eclass
+++ b/eclass/cargo.eclass
@@ -523,26 +523,23 @@ cargo_src_configure() {
        [[ ${ECARGO_ARGS[@]} ]] && einfo "Configured with: ${ECARGO_ARGS[@]}"
 }
 
-# @FUNCTION: cargo_src_compile
+# @FUNCTION: cargo_env
+# @USAGE: Command with its arguments
 # @DESCRIPTION:
-# Build the package using cargo build.
-cargo_src_compile() {
-       debug-print-function ${FUNCNAME} "$@"
-
-       [[ ${_CARGO_GEN_CONFIG_HAS_RUN} ]] || \
-               die "FATAL: please call cargo_gen_config before using 
${FUNCNAME}"
-
+# Run the given command under an environment needed for performing tasks with
+# Cargo such as building.
+cargo_env() {
        filter-lto
        tc-export AR CC CXX PKG_CONFIG
 
        if tc-is-cross-compiler; then
-               export CARGO_BUILD_TARGET=$(rust_abi)
+               local -x CARGO_BUILD_TARGET=$(rust_abi)
                local TRIPLE=${CARGO_BUILD_TARGET//-/_}
-               export CARGO_TARGET_"${TRIPLE^^}"_LINKER=$(tc-getCC)
+               local -x CARGO_TARGET_"${TRIPLE^^}"_LINKER=$(tc-getCC)
 
                # Set vars for cc-rs crate.
                tc-export_build_env
-               export \
+               local -x \
                        HOST_AR=$(tc-getBUILD_AR)
                        HOST_CC=$(tc-getBUILD_CC)
                        HOST_CXX=$(tc-getBUILD_CXX)
@@ -550,9 +547,21 @@ cargo_src_compile() {
                        HOST_CXXFLAGS=${BUILD_CXXFLAGS}
        fi
 
+       "${@}"
+}
+
+# @FUNCTION: cargo_src_compile
+# @DESCRIPTION:
+# Build the package using cargo build.
+cargo_src_compile() {
+       debug-print-function ${FUNCNAME} "$@"
+
+       [[ ${_CARGO_GEN_CONFIG_HAS_RUN} ]] || \
+               die "FATAL: please call cargo_gen_config before using 
${FUNCNAME}"
+
        set -- cargo build $(usex debug "" --release) ${ECARGO_ARGS[@]} "$@"
        einfo "${@}"
-       "${@}" || die "cargo build failed"
+       cargo_env "${@}" || die "cargo build failed"
 }
 
 # @FUNCTION: cargo_src_install
@@ -573,7 +582,7 @@ cargo_src_install() {
                $(usex debug --debug "") \
                ${ECARGO_ARGS[@]} "$@"
        einfo "${@}"
-       "${@}" || die "cargo install failed"
+       cargo_env "${@}" || die "cargo install failed"
 
        rm -f "${ED}/usr/.crates.toml" || die
        rm -f "${ED}/usr/.crates2.json" || die
@@ -590,7 +599,7 @@ cargo_src_test() {
 
        set -- cargo test $(usex debug "" --release) ${ECARGO_ARGS[@]} "$@"
        einfo "${@}"
-       "${@}" || die "cargo test failed"
+       cargo_env "${@}" || die "cargo test failed"
 }
 
 fi

Reply via email to