package/meson: update rpath patch to upstream version

The version of this patch merged by upstream has some changes to rpath
syntax matching and handling for additional syntax edge cases.

Signed-off-by: James Hilliard <james.hilliard1@gmail.com>
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
This commit is contained in:
James Hilliard
2020-07-31 01:48:21 -06:00
committed by Thomas Petazzoni
parent b37fa74380
commit 16ed1d9fba

View File

@@ -1,4 +1,4 @@
From af4ac0284714842535106f3d5f8a973c20e95105 Mon Sep 17 00:00:00 2001 From 1ce4258c219fe08b6d6eaa6aa944f27d91d054cb Mon Sep 17 00:00:00 2001
From: James Hilliard <james.hilliard1@gmail.com> From: James Hilliard <james.hilliard1@gmail.com>
Date: Sat, 18 Jul 2020 17:01:33 -0600 Date: Sat, 18 Jul 2020 17:01:33 -0600
Subject: [PATCH] backends: fix rpath match pattern Subject: [PATCH] backends: fix rpath match pattern
@@ -6,23 +6,45 @@ Subject: [PATCH] backends: fix rpath match pattern
Since -Wl,-rpath= is not the only valid rpath ldflags syntax we Since -Wl,-rpath= is not the only valid rpath ldflags syntax we
need to try and match all valid rpath ldflags. 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> Signed-off-by: James Hilliard <james.hilliard1@gmail.com>
[Upstream status: [james.hilliard1@gmail.com: backport from upstream commit
https://github.com/mesonbuild/meson/pull/7472] 1ce4258c219fe08b6d6eaa6aa944f27d91d054cb]
--- ---
mesonbuild/backend/backends.py | 6 ++++-- mesonbuild/backend/backends.py | 30 ++++++++++++++++++++++++--
run_unittests.py | 26 +++++++++++++++----------- run_unittests.py | 39 +++++++++++++++++++++++-----------
2 files changed, 19 insertions(+), 13 deletions(-) 2 files changed, 55 insertions(+), 14 deletions(-)
diff --git a/mesonbuild/backend/backends.py b/mesonbuild/backend/backends.py diff --git a/mesonbuild/backend/backends.py b/mesonbuild/backend/backends.py
index cfd3a397f..6f44abc13 100644 index cfd3a397f..e053f67e6 100644
--- a/mesonbuild/backend/backends.py --- a/mesonbuild/backend/backends.py
+++ b/mesonbuild/backend/backends.py +++ b/mesonbuild/backend/backends.py
@@ -455,9 +455,11 @@ class Backend: @@ -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 @@ class Backend:
args.extend(self.environment.coredata.get_external_link_args(target.for_machine, lang)) args.extend(self.environment.coredata.get_external_link_args(target.for_machine, lang))
except Exception: except Exception:
pass pass
+ rpath_regex = re.compile(r'-Wl,-rpath(?:-link)?[=,]([^,@\-][^,]+)') + # 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: for arg in args:
- if arg.startswith('-Wl,-rpath='): - if arg.startswith('-Wl,-rpath='):
- for dir in arg.replace('-Wl,-rpath=','').split(':'): - for dir in arg.replace('-Wl,-rpath=','').split(':'):
@@ -30,15 +52,30 @@ index cfd3a397f..6f44abc13 100644
+ if rpath_match: + if rpath_match:
+ for dir in rpath_match.group(1).split(':'): + for dir in rpath_match.group(1).split(':'):
dirs.add(dir) 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 return dirs
def rpaths_for_bundled_shared_libraries(self, target, exclude_system=True):
diff --git a/run_unittests.py b/run_unittests.py diff --git a/run_unittests.py b/run_unittests.py
index 820b705b5..2c3ffc2e9 100755 index b5294b9f8..73131c75b 100755
--- a/run_unittests.py --- a/run_unittests.py
+++ b/run_unittests.py +++ b/run_unittests.py
@@ -6421,17 +6421,21 @@ class LinuxlikeTests(BasePlatformTests): @@ -6473,19 +6473,34 @@ class LinuxlikeTests(BasePlatformTests):
self.init(yonder_dir)
self.build()
self.install(use_destdir=False) self.install(use_destdir=False)
self.new_builddir() - self.new_builddir()
- # Build an app that uses that installed library. - # Build an app that uses that installed library.
- # Supply the rpath to the installed library via LDFLAGS - # Supply the rpath to the installed library via LDFLAGS
@@ -53,14 +90,26 @@ index 820b705b5..2c3ffc2e9 100755
- self.assertEqual(got_rpath, yonder_libdir) - self.assertEqual(got_rpath, yonder_libdir)
+ # Since rpath has multiple valid formats we need to + # Since rpath has multiple valid formats we need to
+ # test that they are all properly used. + # test that they are all properly used.
+ rpath_formats = ['-Wl,-rpath=', '-Wl,-rpath,', '-Wl,-rpath-link=', '-Wl,-rpath-link,'] + rpath_formats = [
+ for rpath_format in 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. + # Build an app that uses that installed library.
+ # Supply the rpath to the installed library via LDFLAGS + # Supply the rpath to the installed library via LDFLAGS
+ # (as systems like buildroot and guix are wont to do) + # (as systems like buildroot and guix are wont to do)
+ # and verify install preserves that rpath. + # and verify install preserves that rpath.
+ self.new_builddir()
+ env = {'LDFLAGS': rpath_format + yonder_libdir, + env = {'LDFLAGS': rpath_format + yonder_libdir,
+ 'PKG_CONFIG_PATH': os.path.join(yonder_libdir, 'pkgconfig')} + '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.init(testdir, override_envvars=env)
+ self.build() + self.build()
+ self.install(use_destdir=False) + self.install(use_destdir=False)