meson: backport upstream rpath fix
authorRosen Penev <rosenp@gmail.com>
Sat, 1 Aug 2020 16:19:17 +0000 (09:19 -0700)
committerRosen Penev <rosenp@gmail.com>
Sat, 1 Aug 2020 16:34:17 +0000 (09:34 -0700)
-Wl,rpath= does not work with clang, yet -Wl,rpath, does not work with
meson. Backport upstream patch fixing this.

Signed-off-by: Rosen Penev <rosenp@gmail.com>
devel/meson/Makefile
devel/meson/patches/020-rpath.patch [new file with mode: 0644]

index 8c1a5ef3dfe6a89d600474034598101ac858d4da..dde088cce0f5f56a89725edb89d131bc82707dd4 100644 (file)
@@ -2,7 +2,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=meson
 PKG_VERSION:=0.55.0
-PKG_RELEASE:=2
+PKG_RELEASE:=3
 
 PYPI_NAME:=meson
 PKG_HASH:=0a1ae2bfe2ae14ac47593537f93290fb79e9b775c55b4c53c282bc3ca3745b35
diff --git a/devel/meson/patches/020-rpath.patch b/devel/meson/patches/020-rpath.patch
new file mode 100644 (file)
index 0000000..ef1b121
--- /dev/null
@@ -0,0 +1,118 @@
+From 1ce4258c219fe08b6d6eaa6aa944f27d91d054cb Mon Sep 17 00:00:00 2001
+From: James Hilliard <james.hilliard1@gmail.com>
+Date: Sat, 18 Jul 2020 17:01:33 -0600
+Subject: [PATCH] backends: fix rpath match pattern
+
+Since -Wl,-rpath= is not the only valid rpath ldflags syntax we
+need to try and match all valid rpath ldflags.
+
+In addition we should prevent -Wl,--just-symbols from being used to
+set rpath due to inconsistent compiler support.
+
+Signed-off-by: James Hilliard <james.hilliard1@gmail.com>
+---
+ mesonbuild/backend/backends.py | 30 ++++++++++++++++++++++++--
+ run_unittests.py               | 39 +++++++++++++++++++++++-----------
+ 2 files changed, 55 insertions(+), 14 deletions(-)
+
+diff --git a/mesonbuild/backend/backends.py b/mesonbuild/backend/backends.py
+index cfd3a397fd..e053f67e6b 100644
+--- a/mesonbuild/backend/backends.py
++++ b/mesonbuild/backend/backends.py
+@@ -14,6 +14,7 @@
+ from collections import OrderedDict
+ from functools import lru_cache
++from pathlib import Path
+ import enum
+ import json
+ import os
+@@ -455,10 +456,35 @@ def get_external_rpath_dirs(self, target):
+                 args.extend(self.environment.coredata.get_external_link_args(target.for_machine, lang))
+             except Exception:
+                 pass
++        # Match rpath formats:
++        # -Wl,-rpath=
++        # -Wl,-rpath,
++        rpath_regex = re.compile(r'-Wl,-rpath[=,]([^,]+)')
++        # Match solaris style compat runpath formats:
++        # -Wl,-R
++        # -Wl,-R,
++        runpath_regex = re.compile(r'-Wl,-R[,]?([^,]+)')
++        # Match symbols formats:
++        # -Wl,--just-symbols=
++        # -Wl,--just-symbols,
++        symbols_regex = re.compile(r'-Wl,--just-symbols[=,]([^,]+)')
+         for arg in args:
+-            if arg.startswith('-Wl,-rpath='):
+-                for dir in arg.replace('-Wl,-rpath=','').split(':'):
++            rpath_match = rpath_regex.match(arg)
++            if rpath_match:
++                for dir in rpath_match.group(1).split(':'):
+                     dirs.add(dir)
++            runpath_match = runpath_regex.match(arg)
++            if runpath_match:
++                for dir in runpath_match.group(1).split(':'):
++                    # The symbols arg is an rpath if the path is a directory
++                    if Path(dir).is_dir():
++                        dirs.add(dir)
++            symbols_match = symbols_regex.match(arg)
++            if symbols_match:
++                for dir in symbols_match.group(1).split(':'):
++                    # Prevent usage of --just-symbols to specify rpath
++                    if Path(dir).is_dir():
++                        raise MesonException('Invalid arg for --just-symbols, {} is a directory.'.format(dir))
+         return dirs
+     def rpaths_for_bundled_shared_libraries(self, target, exclude_system=True):
+diff --git a/run_unittests.py b/run_unittests.py
+index b5294b9f82..73131c75b7 100755
+--- a/run_unittests.py
++++ b/run_unittests.py
+@@ -6451,19 +6451,34 @@ def test_global_rpath(self):
+         self.init(yonder_dir)
+         self.build()
+         self.install(use_destdir=False)
+-        self.new_builddir()
+-        # Build an app that uses that installed library.
+-        # Supply the rpath to the installed library via LDFLAGS
+-        # (as systems like buildroot and guix are wont to do)
+-        # and verify install preserves that rpath.
+-        env = {'LDFLAGS': '-Wl,-rpath=' + yonder_libdir,
+-               'PKG_CONFIG_PATH': os.path.join(yonder_libdir, 'pkgconfig')}
+-        self.init(testdir, override_envvars=env)
+-        self.build()
+-        self.install(use_destdir=False)
+-        got_rpath = get_rpath(os.path.join(yonder_prefix, 'bin/rpathified'))
+-        self.assertEqual(got_rpath, yonder_libdir)
++        # Since rpath has multiple valid formats we need to
++        # test that they are all properly used.
++        rpath_formats = [
++            ('-Wl,-rpath=', False),
++            ('-Wl,-rpath,', False),
++            ('-Wl,--just-symbols=', True),
++            ('-Wl,--just-symbols,', True),
++            ('-Wl,-R', False),
++            ('-Wl,-R,', False)
++        ]
++        for rpath_format, exception in rpath_formats:
++            # Build an app that uses that installed library.
++            # Supply the rpath to the installed library via LDFLAGS
++            # (as systems like buildroot and guix are wont to do)
++            # and verify install preserves that rpath.
++            self.new_builddir()
++            env = {'LDFLAGS': rpath_format + yonder_libdir,
++                   'PKG_CONFIG_PATH': os.path.join(yonder_libdir, 'pkgconfig')}
++            if exception:
++                with self.assertRaises(subprocess.CalledProcessError):
++                    self.init(testdir, override_envvars=env)
++                break
++            self.init(testdir, override_envvars=env)
++            self.build()
++            self.install(use_destdir=False)
++            got_rpath = get_rpath(os.path.join(yonder_prefix, 'bin/rpathified'))
++            self.assertEqual(got_rpath, yonder_libdir, rpath_format)
+     @skip_if_not_base_option('b_sanitize')
+     def test_pch_with_address_sanitizer(self):