Commit Graph

7 Commits

Author SHA1 Message Date
Jan Tojnar
e468c04383
gobjectIntrospection: fix incorrect GIR shared library paths
When a library path contained the library name it was eagerly matched

    libfwupd.so.2 => /build/fwupd-1.0.5/build/libfwupd/libfwupd.so.2 (0x00007ffff7bbd000)
                                              ^^^^^^^^^^^^^^^^^^^^^^
    libgweather-3.so.15 => /build/libgweather-3.28.0/build/libgweather/libgweather-3.so.15 (0x00007ffff7bae000)
                                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

which lead to a broken shared library path in the generated GIR file.

This patch allows the soname on the left-hand side of the arrow to
be matched to avoid the trap of the right-hand side. A negative
lookahead had to be added to select the store path, since only
the first match is taken into account.

    libglib-2.0.so.0 => /nix/store/dqlc8y4phlg1hmdbwkhqfwhnxcac88d1-glib-2.56.0/lib/libglib-2.0.so.0 (0x00007ffff6400000)

This will not fix non-GNU platforms, where the soname is not printed
first, but we cannot do much without structured ldd output.

Closes: https://github.com/NixOS/nixpkgs/issues/34988
2018-03-22 07:46:00 +01:00
Hamish Mackenzie
da1d13bc07 webkgitgtk: fix 2.14 on macOS
Includes the patches from macports and fixes an issue with the
`otool -L` output that was causing g-ir-scanner to fail.
The paths in the macports patches have been modified so that they
will work with `patches` in nix (an extra directory level was
added).
2017-04-10 23:11:16 -07:00
aszlig
740b30b937
gobject-introspection: Deal with $outputLib
Once #7701 gets merged, we have another environment variable called
$outputLib, which then points to another environment variable which is
the final library output.

This was brought up in discussion with @lethalman and @vcunat in:

https://github.com/NixOS/nixpkgs/pull/12558#discussion_r50599813

The closure-size branch is not yet merged into master, so this is only
a preparation and we're still falling back to $out and $lib whenever
$outputLib isn't available.

Signed-off-by: aszlig <aszlig@redmoonstudios.org>
2016-01-23 16:36:14 +01:00
aszlig
b3b444a79e
gobject-introspection: Improve comment in patch
As the comment needed explanation, that it's about temporary build
files, this should do better.

Thanks again to @lethalman for pointing that out.

Signed-off-by: aszlig <aszlig@redmoonstudios.org>
2016-01-23 00:14:53 +01:00
aszlig
c83e697aa0
gobject-introspection: Add fallback for libraries
After patching up the shared libraries in c420de6 to use absolute paths,
there are still some libraries left which do not get an absolute paths
assigned.

Those libraries are the ones which have an absolute path outside of the
Nix store, so we assume that they're build products of the current build
and make them absolute by prepending "$out/lib" or "$lib/lib" (depending
on whether it's a multiple output derivation or not) to its basename.

So for my test case, the resulting library paths now look like this:

  /nix/store/...-libblockdev-1.3/lib/libblockdev.so.0
  /nix/store/...-glibc-2.21/lib/libm.so.6
  /nix/store/...-dmraid-1.0.0.rc16/lib/libdmraid.so.1.0.0.rc16
  /nix/store/...-libblockdev-1.3/lib/libbd_utils.so.0

Which is perfectly fine and everything gets resolved correctly after
importing the library using GI.

However, I didn't test it against other libraries and programs, so this
still needs testing, especially for Darwin.

Signed-off-by: aszlig <aszlig@redmoonstudios.org>
2016-01-22 22:46:14 +01:00
aszlig
c420de6b05
gobject-introspection: Fix patching shared objects
The gi-r-scanner is generating a list of shared libraries that are
referenced in the shared-library attribute of the <namespace/> element
of the GIR file. However, this attribute only contains the names of the
libraries and not the full store paths, like for example while preparing
to package libblockdev, the following items were included in the
shared-library attribute:

  /nix/store/...-libblockdev-1.3/lib/libblockdev.so.0
  libm.so.6
  libdmraid.so.1.0.0.rc16
  libbd_utils.so.0

Unfortunately, loading such a library without setting LD_LIBRARY_PATH is
going to fail finding libm.so.6 and libdmraid.so.1.0.0.rc16.

Now the first attempt at solving this was to put absolute paths of all
the libraries referenced in the shared-library attribute, but this also
led up to including paths of build-time shared objects into that
attribute:

  /nix/store/...-libblockdev-1.3/lib/libblockdev.so.0
  /nix/store/...-glibc-2.21/lib/libm.so.6
  /nix/store/...-dmraid-1.0.0.rc16/lib/libdmraid.so.1.0.0.rc16
  /tmp/nix-build-libblockdev-1.3.drv-0/.../utils/.libs/libbd_utils.so.0

This of course is not what we want, so the final solution is to only
use the absolute path whenever it is a Nix path and leave the library
name as-is if the path doesn't reside within the store, like this:

  /nix/store/...-libblockdev-1.3/lib/libblockdev.so.0
  /nix/store/...-glibc-2.21/lib/libm.so.6
  /nix/store/...-dmraid-1.0.0.rc16/lib/libdmraid.so.1.0.0.rc16
  libbd_utils.so.0

The downside of this approach is that if not even the output path of the
library is in LD_LIBRARY_PATH, even loading of libbd_utils.so.0 could
fail, so we need to patch the loader as well.

Signed-off-by: aszlig <aszlig@redmoonstudios.org>
2016-01-22 22:46:02 +01:00
Luca Bruno
36bef2b267 gobject-introspection: refer to shlibs with absolute paths in typelibs
After this, LD_LIBRARY_PATH should not be required anymore.
The patch has been applied only for .la files, so there may
be some other cases missing.
2014-08-14 23:16:51 +02:00