summary refs log tree commit diff
path: root/pkgs/development/libraries/gobject-introspection
diff options
context:
space:
mode:
authorVladimír Čunát <vcunat@gmail.com>2016-03-08 09:57:58 +0100
committerVladimír Čunát <vcunat@gmail.com>2016-03-08 09:58:19 +0100
commit09af15654f0c8091f1b9e0bbb2e523cdee194442 (patch)
treee648edef1ce4c64c533f2593aa22b8015cf0e506 /pkgs/development/libraries/gobject-introspection
parentf306e67e15bdbe9a8358c9f81319fc4fcbadc2eb (diff)
parent0ee75214f336474e127c2e3546c0406a0c4d5fa7 (diff)
downloadnixpkgs-09af15654f0c8091f1b9e0bbb2e523cdee194442.tar
nixpkgs-09af15654f0c8091f1b9e0bbb2e523cdee194442.tar.gz
nixpkgs-09af15654f0c8091f1b9e0bbb2e523cdee194442.tar.bz2
nixpkgs-09af15654f0c8091f1b9e0bbb2e523cdee194442.tar.lz
nixpkgs-09af15654f0c8091f1b9e0bbb2e523cdee194442.tar.xz
nixpkgs-09af15654f0c8091f1b9e0bbb2e523cdee194442.tar.zst
nixpkgs-09af15654f0c8091f1b9e0bbb2e523cdee194442.zip
Merge master into closure-size
The kde-5 stuff still didn't merge well.
I hand-fixed what I saw, but there may be more problems.
Diffstat (limited to 'pkgs/development/libraries/gobject-introspection')
-rw-r--r--pkgs/development/libraries/gobject-introspection/absolute_shlib_path.patch108
-rw-r--r--pkgs/development/libraries/gobject-introspection/default.nix9
2 files changed, 112 insertions, 5 deletions
diff --git a/pkgs/development/libraries/gobject-introspection/absolute_shlib_path.patch b/pkgs/development/libraries/gobject-introspection/absolute_shlib_path.patch
index 04bcc42a032..49e059befdb 100644
--- a/pkgs/development/libraries/gobject-introspection/absolute_shlib_path.patch
+++ b/pkgs/development/libraries/gobject-introspection/absolute_shlib_path.patch
@@ -1,6 +1,108 @@
---- ./giscanner/utils.py.orig	2014-08-14 22:05:05.055334080 +0200
-+++ ./giscanner/utils.py	2014-08-14 22:05:24.687497334 +0200
-@@ -110,17 +110,11 @@
+diff --git a/giscanner/scannermain.py b/giscanner/scannermain.py
+index 89ec193..54f1d2e 100755
+--- a/giscanner/scannermain.py
++++ b/giscanner/scannermain.py
+@@ -94,6 +94,39 @@ def get_windows_option_group(parser):
+     return group
+ 
+ 
++def _get_default_fallback_libpath():
++    # Newer multiple-output-optimized stdenv has an environment variable
++    # $outputLib which in turn specifies another variable which then is used as
++    # the destination for the library contents (${!outputLib}/lib).
++    store_path = os.environ.get(os.environ.get("outputLib"))
++    if store_path is None:
++        outputs = os.environ.get("outputs", "out").split()
++        if "lib" in outputs:
++            # For multiple output derivations let's try whether there is a $lib
++            # environment variable and use that as the base store path.
++            store_path = os.environ.get("lib")
++        elif "out" in outputs:
++            # Otherwise we have a single output derivation, so the libraries
++            # most certainly will end up in "$out/lib".
++            store_path = os.environ.get("out")
++
++    if store_path is not None:
++        # Even if we have a $lib as output, there still should be a $lib/lib
++        # directory.
++        return os.path.join(store_path, 'lib')
++    else:
++        # If we haven't found a possible scenario, let's return an empty string
++        # so that the shared library won't be prepended with a path.
++        #
++        # Note that this doesn't mean that all hope is lost, because after all
++        # we can still use --fallback-library-path to set one.
++        #
++        # Also, we're not returning None, because that would make it very
++        # difficult to disable adding fallback paths altogether using something
++        # like: --fallback-library-path=""
++        return ""
++
++
+ def _get_option_parser():
+     parser = optparse.OptionParser('%prog [options] sources')
+     parser.add_option('', "--quiet",
+@@ -200,6 +233,10 @@ match the namespace prefix.""")
+     parser.add_option("", "--filelist",
+                       action="store", dest="filelist", default=[],
+                       help="file containing headers and sources to be scanned")
++    parser.add_option("", "--fallback-library-path",
++                      action="store", dest="fallback_libpath",
++                      default=_get_default_fallback_libpath(),
++                      help="Path to prepend to unknown shared libraries")
+ 
+     group = get_preprocessor_option_group(parser)
+     parser.add_option_group(group)
+diff --git a/giscanner/shlibs.py b/giscanner/shlibs.py
+index 838d343..ca7fc0d 100644
+--- 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 with temporary paths that are only valid during
++            # build time 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
+@@ -115,7 +129,11 @@ def _resolve_non_libtool(options, binary, libraries):
+                 m = pattern.search(line)
+                 if m:
+                     del patterns[library]
+-                    shlibs.append(m.group(1))
++                    match = m.group(1)
++                    if not match.startswith('/') \
++                       and len(options.fallback_libpath) > 0:
++                        match = os.path.join(options.fallback_libpath, match)
++                    shlibs.append(match)
+                     break
+ 
+         if len(patterns) > 0:
+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:
          return None
  
diff --git a/pkgs/development/libraries/gobject-introspection/default.nix b/pkgs/development/libraries/gobject-introspection/default.nix
index 1a2ba3db29a..8d1dabd826e 100644
--- a/pkgs/development/libraries/gobject-introspection/default.nix
+++ b/pkgs/development/libraries/gobject-introspection/default.nix
@@ -1,5 +1,7 @@
 { stdenv, fetchurl, glib, flex, bison, pkgconfig, libffi, python
-, libintlOrEmpty, autoconf, automake, otool }:
+, libintlOrEmpty, autoconf, automake, otool
+, substituteAll, nixStoreDir ? builtins.storeDir
+}:
 # now that gobjectIntrospection creates large .gir files (eg gtk3 case)
 # it may be worth thinking about using multiple derivation outputs
 # In that case its about 6MB which could be separated
@@ -15,7 +17,10 @@ stdenv.mkDerivation rec {
     url = "mirror://gnome/sources/gobject-introspection/${ver_maj}/${name}.tar.xz";
     sha256 = "6658bd3c2b8813eb3e2511ee153238d09ace9d309e4574af27443d87423e4233";
   };
-  patches = [ ./absolute_shlib_path.patch ];
+  patches = stdenv.lib.singleton (substituteAll {
+    src = ./absolute_shlib_path.patch;
+    inherit nixStoreDir;
+  });
 
   outputs = [ "dev" "out" ];
   outputBin = "dev";