diff --git a/pkgs/development/tools/build-managers/meson/default.nix b/pkgs/development/tools/build-managers/meson/default.nix index 8e4c5d4801a40..c5249ed7cc836 100644 --- a/pkgs/development/tools/build-managers/meson/default.nix +++ b/pkgs/development/tools/build-managers/meson/default.nix @@ -9,6 +9,8 @@ python3Packages.buildPythonApplication rec { sha256 = "0qn5hyzvam3rimn7g3671s1igj7fbkwdnf5nc8jr4d5swy25mq61"; }; + patchPhase = "cat ${./depfixer_patchelf.py} >> mesonbuild/scripts/depfixer.py"; + postFixup = '' pushd $out/bin # undo shell wrapper as meson tools are called with python @@ -18,10 +20,6 @@ python3Packages.buildPythonApplication rec { popd ''; - postPatch = '' - sed -i -e 's|e.fix_rpath(install_rpath)||' mesonbuild/scripts/meson_install.py - ''; - setupHook = ./setup-hook.sh; meta = with lib; { diff --git a/pkgs/development/tools/build-managers/meson/depfixer_patchelf.py b/pkgs/development/tools/build-managers/meson/depfixer_patchelf.py new file mode 100644 index 0000000000000..62bc198cd5849 --- /dev/null +++ b/pkgs/development/tools/build-managers/meson/depfixer_patchelf.py @@ -0,0 +1,35 @@ +import subprocess + +def _patchelf(*args): + p = subprocess.Popen(['patchelf'] + list(args), stdout=subprocess.PIPE, stderr=subprocess.PIPE) + p.wait() + if p.returncode == 0: + return p.communicate()[0].rstrip() + else: + return None + +class PatchElf(Elf): + def print_soname(self): + print(_patchelf('--print-soname', self.bfile) or 'This file does not have a soname.') + + def print_rpath(self): + print(_patchelf('--print-rpath', self.bfile) or 'This file does not have a runpath.') + + def fix_rpath(self, install_rpath): + if install_rpath: + old_rpath = _patchelf('--print-rpath', self.bfile) + if old_rpath: + new_rpath = old_rpath + b':' + bytes(install_rpath, 'utf-8') + if len(old_rpath) < len(new_rpath): + if self.verbose: + print('Expanding rpath beyond original capacity, setting dontStrip:') + print('https://github.com/NixOS/nixpkgs/pull/31228') + open('.nix-dont-strip', 'a').close() + else: + new_rpath = install_rpath + _patchelf('--set-rpath', new_rpath, self.bfile) + + def remove_rpath_entry(self): + _patchelf('--remove-rpath', self.bfile) + +Elf = PatchElf diff --git a/pkgs/development/tools/build-managers/meson/setup-hook.sh b/pkgs/development/tools/build-managers/meson/setup-hook.sh index dacad017ede0d..3d555cbe0317e 100644 --- a/pkgs/development/tools/build-managers/meson/setup-hook.sh +++ b/pkgs/development/tools/build-managers/meson/setup-hook.sh @@ -20,3 +20,13 @@ if [ -z "$dontUseMesonConfigure" -a -z "$configurePhase" ]; then setOutputFlags= configurePhase=mesonConfigurePhase fi + +mesonPreFixupPhase() { + for f in $(find . -name .nix-dont-strip); do + echo "Found $f, setting dontStrip" + export dontStrip=1 + rm $f + done +} + +preFixupPhases+=(mesonPreFixupPhase)