aboutsummaryrefslogtreecommitdiff
path: root/nixpkgs/pkgs/applications/graphics/apitrace/default.nix
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/applications/graphics/apitrace/default.nix')
-rw-r--r--nixpkgs/pkgs/applications/graphics/apitrace/default.nix45
1 files changed, 43 insertions, 2 deletions
diff --git a/nixpkgs/pkgs/applications/graphics/apitrace/default.nix b/nixpkgs/pkgs/applications/graphics/apitrace/default.nix
index f6f9cb281a7..e6865d2d8f0 100644
--- a/nixpkgs/pkgs/applications/graphics/apitrace/default.nix
+++ b/nixpkgs/pkgs/applications/graphics/apitrace/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, cmake, libX11, procps, python2, libdwarf, qtbase, qtwebkit }:
+{ stdenv, fetchFromGitHub, cmake, libX11, procps, python2, libdwarf, qtbase, qtwebkit, wrapQtAppsHook, libglvnd }:
stdenv.mkDerivation rec {
pname = "apitrace";
@@ -15,7 +15,48 @@ stdenv.mkDerivation rec {
# of games -- so it's fine to use e.g. bundled snappy.
buildInputs = [ libX11 procps python2 libdwarf qtbase qtwebkit ];
- nativeBuildInputs = [ cmake ];
+ nativeBuildInputs = [ cmake wrapQtAppsHook ];
+
+ # Don't automatically wrap all binaries, I prefer to explicitly only wrap
+ # `qapitrace`.
+ dontWrapQtApps = true;
+
+ postFixup = ''
+
+ # Since https://github.com/NixOS/nixpkgs/pull/60985, we add `/run-opengl-driver[-32]`
+ # to the `RUNPATH` of dispatcher libraries `dlopen()` ing OpenGL drivers.
+ # `RUNPATH` doesn't propagate throughout the whole application, but only
+ # from the module performing the `dlopen()`.
+ #
+ # Apitrace wraps programs by running them with `LD_PRELOAD` pointing to `.so`
+ # files in $out/lib/apitrace/wrappers.
+ #
+ # Theses wrappers effectively wrap the `dlopen()` calls from `libglvnd`
+ # and other dispatcher libraries, and run `dlopen()` by themselves.
+ #
+ # As `RUNPATH` doesn't propagate through the whole library, and they're now the
+ # library doing the real `dlopen()`, they also need to have
+ # `/run-opengl-driver[-32]` added to their `RUNPATH`.
+ #
+ # To stay simple, we add paths for 32 and 64 bits unconditionally.
+ # This doesn't have an impact on closure size, and if the 32 bit drivers
+ # are not available, that folder is ignored.
+ for i in $out/lib/apitrace/wrappers/*.so
+ do
+ echo "Patching OpenGL driver path for $i"
+ patchelf --set-rpath "/run/opengl-driver/lib:/run/opengl-driver-32/lib:$(patchelf --print-rpath $i)" $i
+ done
+
+ # Theses open the OpenGL driver at runtime, but it is not listed as NEEDED libraries. They need
+ # a reference to libglvnd.
+ for i in $out/bin/eglretrace $out/bin/glretrace
+ do
+ echo "Patching RPath for $i"
+ patchelf --set-rpath "${stdenv.lib.makeLibraryPath [libglvnd]}:$(patchelf --print-rpath $i)" $i
+ done
+
+ wrapQtApp $out/bin/qapitrace
+ '';
meta = with stdenv.lib; {
homepage = "https://apitrace.github.io";