mirror of
https://github.com/NixOS/nixpkgs.git
synced 2025-02-15 15:30:39 +00:00
Add a setup hook for fixing dylib install names on Darwin
Install names need to be absolute paths, otherwise programs that link against the dylib won't work without setting $DYLD_LIBRARY_PATH. Most packages do this correctly, but some (like Boost and ICU) do not. This setup hook absolutizes all install names.
This commit is contained in:
parent
abf6896aaf
commit
8622548160
pkgs
build-support/setup-hooks
development/libraries
top-level
35
pkgs/build-support/setup-hooks/fix-darwin-dylib-names.sh
Normal file
35
pkgs/build-support/setup-hooks/fix-darwin-dylib-names.sh
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
# On Mac OS X, binaries refer to dynamic library dependencies using
|
||||||
|
# either relative paths (e.g. "libicudata.dylib", searched relative to
|
||||||
|
# $DYLD_LIBRARY_PATH) or absolute paths
|
||||||
|
# (e.g. "/nix/store/.../lib/libicudata.dylib"). In Nix, the latter is
|
||||||
|
# preferred since it allows programs to just work. When linking
|
||||||
|
# against a library (e.g. "-licudata"), the linker uses the install
|
||||||
|
# name embedded in the dylib (which can be shown using "otool -D").
|
||||||
|
# Most packages create dylibs with absolute install names, but some do
|
||||||
|
# not. This setup hook fixes dylibs by setting their install names to
|
||||||
|
# their absolute path (using "install_name_tool -id"). It also
|
||||||
|
# rewrites references in other dylibs to absolute paths.
|
||||||
|
|
||||||
|
fixDarwinDylibNames() {
|
||||||
|
local flags=()
|
||||||
|
local old_id
|
||||||
|
|
||||||
|
for fn in "$@"; do
|
||||||
|
flags+=(-change "$(basename "$fn")" "$fn")
|
||||||
|
done
|
||||||
|
|
||||||
|
for fn in "$@"; do
|
||||||
|
if [ -L "$fn" ]; then continue; fi
|
||||||
|
echo "$fn: fixing dylib"
|
||||||
|
install_name_tool -id "$fn" "${flags[@]}" "$fn"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
fixDarwinDylibNamesIn() {
|
||||||
|
local dir="$1"
|
||||||
|
fixDarwinDylibNames $(find "$dir" -name "*.dylib")
|
||||||
|
}
|
||||||
|
|
||||||
|
postFixup() {
|
||||||
|
fixDarwinDylibNamesIn "$prefix"
|
||||||
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
{ stdenv, fetchurl, icu, expat, zlib, bzip2, python
|
{ stdenv, fetchurl, icu, expat, zlib, bzip2, python, fixDarwinDylibNames
|
||||||
, toolset ? null
|
, toolset ? null
|
||||||
, enableRelease ? true
|
, enableRelease ? true
|
||||||
, enableDebug ? false
|
, enableDebug ? false
|
||||||
|
@ -59,7 +59,9 @@ stdenv.mkDerivation {
|
||||||
|
|
||||||
enableParallelBuilding = true;
|
enableParallelBuilding = true;
|
||||||
|
|
||||||
buildInputs = [icu expat zlib bzip2 python];
|
buildInputs =
|
||||||
|
[ icu expat zlib bzip2 python ]
|
||||||
|
++ stdenv.lib.optional stdenv.isDarwin fixDarwinDylibNames;
|
||||||
|
|
||||||
configureScript = "./bootstrap.sh";
|
configureScript = "./bootstrap.sh";
|
||||||
configureFlags = "--with-icu=${icu} --with-python=${python}/bin/python" + withToolset;
|
configureFlags = "--with-icu=${icu} --with-python=${python}/bin/python" + withToolset;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
{ stdenv, fetchurl, gyp, utillinux, python }:
|
{ stdenv, fetchurl, gyp, utillinux, python, fixDarwinDylibNames }:
|
||||||
|
|
||||||
let
|
let
|
||||||
version = "2.1";
|
version = "2.1";
|
||||||
|
@ -16,7 +16,10 @@ in stdenv.mkDerivation {
|
||||||
|
|
||||||
buildFlags = [ "BUILDTYPE=Release" ];
|
buildFlags = [ "BUILDTYPE=Release" ];
|
||||||
|
|
||||||
buildInputs = [ gyp ] ++ (stdenv.lib.optional stdenv.isLinux utillinux) ++ stdenv.lib.optional stdenv.isDarwin python;
|
buildInputs =
|
||||||
|
[ gyp ]
|
||||||
|
++ stdenv.lib.optional stdenv.isLinux utillinux
|
||||||
|
++ stdenv.lib.optionals stdenv.isDarwin [ python fixDarwinDylibNames ];
|
||||||
|
|
||||||
doCheck = !stdenv.isDarwin;
|
doCheck = !stdenv.isDarwin;
|
||||||
|
|
||||||
|
@ -33,11 +36,6 @@ in stdenv.mkDerivation {
|
||||||
mv http_parser.h $out/include
|
mv http_parser.h $out/include
|
||||||
'';
|
'';
|
||||||
|
|
||||||
postFixup = if stdenv.isDarwin then ''
|
|
||||||
install_name_tool -id $out/lib/libhttp_parser.dylib $out/lib/libhttp_parser.dylib
|
|
||||||
install_name_tool -id $out/lib/libhttp_parser_strict.dylib $out/lib/libhttp_parser_strict.dylib
|
|
||||||
'' else null;
|
|
||||||
|
|
||||||
meta = {
|
meta = {
|
||||||
description = "An HTTP message parser written in C";
|
description = "An HTTP message parser written in C";
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
{stdenv, fetchurl}:
|
{ stdenv, fetchurl, fixDarwinDylibNames }:
|
||||||
|
|
||||||
let
|
let
|
||||||
|
|
||||||
|
@ -16,6 +16,10 @@ stdenv.mkDerivation {
|
||||||
sha256 = "14l0kl17nirc34frcybzg0snknaks23abhdxkmsqg3k9sil5wk9g";
|
sha256 = "14l0kl17nirc34frcybzg0snknaks23abhdxkmsqg3k9sil5wk9g";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
# FIXME: This fixes dylib references in the dylibs themselves, but
|
||||||
|
# not in the programs in $out/bin.
|
||||||
|
buildInputs = stdenv.lib.optional stdenv.isDarwin fixDarwinDylibNames;
|
||||||
|
|
||||||
postUnpack = ''
|
postUnpack = ''
|
||||||
sourceRoot=''${sourceRoot}/source
|
sourceRoot=''${sourceRoot}/source
|
||||||
echo Source root reset to ''${sourceRoot}
|
echo Source root reset to ''${sourceRoot}
|
||||||
|
|
|
@ -394,6 +394,8 @@ let
|
||||||
|
|
||||||
setJavaClassPath = makeSetupHook { } ../build-support/setup-hooks/set-java-classpath.sh;
|
setJavaClassPath = makeSetupHook { } ../build-support/setup-hooks/set-java-classpath.sh;
|
||||||
|
|
||||||
|
fixDarwinDylibNames = makeSetupHook { } ../build-support/setup-hooks/fix-darwin-dylib-names.sh;
|
||||||
|
|
||||||
|
|
||||||
### TOOLS
|
### TOOLS
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue