mirror of
https://github.com/NixOS/nixpkgs.git
synced 2024-12-23 22:23:15 +00:00
de910a040b
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
33 lines
1.2 KiB
Diff
33 lines
1.2 KiB
Diff
--- 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
|