diff options
author | Nikolay Amiantov <ab@fmap.me> | 2019-05-22 18:19:55 +0200 |
---|---|---|
committer | Ambroz Bizjak <abizjak.pro@gmail.com> | 2019-05-22 18:19:55 +0200 |
commit | 2874e849d99e4e96154fc2a7ce4b2e5d8ed4e699 (patch) | |
tree | ff1733892a8af3d330b063de2da50fe2d9317ad2 /pkgs/build-support/add-opengl-runpath/setup-hook.sh | |
parent | bae81580a2e6c8d6ba163133b3320339b498bb6b (diff) | |
download | nixlib-2874e849d99e4e96154fc2a7ce4b2e5d8ed4e699.tar nixlib-2874e849d99e4e96154fc2a7ce4b2e5d8ed4e699.tar.gz nixlib-2874e849d99e4e96154fc2a7ce4b2e5d8ed4e699.tar.bz2 nixlib-2874e849d99e4e96154fc2a7ce4b2e5d8ed4e699.tar.lz nixlib-2874e849d99e4e96154fc2a7ce4b2e5d8ed4e699.tar.xz nixlib-2874e849d99e4e96154fc2a7ce4b2e5d8ed4e699.tar.zst nixlib-2874e849d99e4e96154fc2a7ce4b2e5d8ed4e699.zip |
addOpenGLRunpath: Add new hook for setting RUNPATH.
This hook allows to add NixOS driver libraries path to given ELF objects' RUNPATH. We use it instead of settings RUNPATH manually everywhere. It must be invoked in postFixup so that RUNPATH stripping does not remove the path. It puts the path first instead of last so that system-wide drivers are always preferred.
Diffstat (limited to 'pkgs/build-support/add-opengl-runpath/setup-hook.sh')
-rw-r--r-- | pkgs/build-support/add-opengl-runpath/setup-hook.sh | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/pkgs/build-support/add-opengl-runpath/setup-hook.sh b/pkgs/build-support/add-opengl-runpath/setup-hook.sh new file mode 100644 index 000000000000..7645033ca206 --- /dev/null +++ b/pkgs/build-support/add-opengl-runpath/setup-hook.sh @@ -0,0 +1,28 @@ +# Set RUNPATH so that driver libraries in /run/opengl-driver(-32)/lib can be found. +# This is needed to not rely on LD_LIBRARY_PATH which does not work with setuid +# executables. Fixes https://github.com/NixOS/nixpkgs/issues/22760. It must be run +# in postFixup because RUNPATH stripping in fixup would undo it. Note that patchelf +# actually sets RUNPATH not RPATH, which applies only to dependencies of the binary +# it set on (including for dlopen), so the RUNPATH must indeed be set on these +# libraries and would not work if set only on executables. +addOpenGLRunpath() { + local forceRpath= + + while [ $# -gt 0 ]; do + case "$1" in + --) shift; break;; + --force-rpath) shift; forceRpath=1;; + --*) + echo "addOpenGLRunpath: ERROR: Invalid command line" \ + "argument: $1" >&2 + return 1;; + *) break;; + esac + done + + for file in "$@"; do + local origRpath="$(patchelf --print-rpath "$file")" + patchelf --set-rpath "@driverLink@/lib:$origRpath" ${forceRpath:+--force-rpath} "$file" + done +} + |