diff mbox series

cargo: remove LD_LIBRARY_PATH wrapper

Message ID 20250227064410.49465-1-jst@mbs-solutions.de
State New
Headers show
Series cargo: remove LD_LIBRARY_PATH wrapper | expand

Commit Message

Jan Strater-Büddefeld Feb. 27, 2025, 6:44 a.m. UTC
Fixes [YOCTO #15579]
Fixes [YOCTO #15735]

This commit removes the LD_LIBRARY_PATH wrapper around 'cargo'.
Setting the LD_LIBRARY_PATH causes many problems.
Some build scripts will not run because the build scripts execute
binaries from the host system that are not compatible with the target
libraries.
Even a simple 'cargo help build' will probably fail because it uses
'less' internally, which should not be linked against the target
libraries.

This will break some commands like 'cargo test' and 'cargo run' for some
hosts that have the target libraries located in base_libdir, see commit
388e7cac9f90e79ce8c3c1683d8ee0f4df1bc907.
Originally, this wrapper was added for the host system tumbleweed-ty-3.
I don't know if 'cargo' on the current version of this host still fails
without the wrapper.
If so, one would have to set the LD_LIBRARY_PATH manually.
This tradeoff is acceptable because the wrapper causes more problems
than it solves.

A current working workaround without this commit would be to always use
'cargo.real' instead of 'cargo', which can lead to confusion.

I was not able to use testsdk because it already failed on master.

Signed-off-by: Jan Strater-Büddefeld <jst@mbs-solutions.de>
---
 meta/recipes-devtools/rust/cargo_1.82.0.bb | 6 ------
 1 file changed, 6 deletions(-)

Comments

Jan Strater-Büddefeld Feb. 27, 2025, 6:48 a.m. UTC | #1
On Tue, 2025-01-21 at 09:12 +0100, Jan Strater-Büddefeld via lists.openembedded.org wrote:


Fixes [YOCTO #15579]

This commit removes the LD_LIBRARY_PATH wrapper around `cargo`.
Setting the LD_LIBRARY_PATH causes many problems.
Some build scripts will not run because the build scripts execute
binaries from the host system that are not compatible with the target
libraries.
Even a simple `cargo help build` can fail because it uses `less`
internally, which should not be linked against the target libraries.

There might be cases where the LD_LIBRARY_PATH is needed for some hosts,
like the case described in 388e7cac9f90e79ce8c3c1683d8ee0f4df1bc907
but one can always set LD_LIBRARY_PATH manually if needed.

A current working workaround without this commit would be always using
`cargo.real` instead of `cargo`, which can lead to confusion.

Signed-off-by: Jan Strater-Büddefeld <jst@mbs-solutions.de><mailto:jst@mbs-solutions.de>
---
 meta/recipes-devtools/rust/cargo_1.81.0.bb | 8 --------
 1 file changed, 8 deletions(-)


That wrapper was added for a reason. Is that reason still valid and how
do you plan to mitigate against the issues it was originally added for?
The commit message needs to mention this.

Cheers,

Richard


I have rebased the commit and reworded the commit message. Is the new patch better? Let me know, what else I can do. This is my first contribution to an open source project, so I'm not familiar with the process yet.

Kindly regards,

Jan Strater-Büddefeld
Richard Purdie Feb. 27, 2025, 9:59 a.m. UTC | #2
Hi,

On Thu, 2025-02-27 at 06:48 +0000, Jan Strater-Büddefeld wrote:
> > > On Tue, 2025-01-21 at 09:12 +0100, Jan Strater-Büddefeld via
> > > lists.openembedded.org wrote:
> > > > Fixes [YOCTO #15579]
> > > > 
> > > > This commit removes the LD_LIBRARY_PATH wrapper around `cargo`.
> > > > Setting the LD_LIBRARY_PATH causes many problems.
> > > > Some build scripts will not run because the build scripts
> > > > execute
> > > > binaries from the host system that are not compatible with the
> > > > target
> > > > libraries.
> > > > Even a simple `cargo help build` can fail because it uses
> > > > `less`
> > > > internally, which should not be linked against the target
> > > > libraries.
> > > > 
> > > > There might be cases where the LD_LIBRARY_PATH is needed for
> > > > some hosts,
> > > > like the case described in
> > > > 388e7cac9f90e79ce8c3c1683d8ee0f4df1bc907
> > > > but one can always set LD_LIBRARY_PATH manually if needed.
> > > > 
> > > > A current working workaround without this commit would be
> > > > always using
> > > > `cargo.real` instead of `cargo`, which can lead to confusion.
> > > > 
> > > > Signed-off-by: Jan Strater-Büddefeld <jst@mbs-solutions.de>
> > > > ---
> > > >  meta/recipes-devtools/rust/cargo_1.81.0.bb | 8 --------
> > > >  1 file changed, 8 deletions(-)
> > > That wrapper was added for a reason. Is that reason still valid
> > > and how
> > > do you plan to mitigate against the issues it was originally
> > > added for?
> > > The commit message needs to mention this.
> > > 
> > > Cheers,
> > > 
> > > Richard
> I have rebased the commit and reworded the commit message. Is the new
> patch better? Let me know, what else I can do. This is my first
> contribution to an open source project, so I'm not familiar with the
> process yet.

The commit message is much better, yes, thanks. This is a really tricky
problem though, particularly for your first contribution.

My concern in merging something like this is that it effectively fixes
one use case at the expense of breaking others. Ideally we'd find a
different fix which fixes both your issue and the one that was
originally being fixed. I appreciate that is very hard to do though.

I'm not sure what to recommend. I have vague memories of the original
issue but not enough to be able to give useful pointers. Whilst we
probably don't test that tumbleweed combination now, I would be worried
that some other distro will replicate that type of combination of
host/uninative/nativesdk libraries and see the issue again.

Suggesting the user set LD_LIBRARY_PATH manually when needed isn't too
helpful as we don't know when the user would need to do this or how
they'd then add this.

One idea, could we add base_libdir to the code in cargo that is adding
libdir?

Cheers,

Richard
diff mbox series

Patch

diff --git a/meta/recipes-devtools/rust/cargo_1.82.0.bb b/meta/recipes-devtools/rust/cargo_1.82.0.bb
index db18ecfda9..05ecc32ae6 100644
--- a/meta/recipes-devtools/rust/cargo_1.82.0.bb
+++ b/meta/recipes-devtools/rust/cargo_1.82.0.bb
@@ -45,12 +45,6 @@  do_install () {
 }
 
 do_install:append:class-nativesdk() {
-	# To quote the cargo docs, "Cargo also sets the dynamic library path when compiling
-	# and running binaries with commands like `cargo run` and `cargo test`". Sadly it
-	# sets to libdir but not base_libdir leading to symbol mismatches depending on the
-	# host OS. Fully set LD_LIBRARY_PATH to contain both to avoid this.
-	create_wrapper ${D}/${bindir}/cargo LD_LIBRARY_PATH=${libdir}:${base_libdir}
-	
 	ENV_SETUP_DIR=${D}${base_prefix}/environment-setup.d
 	mkdir "${ENV_SETUP_DIR}"
 	CARGO_ENV_SETUP_SH="${ENV_SETUP_DIR}/cargo.sh"