diff options
author | James Hilliard <james.hilliard1@gmail.com> | 2020-07-18 17:01:33 -0600 |
---|---|---|
committer | Jussi Pakkanen <jpakkane@gmail.com> | 2020-07-30 16:36:11 +0300 |
commit | 1ce4258c219fe08b6d6eaa6aa944f27d91d054cb (patch) | |
tree | 7b5d804fca5f7cab66878e435f2c169164c85576 /mesonbuild/backend/backends.py | |
parent | bc2338efd33dce9f07ecc2942e090f56006596e8 (diff) | |
download | meson-1ce4258c219fe08b6d6eaa6aa944f27d91d054cb.zip meson-1ce4258c219fe08b6d6eaa6aa944f27d91d054cb.tar.gz meson-1ce4258c219fe08b6d6eaa6aa944f27d91d054cb.tar.bz2 |
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>
Diffstat (limited to 'mesonbuild/backend/backends.py')
-rw-r--r-- | mesonbuild/backend/backends.py | 30 |
1 files changed, 28 insertions, 2 deletions
diff --git a/mesonbuild/backend/backends.py b/mesonbuild/backend/backends.py index cfd3a39..e053f67 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 @@ class Backend: 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): |