* [PATCH v2 1/2] rust: package rust-analyzer for the SDK
2026-10-06 11:12 [PATCH v2 0/2] rust: add rust-analyzer support Benhur Tessele
@ 2026-10-06 11:12 ` Benhur Tessele
2026-11-09 14:15 ` Paul Barker
2026-10-06 11:12 ` [PATCH v2 2/2] packagegroup-rust-cross-canadian: add rust-analyzer to " Benhur Tessele
2026-11-11 15:44 ` [PATCH v3] rust: add rust-analyzer to the SDK behind a PACKAGECONFIG Benhur Tessele
2 siblings, 1 reply; 5+ messages in thread
From: Benhur Tessele @ 2026-10-06 11:12 UTC (permalink / raw)
To: openembedded-core
Cc: Randy MacLeod, paul, mathieu.dubois-briand, Benhur Tessele
rust-analyzer is built alongside the other Rust tools (clippy, rustfmt)
but was not installed or packaged. Install it for the nativesdk variant
and add a rust-tools-analyzer package so it is available in the Rust SDK.
Two additional pieces are required for the tool to be usable:
- The proc-macro server, rust-analyzer-proc-macro-srv, which
rust-analyzer looks up under <sysroot>/libexec. Install it into
${libexecdir}; without it, analysis of any crate using a derive or
attribute macro fails with "cannot find proc-macro server in sysroot".
- The standard library sources, which rust-analyzer analyses from source
rather than from the compiled rlibs. Add an RDEPENDS on ${PN}-src-lib
so that core/std items resolve.
Both binaries link against librustc_driver from the main package, so the
package also RDEPENDS on ${PN}.
rust-analyzer is deliberately not built for the target: it adds build
time, is unlikely to be a use case on a target device, and fails to build
on NEON arm32 tunes (beaglebone-alt, qemuarm-alt) because it pulls its own
simd-adler32 that uses the unstable feature in 1.98
"stdarch_arm_neon_intrinsics".
Signed-off-by: Benhur Tessele <benhur.tessele@est.tech>
---
meta/recipes-devtools/rust/rust_1.98.1.bb | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/meta/recipes-devtools/rust/rust_1.98.1.bb b/meta/recipes-devtools/rust/rust_1.98.1.bb
index 1f4ce5ebdb..f9d68ea986 100644
--- a/meta/recipes-devtools/rust/rust_1.98.1.bb
+++ b/meta/recipes-devtools/rust/rust_1.98.1.bb
@@ -262,17 +262,21 @@ do_test_compile () {
ALLOW_EMPTY:${PN} = "1"
PACKAGES =+ "${PN}-rustdoc ${PN}-tools-clippy ${PN}-tools-rustfmt ${PN}-src-lib"
+PACKAGES:prepend:class-nativesdk = "${PN}-tools-analyzer "
FILES:${PN}-rustdoc = "${bindir}/rustdoc"
FILES:${PN}-tools-clippy = "${bindir}/cargo-clippy ${bindir}/clippy-driver"
FILES:${PN}-tools-rustfmt = "${bindir}/rustfmt"
+FILES:${PN}-tools-analyzer = "${bindir}/rust-analyzer ${libexecdir}/rust-analyzer-proc-macro-srv"
FILES:${PN}-src-lib = "${libdir}/rustlib/src/rust"
RDEPENDS:${PN}-rustdoc = "${PN}"
RDEPENDS:${PN}-tools-clippy = "${PN}"
RDEPENDS:${PN}-tools-rustfmt = "${PN}"
+RDEPENDS:${PN}-tools-analyzer = "${PN} ${PN}-src-lib"
SUMMARY:${PN}-tools-clippy = "A collection of lints to catch common mistakes and improve your Rust code"
SUMMARY:${PN}-tools-rustfmt = "A tool for formatting Rust code according to style guidelines"
+SUMMARY:${PN}-tools-analyzer = "A language server providing IDE features for Rust"
do_install () {
rust_do_install
@@ -294,14 +298,19 @@ rust_do_install:class-nativesdk() {
rust_runx install
rust_runx install clippy
rust_runx install rustfmt
+ rust_runx install rust-analyzer
unset PSEUDO_UNLOAD
install -d ${D}${bindir}
- for i in cargo-clippy clippy-driver rustfmt; do
+ for i in cargo-clippy clippy-driver rustfmt rust-analyzer; do
cp rust-build/${RUST_BUILD_SYS}/stage2-tools/${RUST_HOST_SYS}/release/$i ${D}${bindir}
patchelf --set-rpath "\$ORIGIN/../lib" ${D}${bindir}/$i
done
+ install -d ${D}${libexecdir}
+ cp rust-build/${RUST_BUILD_SYS}/stage2-tools/${RUST_HOST_SYS}/release/rust-analyzer-proc-macro-srv ${D}${libexecdir}
+ patchelf --set-rpath "\$ORIGIN/../lib" ${D}${libexecdir}/rust-analyzer-proc-macro-srv
+
chown root:root ${D}/ -R
rm ${D}${libdir}/rustlib/uninstall.sh
rm ${D}${libdir}/rustlib/install.log
--
2.43.0
^ permalink raw reply related [flat|nested] 5+ messages in thread* [PATCH v3] rust: add rust-analyzer to the SDK behind a PACKAGECONFIG
2026-10-06 11:12 [PATCH v2 0/2] rust: add rust-analyzer support Benhur Tessele
2026-10-06 11:12 ` [PATCH v2 1/2] rust: package rust-analyzer for the SDK Benhur Tessele
2026-10-06 11:12 ` [PATCH v2 2/2] packagegroup-rust-cross-canadian: add rust-analyzer to " Benhur Tessele
@ 2026-11-11 15:44 ` Benhur Tessele
2 siblings, 0 replies; 5+ messages in thread
From: Benhur Tessele @ 2026-11-11 15:44 UTC (permalink / raw)
To: openembedded-core; +Cc: Randy MacLeod, Paul Barker, Benhur Tessele
Add a rust-analyzer PACKAGECONFIG option which, when enabled, installs
it for the nativesdk variant and packages it as rust-tools-analyzer. The
option is disabled by default.
Two additional pieces are required for the tool to be usable:
- The proc-macro server, rust-analyzer-proc-macro-srv, which
rust-analyzer looks up under <sysroot>/libexec. Install it into
${libexecdir}; without it, analysis of any crate using a derive or
attribute macro fails with "cannot find proc-macro server in sysroot".
- The standard library sources, which rust-analyzer analyses from source
rather than from the compiled rlibs. Add an RDEPENDS on ${PN}-src-lib
so that core/std items resolve.
Both binaries link against librustc_driver from the main package, so the
package also RDEPENDS on ${PN}.
rust-analyzer is only installed for nativesdk, as a language server is
used on the SDK host rather than on a target device.
To get it into an SDK:
SDK_FEATURES:append = " rust"
PACKAGECONFIG:append:pn-nativesdk-rust = " rust-analyzer"
TOOLCHAIN_HOST_TASK:append = " nativesdk-rust-tools-analyzer"
Tested by building an SDK with the option enabled and confirming
rust-analyzer resolves the standard library and expands proc-macros, and
by building with the option disabled to confirm the default configuration
is unaffected.
AI-Generated: Kiro with Claude Opus 5
Signed-off-by: Benhur Tessele <benhur.tessele@est.tech>
---
changes in v3:
- Put rust-analyzer behind a PACKAGECONFIG option, disabled by default,
so the default configuration is unchanged.
- Dropped the packagegroup-rust-cross-canadian patch: with the option
disabled by default the package does not exist, so it cannot be an
unconditional SDK dependency. Enabling is opt-in instead.
changes in v2:
- Installed rust-analyzer for nativesdk only; dropped the target install.
---
meta/recipes-devtools/rust/rust_1.99.1.bb | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git a/meta/recipes-devtools/rust/rust_1.99.1.bb b/meta/recipes-devtools/rust/rust_1.99.1.bb
index 7da662c453..d0943b1941 100644
--- a/meta/recipes-devtools/rust/rust_1.99.1.bb
+++ b/meta/recipes-devtools/rust/rust_1.99.1.bb
@@ -24,6 +24,8 @@ RDEPENDS:${PN}:append:class-target = " gcc g++ binutils"
PACKAGECONFIG ??= "llvm-shared"
PACKAGECONFIG[llvm-shared] = ",,,"
+# Only used by the nativesdk variant; rust-analyzer runs on the SDK host
+PACKAGECONFIG[rust-analyzer] = ",,,"
S = "${RUSTSRC}"
# Separate build directory from the shared source tree so that multiple
@@ -260,17 +262,21 @@ do_test_compile () {
ALLOW_EMPTY:${PN} = "1"
PACKAGES =+ "${PN}-rustdoc ${PN}-tools-clippy ${PN}-tools-rustfmt ${PN}-src-lib"
+PACKAGES:prepend:class-nativesdk = "${@bb.utils.contains('PACKAGECONFIG', 'rust-analyzer', '${PN}-tools-analyzer ', '', d)}"
FILES:${PN}-rustdoc = "${bindir}/rustdoc"
FILES:${PN}-tools-clippy = "${bindir}/cargo-clippy ${bindir}/clippy-driver"
FILES:${PN}-tools-rustfmt = "${bindir}/rustfmt"
+FILES:${PN}-tools-analyzer = "${bindir}/rust-analyzer ${libexecdir}/rust-analyzer-proc-macro-srv"
FILES:${PN}-src-lib = "${libdir}/rustlib/src/rust"
RDEPENDS:${PN}-rustdoc = "${PN}"
RDEPENDS:${PN}-tools-clippy = "${PN}"
RDEPENDS:${PN}-tools-rustfmt = "${PN}"
+RDEPENDS:${PN}-tools-analyzer = "${PN} ${PN}-src-lib"
SUMMARY:${PN}-tools-clippy = "A collection of lints to catch common mistakes and improve your Rust code"
SUMMARY:${PN}-tools-rustfmt = "A tool for formatting Rust code according to style guidelines"
+SUMMARY:${PN}-tools-analyzer = "A language server providing IDE features for Rust"
do_install () {
rust_do_install
@@ -292,6 +298,10 @@ rust_do_install:class-nativesdk() {
rust_runx install
rust_runx install clippy
rust_runx install rustfmt
+ if ${@bb.utils.contains('PACKAGECONFIG', 'rust-analyzer', 'true', 'false', d)}; then
+ rust_runx install rust-analyzer
+ rust_runx build rust-analyzer-proc-macro-srv
+ fi
unset PSEUDO_UNLOAD
install -d ${D}${bindir}
@@ -300,6 +310,14 @@ rust_do_install:class-nativesdk() {
patchelf --set-rpath "\$ORIGIN/../lib" ${D}${bindir}/$i
done
+ if ${@bb.utils.contains('PACKAGECONFIG', 'rust-analyzer', 'true', 'false', d)}; then
+ install -d ${D}${libexecdir}
+ cp rust-build/${RUST_BUILD_SYS}/stage2-tools/${RUST_HOST_SYS}/release/rust-analyzer ${D}${bindir}
+ patchelf --set-rpath "\$ORIGIN/../lib" ${D}${bindir}/rust-analyzer
+ cp rust-build/${RUST_BUILD_SYS}/stage2-tools/${RUST_HOST_SYS}/release/rust-analyzer-proc-macro-srv ${D}${libexecdir}
+ patchelf --set-rpath "\$ORIGIN/../lib" ${D}${libexecdir}/rust-analyzer-proc-macro-srv
+ fi
+
chown root:root ${D}/ -R
rm ${D}${libdir}/rustlib/uninstall.sh
rm ${D}${libdir}/rustlib/install.log
^ permalink raw reply related [flat|nested] 5+ messages in thread