Merge pull request #1927 from centricular/gir-rpath-link

Work around GNU ld bug with -rpath,$ORIGIN
pull/1928/head
Jussi Pakkanen 8 years ago committed by GitHub
commit f792641b34
  1. 9
      mesonbuild/backend/backends.py
  2. 9
      mesonbuild/backend/ninjabackend.py
  3. 10
      mesonbuild/interpreter.py
  4. 43
      mesonbuild/modules/gnome.py

@ -294,6 +294,15 @@ class Backend:
raise MesonException(m.format(target.name))
return l
def determine_rpath_dirs(self, target):
link_deps = target.get_all_link_deps()
result = []
for ld in link_deps:
prospective = self.get_target_dir(ld)
if prospective not in result:
result.append(prospective)
return result
def object_filename_from_source(self, target, source, is_unity):
if isinstance(source, mesonlib.File):
source = source.fname

@ -2334,15 +2334,6 @@ rule FORTRAN_DEP_HACK
elem.add_item('LINK_ARGS', commands)
return elem
def determine_rpath_dirs(self, target):
link_deps = target.get_all_link_deps()
result = []
for ld in link_deps:
prospective = self.get_target_dir(ld)
if prospective not in result:
result.append(prospective)
return result
def get_dependency_filename(self, t):
if isinstance(t, build.SharedLibrary):
return os.path.join(self.get_target_private_dir(t), self.get_target_filename(t) + '.symbols')

@ -1011,10 +1011,9 @@ class CompilerHolder(InterpreterObject):
return []
ModuleState = namedtuple('ModuleState', [
'build_to_src', 'subdir', 'environment', 'project_name',
'project_version', 'compilers', 'targets', 'data', 'headers',
'man', 'global_args', 'project_args', 'build_machine',
'host_machine', 'target_machine'])
'build_to_src', 'subdir', 'environment', 'project_name', 'project_version',
'backend', 'compilers', 'targets', 'data', 'headers', 'man', 'global_args',
'project_args', 'build_machine', 'host_machine', 'target_machine'])
class ModuleHolder(InterpreterObject):
def __init__(self, modname, module, interpreter):
@ -1040,6 +1039,9 @@ class ModuleHolder(InterpreterObject):
environment=self.interpreter.environment,
project_name=self.interpreter.build.project_name,
project_version=self.interpreter.build.dep_manifest[self.interpreter.active_projectname],
# The backend object is under-used right now, but we will need it:
# https://github.com/mesonbuild/meson/issues/1419
backend=self.interpreter.backend,
compilers=self.interpreter.build.compilers,
targets=self.interpreter.build.targets,
data=self.interpreter.build.data,

@ -288,15 +288,23 @@ class GnomeModule(ExtensionModule):
def _get_link_args(self, state, lib, depends=None, include_rpath=False,
use_gir_args=False):
# Construct link args
if gir_has_extra_lib_arg() and use_gir_args:
link_command = ['--extra-library=%s' % lib.name]
link_command = ['--extra-library=' + lib.name]
else:
link_command = ['-l%s' % lib.name]
link_command = ['-l' + lib.name]
if isinstance(lib, build.SharedLibrary):
libdir = os.path.join(state.environment.get_build_dir(), lib.subdir)
link_command += ['-L%s' % libdir]
libdir = state.backend.get_target_dir(lib)
link_command.append('-L' + libdir)
# Needed for the following binutils bug:
# https://github.com/mesonbuild/meson/issues/1911
# However, g-ir-scanner does not understand -Wl,-rpath
# so we need to use -L instead
for d in state.backend.determine_rpath_dirs(lib):
d = os.path.join(state.environment.get_build_dir(), d)
link_command.append('-L' + d)
if include_rpath:
link_command += ['-Wl,-rpath %s' % libdir]
link_command.append('-Wl,-rpath,' + libdir)
if depends:
depends.append(lib)
return link_command
@ -435,12 +443,18 @@ class GnomeModule(ExtensionModule):
'Gir includes must be str, GirTarget, or list of them')
cflags = []
if state.global_args.get('c'):
cflags += state.global_args['c']
if state.project_args.get('c'):
cflags += state.project_args['c']
if 'c' in state.compilers:
compiler = state.compilers['c']
for lang, compiler in girtarget.compilers.items():
# XXX: Can you use g-i with any other language?
if lang in ('c', 'cpp', 'objc', 'objcpp', 'd'):
break
else:
lang = None
compiler = None
if lang and compiler:
if state.global_args.get(lang):
cflags += state.global_args[lang]
if state.project_args.get(lang):
cflags += state.project_args[lang]
sanitize = compiler.get_options().get('b_sanitize')
if sanitize:
cflags += compilers.sanitizer_compile_args(sanitize)
@ -536,6 +550,13 @@ class GnomeModule(ExtensionModule):
scan_command += ['--program', girtarget]
elif isinstance(girtarget, build.SharedLibrary):
libname = girtarget.get_basename()
# Needed for the following binutils bug:
# https://github.com/mesonbuild/meson/issues/1911
# However, g-ir-scanner does not understand -Wl,-rpath
# so we need to use -L instead
for d in state.backend.determine_rpath_dirs(girtarget):
d = os.path.join(state.environment.get_build_dir(), d)
scan_command.append('-L' + d)
scan_command += ['--library', libname]
scankwargs = {'output': girfile,
'input': libsources,

Loading…
Cancel
Save