nixpkgs/pkgs/development/libraries/gobject-introspection/default.nix

60 lines
2.0 KiB
Nix
Raw Normal View History

{ stdenv, fetchurl, glib, flex, bison, pkgconfig, libffi, python
, libintlOrEmpty, cctools
, substituteAll, nixStoreDir ? builtins.storeDir
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 17:49:33 +00:00
}:
# 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
let
2016-09-18 20:28:43 +01:00
ver_maj = "1.50";
ver_min = "0";
in
2016-03-29 17:04:46 +01:00
with stdenv.lib;
stdenv.mkDerivation rec {
name = "gobject-introspection-${ver_maj}.${ver_min}";
src = fetchurl {
url = "mirror://gnome/sources/gobject-introspection/${ver_maj}/${name}.tar.xz";
2016-09-18 20:28:43 +01:00
sha256 = "1c6597c666f543c70ef3d7c893ab052968afae620efdc080c36657f4226337c5";
};
outputs = [ "out" "dev" ];
outputBin = "dev";
outputMan = "dev"; # tiny pages
2014-08-30 18:11:52 +01:00
buildInputs = [ flex bison pkgconfig python setupHook/*move .gir*/ ]
++ libintlOrEmpty
++ stdenv.lib.optional stdenv.isDarwin cctools;
propagatedBuildInputs = [ libffi glib ];
preConfigure = ''
sed 's|/usr/bin/env ||' -i tools/g-ir-tool-template.in
'';
# outputs TODO: share/gobject-introspection-1.0/tests is needed during build
# by pygobject3 (and maybe others), but it's only searched in $out
setupHook = ./setup-hook.sh;
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 17:49:33 +00:00
patches = stdenv.lib.singleton (substituteAll {
src = ./absolute_shlib_path.patch;
inherit nixStoreDir;
});
meta = with stdenv.lib; {
description = "A middleware layer between C libraries and language bindings";
homepage = http://live.gnome.org/GObjectIntrospection;
maintainers = with maintainers; [ lovek323 lethalman ];
platforms = platforms.unix;
longDescription = ''
GObject introspection is a middleware layer between C libraries (using
GObject) and language bindings. The C library can be scanned at compile
time and generate a metadata file, in addition to the actual native C
library. Then at runtime, language bindings can read this metadata and
automatically provide bindings to call into the C library.
'';
};
}