meson: fix rpath fixup

In common distributions, RPATH is only needed for internal libraries so
meson removes everything else. With Nix, the locations of libraries
are not as predictable, therefore we need to keep them in the RPATH. [1]

Previously we have just kept the RPATH produced by the linker, patching
meson not to remove it. This deprived us of potentially replacing it
with install_rpath provided by project so we had to re-add it manually,
and also introduced a vulnerability of keeping build paths in RPATH.

This commit restores the clean-up but modifies it so the items starting
with /nix/store are retained.

This should be relatively safe since the store is immutable, however,
there might be some unwanted retainment of build_rpath [2] if it contains
paths from Nix store.

[1]: https://github.com/NixOS/nixpkgs/issues/31222#issuecomment-365811634
[2]: http://mesonbuild.com/Release-notes-for-0-42-0.html#added-build_rpath-keyword-argument
This commit is contained in:
Jan Tojnar 2018-02-23 01:42:35 +01:00
parent 33e6ef1790
commit de910a040b
No known key found for this signature in database
GPG Key ID: 7FAB2A15F7A607A4
2 changed files with 43 additions and 5 deletions

View File

@ -1,4 +1,4 @@
{ lib, python3Packages, stdenv, targetPlatform, writeTextDir, m4 }: let { lib, python3Packages, stdenv, targetPlatform, writeTextDir, substituteAll }: let
targetPrefix = lib.optionalString stdenv.isCross targetPrefix = lib.optionalString stdenv.isCross
(targetPlatform.config + "-"); (targetPlatform.config + "-");
in python3Packages.buildPythonApplication rec { in python3Packages.buildPythonApplication rec {
@ -27,11 +27,17 @@ in python3Packages.buildPythonApplication rec {
# We patch Meson to add a --fallback-library-path argument with # We patch Meson to add a --fallback-library-path argument with
# library install_dir to g-ir-scanner. # library install_dir to g-ir-scanner.
./gir-fallback-path.patch ./gir-fallback-path.patch
];
postPatch = '' # In common distributions, RPATH is only needed for internal libraries so
sed -i -e 's|e.fix_rpath(install_rpath)||' mesonbuild/scripts/meson_install.py # meson removes everything else. With Nix, the locations of libraries
''; # are not as predictable, therefore we need to keep them in the RPATH.
# At the moment we are keeping the paths starting with /nix/store.
# https://github.com/NixOS/nixpkgs/issues/31222#issuecomment-365811634
(substituteAll {
src = ./fix-rpath.patch;
inherit (builtins) storeDir;
})
];
setupHook = ./setup-hook.sh; setupHook = ./setup-hook.sh;

View File

@ -0,0 +1,32 @@
--- a/mesonbuild/compilers/compilers.py
+++ b/mesonbuild/compilers/compilers.py
@@ -846,8 +848,10 @@
if paths != '':
paths += ':'
paths += build_rpath
- if len(paths) < len(install_rpath):
- padding = 'X' * (len(install_rpath) - len(paths))
+ store_paths = ':'.join(filter(lambda path: path.startswith('@storeDir@'), paths.split(':')))
+ extra_space_needed = len(install_rpath + (':' if install_rpath and store_paths else '') + store_paths) - len(paths)
+ if extra_space_needed > 0:
+ padding = 'X' * extra_space_needed
if not paths:
paths = padding
else:
--- a/mesonbuild/scripts/depfixer.py
+++ b/mesonbuild/scripts/depfixer.py
@@ -300,6 +300,14 @@
return
self.bf.seek(rp_off)
old_rpath = self.read_str()
+
+ if new_rpath:
+ new_rpath += b':'
+ else:
+ new_rpath = b''
+
+ new_rpath += b':'.join(filter(lambda path: path.startswith(b'@storeDir@'), old_rpath.split(b':')))
+
if len(old_rpath) < len(new_rpath):
sys.exit("New rpath must not be longer than the old one.")
# The linker does read-only string deduplication. If there is a