[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Profile's LD_LIBRARY_PATH by default
From: |
david larsson |
Subject: |
Re: Profile's LD_LIBRARY_PATH by default |
Date: |
Thu, 29 Oct 2020 11:07:28 +0000 |
On 2020-10-29 10:07, Sébastien Lerique wrote:
Hello!
On 29 Oct 2020 at 10:10, david larsson <david.larsson@selfhosted.xyz>
wrote:
On 2020-10-28 13:49, Sébastien Lerique wrote:
[snip]
While running a racket program which uses OpenCV, I realised that my
LD_LIBRARY_PATH does not contain my user's profile libs. I have
`libopencv*.so` in `~/.guix-profile/lib/`, but running a racket
program which needs that fails:
```
$ racket capture.rkt
ffi-lib: couldn't open "libopencv_core.so" (libopencv_core.so: cannot
open shared object file: No such file or directory)
```
While running
```
env LD_LIBRARY_PATH=/home/sl/.guix-profile/lib/ racket capture.rkt
```
works.
(Also, this <http://0x0.st/ik3s.txt> is the output of `env
LD_DEBUG=libs racket capture.rkt`.)
Is this normal behaviour, i.e. that the path to dynamic libs
installed
in my user profile should be manually configured in my shell startup
scripts? Should this not be included in
`~/.guix-profile/etc/profile`?
I wondered the same, and got answer in the IRC #guix that setting
LD_LIBRARY_PATH is highly discouraged (unless you have a specific and
good reason to do so in a specific case - never globally). I a good
explanation
about it here:
https://web.archive.org/web/20060719201954/http://www.visi.com/~barr/ldpath.html
A good example of how it can go wrong:
"In its startup script[a program called WidgetMan], it sets
LD_LIBRARY_PATH to
point to its copy of Motif so it uses that one when it runs. As it
happens,
WidgetMan is designed to launch other programs too. Unfortunately,
when
WidgetMan launches other apps, they inherit the LD_LIBRARY_PATH
setting and some
Motif based apps now break when run from WidgetMan because WidgetMan's
Motif is
incompatible with (but the same library version as) the system Motif
library.
Bummer!"
Yes I see that makes sense. Does this mean that one shouldn't install
libraries in user profiles?
Not necessarily - it shouldn't hurt anway IIUC. Though I assume it is
more common to install libraries when you use guix environment or guix
profile.
Or maybe that, if I were to package this racket program, then it would
depend on `opencv` and set its required lib paths properly in its
package definition (so work no matter if it's system-wide or in a user
profile)?
IIUC, yes, through package inputs and then the build-system usually
finds the path for you.
Then, for development, is setting LD_LIBRARY_PATH still the only way
without installing the lib system-wide?
It is possibly the easiest way, but perhaps not the guix-iest way.
Please someone correct me if Im wrong here:
For development you can use guix environment or guix-profile and
possibly even grafts if you want to develop against newer versions of
opency.
Say you want to test updating the opency package in a profile created by
guix package -m manifest.scm -p ~/guix-profiles/dev-profile; the new
opency version can be grafted onto your racket package X (or all
packages in the profile depending on opency) without rebuilding X, by
adding "(replacement opency-fixed)" in the opency package definition in
the profile manifest. On the next package update for the profile (i.e.
guix package -m manifest-with-replacement.scm -p
~/guix-profile/dev-profile) all dependencies of opency would be updated
(such as your package X). The "manifest.scm" file is a package module
that contains; the definition of opency with "(replacement
opency-fixed)", the package definition for "opency-fixed", definition of
X, and also any other packages you need to test.
see here: https://guix.gnu.org/manual/en/html_node/Security-Updates.html
and here:
https://guix.gnu.org/manual/en/html_node/Invoking-guix-environment.html
(that's a lot of questions, apologies!)
No problem :-)