diff --git a/pkgs/development/libraries/gobject-introspection/absolute_shlib_path.patch b/pkgs/development/libraries/gobject-introspection/absolute_shlib_path.patch index 6a112aedcc0..96e7b553e60 100644 --- a/pkgs/development/libraries/gobject-introspection/absolute_shlib_path.patch +++ b/pkgs/development/libraries/gobject-introspection/absolute_shlib_path.patch @@ -87,8 +87,8 @@ + m = pattern.search(line) if m: del patterns[library] -- shlibs.append(m.group(1)) -+ shlibs.append(os.path.join(options.fallback_libpath, m.group(1))) +- shlibs.append(_sanitize_install_name(m.group(1))) ++ shlibs.append(os.path.join(options.fallback_libpath, _sanitize_install_name(m.group(1)))) break if len(patterns) > 0: diff --git a/pkgs/development/libraries/gobject-introspection/default.nix b/pkgs/development/libraries/gobject-introspection/default.nix index 482710f18df..71bff07dd97 100644 --- a/pkgs/development/libraries/gobject-introspection/default.nix +++ b/pkgs/development/libraries/gobject-introspection/default.nix @@ -39,6 +39,7 @@ stdenv.mkDerivation rec { setupHook = ./setup-hook.sh; patches = [ + ./macos-shared-library.patch (substituteAll { src = ./absolute_shlib_path.patch; inherit nixStoreDir; diff --git a/pkgs/development/libraries/gobject-introspection/macos-shared-library.patch b/pkgs/development/libraries/gobject-introspection/macos-shared-library.patch new file mode 100644 index 00000000000..9a1d41cf1e3 --- /dev/null +++ b/pkgs/development/libraries/gobject-introspection/macos-shared-library.patch @@ -0,0 +1,36 @@ +diff --git a/giscanner/shlibs.py b/giscanner/shlibs.py +index c93d20c..4d4915d 100644 +--- a/giscanner/shlibs.py ++++ b/giscanner/shlibs.py +@@ -43,6 +43,22 @@ def _resolve_libtool(options, binary, libraries): + + return shlibs + ++def _sanitize_install_name(install_name): ++ ''' ++ On macOS, the dylib can be built with install_name as @rpath/libfoo.so ++ instead of the absolute path to the library, so handle that. The name ++ can also be @loader_path or @executable_path. ++ ''' ++ if not install_name.startswith('@'): ++ return install_name ++ if install_name.startswith('@rpath/'): ++ return install_name[7:] ++ if install_name.startswith('@loader_path/'): ++ return install_name[13:] ++ if install_name.startswith('@executable_path/'): ++ return install_name[17:] ++ raise RuntimeError('Unknown install_name {!r}'.format(install_name)) ++ + + # Assume ldd output is something vaguely like + # +@@ -121,7 +137,7 @@ def _resolve_non_libtool(options, binary, libraries): + m = pattern.search(line) + if m: + del patterns[library] +- shlibs.append(m.group(1)) ++ shlibs.append(_sanitize_install_name(m.group(1))) + break + + if len(patterns) > 0: