From 014b59a4b891ecdec0e162677360d0777dfb5a7a Mon Sep 17 00:00:00 2001 From: Jan Tojnar Date: Sun, 1 May 2022 00:06:19 +0200 Subject: [PATCH] umockdev: Make library path references absolute This simplifies consumers a lot. --- .../libraries/umockdev/default.nix | 21 ++++++ .../libraries/umockdev/hardcode-paths.patch | 69 +++++++++++++++++++ 2 files changed, 90 insertions(+) create mode 100644 pkgs/development/libraries/umockdev/hardcode-paths.patch diff --git a/pkgs/development/libraries/umockdev/default.nix b/pkgs/development/libraries/umockdev/default.nix index fd35a94922e6..a389d204a83e 100644 --- a/pkgs/development/libraries/umockdev/default.nix +++ b/pkgs/development/libraries/umockdev/default.nix @@ -28,6 +28,12 @@ stdenv.mkDerivation rec { sha256 = "sha256-FEmWjJVmKKckC30zULGI/mZ3VNtirnweZq2gKh/Y5VE="; }; + patches = [ + # Hardcode absolute paths to libraries so that consumers + # do not need to set LD_LIBRARY_PATH themselves. + ./hardcode-paths.patch + ]; + nativeBuildInputs = [ docbook-xsl-nons gobject-introspection @@ -57,6 +63,21 @@ stdenv.mkDerivation rec { doCheck = true; + postPatch = '' + # Substitute the path to this derivation in the patch we apply. + substituteInPlace src/umockdev-wrapper \ + --subst-var-by 'LIBDIR' "''${!outputLib}/lib" + ''; + + preCheck = '' + # Our patch makes the path to the `LD_PRELOAD`ed library absolute. + # When running tests, the library is not yet installed, though, + # so we need to replace the absolute path with a local one during build. + # We are using a symlink that will be overridden during installation. + mkdir -p "$out/lib" + ln -s "$PWD/libumockdev-preload.so.0" "$out/lib/libumockdev-preload.so.0" + ''; + meta = with lib; { description = "Mock hardware devices for creating unit tests"; license = licenses.lgpl21Plus; diff --git a/pkgs/development/libraries/umockdev/hardcode-paths.patch b/pkgs/development/libraries/umockdev/hardcode-paths.patch new file mode 100644 index 000000000000..91f1e928ec60 --- /dev/null +++ b/pkgs/development/libraries/umockdev/hardcode-paths.patch @@ -0,0 +1,69 @@ +diff --git a/meson.build b/meson.build +index 2ed9027..1f6bbf2 100644 +--- a/meson.build ++++ b/meson.build +@@ -38,6 +38,7 @@ g_ir_compiler = find_program('g-ir-compiler', required: false) + + conf.set('PACKAGE_NAME', meson.project_name()) + conf.set_quoted('VERSION', meson.project_version()) ++conf.set_quoted('LIBDIR', get_option('prefix') / get_option('libdir')) + + # glibc versions somewhere between 2.28 and 2.34 + if cc.has_function('__fxstatat', prefix: '#include ') +@@ -148,7 +149,7 @@ hacked_gir = custom_target('UMockdev-1.0 hacked gir', + + if g_ir_compiler.found() + umockdev_typelib = custom_target('UMockdev-1.0 typelib', +- command: [g_ir_compiler, '--output', '@OUTPUT@', '-l', 'libumockdev.so.0', '@INPUT@'], ++ command: [g_ir_compiler, '--output', '@OUTPUT@', '-l', get_option('prefix') / get_option('libdir') / 'libumockdev.so.0', '@INPUT@'], + input: hacked_gir, + output: 'UMockdev-1.0.typelib', + install: true, +diff --git a/src/config.vapi b/src/config.vapi +index 5269dd0..a2ec46d 100644 +--- a/src/config.vapi ++++ b/src/config.vapi +@@ -2,5 +2,6 @@ + namespace Config { + public const string PACKAGE_NAME; + public const string VERSION; ++ public const string LIBDIR; + } + +diff --git a/src/umockdev-record.vala b/src/umockdev-record.vala +index 8434d32..68c7f8e 100644 +--- a/src/umockdev-record.vala ++++ b/src/umockdev-record.vala +@@ -435,7 +435,7 @@ main (string[] args) + preload = ""; + else + preload = preload + ":"; +- Environment.set_variable("LD_PRELOAD", preload + "libumockdev-preload.so.0", true); ++ Environment.set_variable("LD_PRELOAD", preload + Config.LIBDIR + "/libumockdev-preload.so.0", true); + + try { + root_dir = DirUtils.make_tmp("umockdev.XXXXXX"); +diff --git a/src/umockdev-run.vala b/src/umockdev-run.vala +index 9a1ba10..6df2522 100644 +--- a/src/umockdev-run.vala ++++ b/src/umockdev-run.vala +@@ -95,7 +95,7 @@ main (string[] args) + preload = ""; + else + preload = preload + ":"; +- Environment.set_variable ("LD_PRELOAD", preload + "libumockdev-preload.so.0", true); ++ Environment.set_variable ("LD_PRELOAD", preload + Config.LIBDIR + "/libumockdev-preload.so.0", true); + + var testbed = new UMockdev.Testbed (); + +diff --git a/src/umockdev-wrapper b/src/umockdev-wrapper +index 6ce4dcd..706c49a 100755 +--- a/src/umockdev-wrapper ++++ b/src/umockdev-wrapper +@@ -1,5 +1,5 @@ + #!/bin/sh + # Wrapper program to preload the libumockdev library, so that test programs can + # set $UMOCKDEV_DIR for redirecting sysfs and other queries to a test bed. +-exec env LD_PRELOAD=libumockdev-preload.so.0:$LD_PRELOAD "$@" ++exec env LD_PRELOAD=@LIBDIR@/libumockdev-preload.so.0:$LD_PRELOAD "$@" +