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>
This commit is contained in:
parent
ecc48af0ce
commit
c420de6b05
@ -1,6 +1,40 @@
|
|||||||
--- ./giscanner/utils.py.orig 2014-08-14 22:05:05.055334080 +0200
|
diff --git a/giscanner/shlibs.py b/giscanner/shlibs.py
|
||||||
+++ ./giscanner/utils.py 2014-08-14 22:05:24.687497334 +0200
|
index 838d343..9dbdc0f 100644
|
||||||
@@ -110,17 +110,11 @@
|
--- a/giscanner/shlibs.py
|
||||||
|
+++ b/giscanner/shlibs.py
|
||||||
|
@@ -53,10 +53,24 @@ def _resolve_libtool(options, binary, libraries):
|
||||||
|
# Match absolute paths on OS X to conform to how libraries are usually
|
||||||
|
# referenced on OS X systems.
|
||||||
|
def _ldd_library_pattern(library_name):
|
||||||
|
+ nix_store_dir = re.escape('@nixStoreDir@'.rstrip('/'))
|
||||||
|
pattern = "(?<![A-Za-z0-9_-])(lib*%s[^A-Za-z0-9_-][^\s\(\)]*)"
|
||||||
|
- if platform.system() == 'Darwin':
|
||||||
|
- pattern = "([^\s]*lib*%s[^A-Za-z0-9_-][^\s\(\)]*)"
|
||||||
|
- return re.compile(pattern % re.escape(library_name))
|
||||||
|
+ pattern = r'''
|
||||||
|
+ (
|
||||||
|
+ (?:
|
||||||
|
+ # First match Nix store paths because they need to be absolute.
|
||||||
|
+ (?:%s(?:/[^/]*)+)
|
||||||
|
+ # Everything else not a store path remains relative, because we
|
||||||
|
+ # would end up having absolute build paths in the resulting GIR
|
||||||
|
+ # file.
|
||||||
|
+ | (?<=/)
|
||||||
|
+ )
|
||||||
|
+ # And finally the library itself:
|
||||||
|
+ (?:lib%s[^A-Za-z0-9_-][^\s\(\)]*)
|
||||||
|
+ )
|
||||||
|
+ '''
|
||||||
|
+ return re.compile(pattern % (nix_store_dir, re.escape(library_name)),
|
||||||
|
+ re.VERBOSE)
|
||||||
|
|
||||||
|
|
||||||
|
# This is a what we do for non-la files. We assume that we are on an
|
||||||
|
diff --git a/giscanner/utils.py b/giscanner/utils.py
|
||||||
|
index 660081e..c9c767a 100644
|
||||||
|
--- a/giscanner/utils.py
|
||||||
|
+++ b/giscanner/utils.py
|
||||||
|
@@ -109,17 +109,11 @@ def extract_libtool_shlib(la_file):
|
||||||
if dlname is None:
|
if dlname is None:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
{ stdenv, fetchurl, glib, flex, bison, pkgconfig, libffi, python
|
{ stdenv, fetchurl, glib, flex, bison, pkgconfig, libffi, python
|
||||||
, libintlOrEmpty, autoconf, automake, otool }:
|
, libintlOrEmpty, autoconf, automake, otool
|
||||||
|
, substituteAll, nixStoreDir ? "/nix/store"
|
||||||
|
}:
|
||||||
# now that gobjectIntrospection creates large .gir files (eg gtk3 case)
|
# now that gobjectIntrospection creates large .gir files (eg gtk3 case)
|
||||||
# it may be worth thinking about using multiple derivation outputs
|
# it may be worth thinking about using multiple derivation outputs
|
||||||
# In that case its about 6MB which could be separated
|
# In that case its about 6MB which could be separated
|
||||||
@ -33,7 +35,10 @@ stdenv.mkDerivation rec {
|
|||||||
|
|
||||||
setupHook = ./setup-hook.sh;
|
setupHook = ./setup-hook.sh;
|
||||||
|
|
||||||
patches = [ ./absolute_shlib_path.patch ];
|
patches = stdenv.lib.singleton (substituteAll {
|
||||||
|
src = ./absolute_shlib_path.patch;
|
||||||
|
inherit nixStoreDir;
|
||||||
|
});
|
||||||
|
|
||||||
meta = with stdenv.lib; {
|
meta = with stdenv.lib; {
|
||||||
description = "A middleware layer between C libraries and language bindings";
|
description = "A middleware layer between C libraries and language bindings";
|
||||||
|
@ -6639,7 +6639,9 @@ let
|
|||||||
#GMP ex-satellite, so better keep it near gmp
|
#GMP ex-satellite, so better keep it near gmp
|
||||||
mpfr = callPackage ../development/libraries/mpfr/default.nix { };
|
mpfr = callPackage ../development/libraries/mpfr/default.nix { };
|
||||||
|
|
||||||
gobjectIntrospection = callPackage ../development/libraries/gobject-introspection { };
|
gobjectIntrospection = callPackage ../development/libraries/gobject-introspection {
|
||||||
|
nixStoreDir = config.nix.storeDir or "/nix/store";
|
||||||
|
};
|
||||||
|
|
||||||
goocanvas = callPackage ../development/libraries/goocanvas { };
|
goocanvas = callPackage ../development/libraries/goocanvas { };
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user