Skip to content

Commit

Permalink
gnome: Use raw link arguments with g-ir and gtk-doc
Browse files Browse the repository at this point in the history
Those tools use our arguments to build a file and execute it to
introspect it at runtime. However, they do not know that you can pass
the full path to the library to use, and ignore the arguments.

The long-term fix for this is to have them output a .c file that Meson
will build for them, which they can then run, but that will require
upstream changes:
https://gitlab.gnome.org/GNOME/gtk-doc/merge_requests/1

Closes mesonbuild#3774
  • Loading branch information
nirbheek committed Jul 1, 2018
1 parent cb36add commit 5113eb1
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 19 deletions.
41 changes: 27 additions & 14 deletions mesonbuild/dependencies/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,9 @@ def __init__(self, type_name, kwargs):
self.type_name = type_name
self.compile_args = []
self.link_args = []
# Raw -L and -l arguments without manual library searching
# If None, self.link_args will be used
self.raw_link_args = None
self.sources = []
self.methods = self._process_method_kw(kwargs)

Expand All @@ -111,7 +114,9 @@ def __repr__(self):
def get_compile_args(self):
return self.compile_args

def get_link_args(self):
def get_link_args(self, raw=False):
if raw and self.raw_link_args is not None:
return self.raw_link_args
return self.link_args

def found(self):
Expand Down Expand Up @@ -592,9 +597,18 @@ def _set_libs(self):
if ret != 0:
raise DependencyException('Could not generate libs for %s:\n\n%s' %
(self.name, out))
# Also get the 'raw' output without -Lfoo system paths for usage when
# a library can't be found, and also in gnome.generate_gir
# + gnome.gtkdoc which need -L -l arguments.
ret, out_raw = self._call_pkgbin(libcmd)
if ret != 0:
raise DependencyException('Could not generate libs for %s:\n\n%s' %
(self.name, out_raw))
link_args = []
raw_link_args = []
# Library paths should be safe to de-dup
libpaths = OrderedSet()
raw_libpaths = OrderedSet()
# Track -lfoo libraries to avoid duplicate work
libs_found = OrderedSet()
# Track not-found libraries to know whether to add library paths
Expand Down Expand Up @@ -660,12 +674,19 @@ def _set_libs(self):
if lib in link_args:
continue
link_args.append(lib)
# Also store the raw link arguments, and store raw_libpaths
for lib in self._convert_mingw_paths(shlex.split(out_raw)):
if lib.startswith('-L') and not lib.startswith(('-L-l', '-L-L')):
raw_libpaths.add(lib[2:])
raw_link_args.append(lib)
# Set everything
self.link_args = link_args
self.raw_link_args = raw_link_args
# Add all -Lbar args if we have -lfoo args in link_args
if libs_notfound:
# Order of -L flags doesn't matter with ld, but it might with other
# linkers such as MSVC, so prepend them.
self.link_args = ['-L' + lp for lp in libpaths] + self.link_args
self.link_args = ['-L' + lp for lp in raw_libpaths] + self.link_args

def get_pkgconfig_variable(self, variable_name, kwargs):
options = ['--variable=' + variable_name, self.name]
Expand Down Expand Up @@ -987,7 +1008,7 @@ def __init__(self, name, link_args, environment, language, silent=False):
else:
mlog.log('Library', mlog.bold(name), 'found:', mlog.red('NO'))

def get_link_args(self, language=None):
def get_link_args(self, language=None, **kwargs):
'''
External libraries detected using a compiler must only be used with
compatible code. For instance, Vala libraries (.vapi files) cannot be
Expand All @@ -1000,7 +1021,7 @@ def get_link_args(self, language=None):
if (self.language == 'vala' and language != 'vala') or \
(language == 'vala' and self.language != 'vala'):
return []
return self.link_args
return super().get_link_args(**kwargs)

def get_partial_dependency(self, *, compile_args=False, link_args=False,
links=False, includes=False, sources=False):
Expand All @@ -1019,6 +1040,8 @@ def __init__(self, name, required, path, env, lang, kwargs):
self.required = required
self.detect(name, path)
if self.found():
self.compile_args = ['-I' + os.path.join(self.path, self.name, 'Headers')]
self.link_args = ['-F' + self.path, '-framework', self.name.split('.')[0]]
mlog.log('Dependency', mlog.bold(name), 'found:', mlog.green('YES'),
os.path.join(self.path, self.name))
else:
Expand All @@ -1044,16 +1067,6 @@ def detect(self, name, path):
if not self.found() and self.required:
raise DependencyException('Framework dependency %s not found.' % (name, ))

def get_compile_args(self):
if self.found():
return ['-I' + os.path.join(self.path, self.name, 'Headers')]
return []

def get_link_args(self):
if self.found():
return ['-F' + self.path, '-framework', self.name.split('.')[0]]
return []

def get_version(self):
return 'unknown'

Expand Down
6 changes: 3 additions & 3 deletions mesonbuild/dependencies/boost.py
Original file line number Diff line number Diff line change
Expand Up @@ -473,10 +473,10 @@ def extra_lib_dirs(self):
return [os.path.join(self.boost_root, 'lib')]
return []

def get_link_args(self):
def get_link_args(self, **kwargs):
args = []
for dir in self.extra_lib_dirs():
args += self.clib_compiler.get_linker_search_args(dir)
for d in self.extra_lib_dirs():
args += self.clib_compiler.get_linker_search_args(d)
for lib in self.requested_modules:
args += self.lib_modules['boost_' + lib]
return args
Expand Down
2 changes: 1 addition & 1 deletion mesonbuild/dependencies/dev.py
Original file line number Diff line number Diff line change
Expand Up @@ -261,5 +261,5 @@ class ValgrindDependency(PkgConfigDependency):
def __init__(self, env, kwargs):
super().__init__('valgrind', env, kwargs)

def get_link_args(self):
def get_link_args(self, **kwargs):
return []
2 changes: 1 addition & 1 deletion mesonbuild/modules/gnome.py
Original file line number Diff line number Diff line change
Expand Up @@ -349,7 +349,7 @@ def _get_dependencies_flags(self, deps, state, depends, include_rpath=False,
# This should be any dependency other than an internal one.
elif isinstance(dep, Dependency):
cflags.update(dep.get_compile_args())
for lib in dep.get_link_args():
for lib in dep.get_link_args(raw=True):
if (os.path.isabs(lib) and
# For PkgConfigDependency only:
getattr(dep, 'is_libtool', False)):
Expand Down

0 comments on commit 5113eb1

Please sign in to comment.