Several Cargo-based ebuilds cannot use cargo_src_install for variousHow about giving this function an optional parameter that gets passed to rust_abi so that you can get the build directory for targets other than
reasons and manually install binaries from within the target directory instead. It is common to see `target/$(usex debug debug release)`, but
this lacks the target ABI when cross-compiling, so provide a helper
function.
There are some multilib Cargo-based ebuilds that always set the target
ABI, even when not cross-compiling. It would be simpler to do this in general, so once ebuilds have been updated to use this new helper, I
might change the eclass again accordingly.
Signed-off-by: James Le Cuirot <chewi@gentoo.org>
---
eclass/cargo.eclass | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/eclass/cargo.eclass b/eclass/cargo.eclass
index 40d98211ce7f9..2036fb635d569 100644
--- a/eclass/cargo.eclass
+++ b/eclass/cargo.eclass
@@ -319,6 +319,16 @@ _cargo_gen_git_config() {
fi
}
+# @FUNCTION: cargo_target_dir
+# @DESCRIPTION:
+# Return the directory within target that contains the build, e.g.
+# target/aarch64-unknown-linux-gnu/release.
+cargo_target_dir() {
+ local abi
+ tc-is-cross-compiler && abi=$(rust_abi)
+ echo "${CARGO_TARGET_DIR:-target}${abi+/}${abi}/$(usex debug debug release)"
+}
+
# @FUNCTION: cargo_src_unpack
# @DESCRIPTION:
# Unpacks the package and the cargo registry.
--
2.45.1
On Thu, Jun 13, 2024 at 04:03:44PM +0100, James Le Cuirot wrote:
Several Cargo-based ebuilds cannot use cargo_src_install for various reasons and manually install binaries from within the target directory instead. It is common to see `target/$(usex debug debug release)`, but
this lacks the target ABI when cross-compiling, so provide a helper function.
There are some multilib Cargo-based ebuilds that always set the target
ABI, even when not cross-compiling. It would be simpler to do this in general, so once ebuilds have been updated to use this new helper, I
might change the eclass again accordingly.
Signed-off-by: James Le Cuirot <chewi@gentoo.org>
---
eclass/cargo.eclass | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/eclass/cargo.eclass b/eclass/cargo.eclassHow about giving this function an optional parameter that gets passed to rust_abi so that you can get the build directory for targets other than CHOST?
index 40d98211ce7f9..2036fb635d569 100644
--- a/eclass/cargo.eclass
+++ b/eclass/cargo.eclass
@@ -319,6 +319,16 @@ _cargo_gen_git_config() {
fi
}
+# @FUNCTION: cargo_target_dir
+# @DESCRIPTION:
+# Return the directory within target that contains the build, e.g.
+# target/aarch64-unknown-linux-gnu/release.
+cargo_target_dir() {
+ local abi
+ tc-is-cross-compiler && abi=$(rust_abi)
+ echo "${CARGO_TARGET_DIR:-target}${abi+/}${abi}/$(usex debug debug release)"
+}
+
What initially motivated this suggestion is a quirk in app-misc/anki's
build system together with your recent change to cargo.eclass 375da3684, which enables cross-compilation by setting environment variables.
Here, I first build the 'build system runner' for CBUILD, which then
compiles the actual package for CHOST. I think I can avoid explicitly
setting --target $(rust ${CBUILD}) for the runner for now, but it would
be handy to easily get the build directory for CBUILD in the future!
On Thu, 2024-06-13 at 21:32 +0000, Lucio Sauer wrote:Cargo builds for the "host architecture" (CBUILD, right?) if no target
On Thu, Jun 13, 2024 at 04:03:44PM +0100, James Le Cuirot wrote:
Several Cargo-based ebuilds cannot use cargo_src_install for various reasons and manually install binaries from within the target directory instead. It is common to see `target/$(usex debug debug release)`, but this lacks the target ABI when cross-compiling, so provide a helper function.
There are some multilib Cargo-based ebuilds that always set the target ABI, even when not cross-compiling. It would be simpler to do this in general, so once ebuilds have been updated to use this new helper, I might change the eclass again accordingly.
Signed-off-by: James Le Cuirot <chewi@gentoo.org>
---
eclass/cargo.eclass | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/eclass/cargo.eclass b/eclass/cargo.eclassHow about giving this function an optional parameter that gets passed to rust_abi so that you can get the build directory for targets other than CHOST?
index 40d98211ce7f9..2036fb635d569 100644
--- a/eclass/cargo.eclass
+++ b/eclass/cargo.eclass
@@ -319,6 +319,16 @@ _cargo_gen_git_config() {
fi
}
+# @FUNCTION: cargo_target_dir
+# @DESCRIPTION:
+# Return the directory within target that contains the build, e.g.
+# target/aarch64-unknown-linux-gnu/release.
+cargo_target_dir() {
+ local abi
+ tc-is-cross-compiler && abi=$(rust_abi)
+ echo "${CARGO_TARGET_DIR:-target}${abi+/}${abi}/$(usex debug debug release)"
+}
+
What initially motivated this suggestion is a quirk in app-misc/anki's build system together with your recent change to cargo.eclass 375da3684, which enables cross-compilation by setting environment variables.
Here, I first build the 'build system runner' for CBUILD, which then compiles the actual package for CHOST. I think I can avoid explicitly setting --target $(rust ${CBUILD}) for the runner for now, but it would
be handy to easily get the build directory for CBUILD in the future!
I did consider that, but for the sake of simplicity, I think I'd prefer just overriding CHOST when you need to do this. There are already similar examples of this.
I had a look at app-misc/anki. I think you do need to give --target to the runner right now if that's building something, otherwise how would it know what the target is?
Perhaps the runner respects CARGO_BUILD_TARGET?Yes, it does.
If so, ISounds like a good idea. Ebuild writers will be able to specify the
was thinking of making a cargo_env wrapper helper that would set that and other variables in the context of the given command. This would be used in cargo_src_compile, as well as cargo_src_install and cargo_src_test in case any
rebuilding occurs. It could also be used for other custom scenarios like this one. What do you think?
diff --git a/app-misc/anki/anki-24.04.1.ebuild b/app-misc/anki/anki-24.04.1.ebuildThank you for bringing this to my attention. I forgot that I need to set
index 54dfbf94f31b2..2764659ccbf51 100644
--- a/app-misc/anki/anki-24.04.1.ebuild
+++ b/app-misc/anki/anki-24.04.1.ebuild
@@ -871,9 +871,9 @@ src_compile() {
# * generate the ninja file and run ninja afterwards
# * create the Python wheel files in "${S}"/out/wheels
- cargo build --release --package runner || die
+ tc-env_build cargo_src_compile --package runner
if use gui; then
- out/rust/release/runner build -- $(get_NINJAOPTS) wheels || die
+ cargo_env "$(CHOST=${CBUILD} cargo_target_dir)/runner" build -- $(get_NINJAOPTS) wheels || die
else
cargo_src_compile --package anki-sync-server
fi
@@ -901,7 +901,7 @@ src_test() {
"${S}"/build/ninja_gen/src/cargo.rs || die
for runner in pytest rust_test jest; do
- out/rust/release/runner build -- $(get_NINJAOPTS) check:$runner || \
+ cargo_env "$(CHOST=${CBUILD} cargo_target_dir)/runner" build -- $(get_NINJAOPTS) check:$runner || \
die "check:$runner failed!"
done
}
On 13/06/2024 17.03, James Le Cuirot wrote:
Several Cargo-based ebuilds cannot use cargo_src_install for various reasons and manually install binaries from within the target directory instead. It is common to see `target/$(usex debug debug release)`, but
this lacks the target ABI when cross-compiling, so provide a helper function.
Glad that someone is working on better cross-compilation support for
rust. :)
That said, many rust ebuilds generate shell completions by invoking the
just compiled binary in src_install(). This does not work out of the box when cross-compiling.
Is there anything we can or should do about it (besides binfmt_misc)?
For example, asking the according projects to implement a mechanism to extract the completions files from the binary without running it, or
have the build system generate the completion files as result of the build?
On Sat, Jun 15, 2024 at 08:14:34PM +0200, Florian Schmaus wrote:
On 13/06/2024 17.03, James Le Cuirot wrote:
Several Cargo-based ebuilds cannot use cargo_src_install for various reasons and manually install binaries from within the target directory instead. It is common to see `target/$(usex debug debug release)`, but this lacks the target ABI when cross-compiling, so provide a helper function.
Glad that someone is working on better cross-compilation support for
rust. :)
That said, many rust ebuilds generate shell completions by invoking the just compiled binary in src_install(). This does not work out of the box when cross-compiling.
Is there anything we can or should do about it (besides binfmt_misc)?
For example, asking the according projects to implement a mechanism to extract the completions files from the binary without running it, or
have the build system generate the completion files as result of the build?
All I can think of without changing entirely how they're generated is:
1. (worst) either make a 2nd build using CBUILD (yeah no), or BDEPEND
on same-version self with a USE only when cross compiling
2. (lazy) skip completions w/ ewarn if tc-is-cross-compiler, just so
it at least won't break cross over completion files that the user
may not even care much about
3. generate them yourself with each releases and ship in a tarball,
works out for users but extra burden for maintainer over little
4. ask upstream to provide proper release tarballs if not already and
include pre-generated completions/docs/etc... so it's otherwise
only a problem with arbitrary git checkouts
(3+4 may possibly be more complicated if cargo features / USE change
cli options and thus completion files)
For one of my ebuilds I went with better-than-nothing #2.
FYI, it turns out that at least clap-rs has support to generate the completion files as part of the build process:
https://docs.rs/clap_complete/latest/clap_complete/generator/fn.generate_to.html
Maybe we could encourage projects to simply adjust their build.rs to
generate the completion files. This would avoid inconsistent (Gentoo)
package contents when cross compiling.
Sysop: | Keyop |
---|---|
Location: | Huddersfield, West Yorkshire, UK |
Users: | 399 |
Nodes: | 16 (2 / 14) |
Uptime: | 101:29:20 |
Calls: | 8,363 |
Calls today: | 2 |
Files: | 13,165 |
Messages: | 5,897,912 |