aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/modules/gnome.py
diff options
context:
space:
mode:
authorNirbheek Chauhan <nirbheek@centricular.com>2018-08-14 21:12:14 +0530
committerNirbheek Chauhan <nirbheek.chauhan@gmail.com>2018-08-15 06:16:35 -0700
commitab1dbfe57fcbb95c1dd00857b14f763347cf50fa (patch)
treec5dd7bd60f595a562c660299b24b0d89d31986dd /mesonbuild/modules/gnome.py
parentd16dca767707654e756dd61913e15ae3c8f16814 (diff)
downloadmeson-ab1dbfe57fcbb95c1dd00857b14f763347cf50fa.zip
meson-ab1dbfe57fcbb95c1dd00857b14f763347cf50fa.tar.gz
meson-ab1dbfe57fcbb95c1dd00857b14f763347cf50fa.tar.bz2
gnome: Filter LDFLAGS passed to g-ir-scanner
g-ir-scanner is very picky about the flags that it can accept, so the build fails on macOS if you have Framework external dependencies, which add -F and -framework arguments. Also fix incorrect de-duping of -framework arguments for gtkdoc.
Diffstat (limited to 'mesonbuild/modules/gnome.py')
-rw-r--r--mesonbuild/modules/gnome.py49
1 files changed, 35 insertions, 14 deletions
diff --git a/mesonbuild/modules/gnome.py b/mesonbuild/modules/gnome.py
index cc8b7eb..c5897c0 100644
--- a/mesonbuild/modules/gnome.py
+++ b/mesonbuild/modules/gnome.py
@@ -314,10 +314,13 @@ class GnomeModule(ExtensionModule):
return link_command
def _get_dependencies_flags(self, deps, state, depends, include_rpath=False,
- use_gir_args=False):
+ use_gir_args=False, separate_nodedup=False):
cflags = OrderedSet()
internal_ldflags = OrderedSet()
external_ldflags = OrderedSet()
+ # External linker flags that can't be de-duped reliably because they
+ # require two args in order, such as -framework AVFoundation
+ external_ldflags_nodedup = []
gi_includes = OrderedSet()
deps = mesonlib.listify(deps, unholder=True)
@@ -329,17 +332,19 @@ class GnomeModule(ExtensionModule):
lib = lib.held_object
internal_ldflags.update(self._get_link_args(state, lib, depends, include_rpath))
libdepflags = self._get_dependencies_flags(lib.get_external_deps(), state, depends, include_rpath,
- use_gir_args)
+ use_gir_args, True)
cflags.update(libdepflags[0])
internal_ldflags.update(libdepflags[1])
external_ldflags.update(libdepflags[2])
- gi_includes.update(libdepflags[3])
+ external_ldflags_nodedup += libdepflags[3]
+ gi_includes.update(libdepflags[4])
extdepflags = self._get_dependencies_flags(dep.ext_deps, state, depends, include_rpath,
- use_gir_args)
+ use_gir_args, True)
cflags.update(extdepflags[0])
internal_ldflags.update(extdepflags[1])
external_ldflags.update(extdepflags[2])
- gi_includes.update(extdepflags[3])
+ external_ldflags_nodedup += extdepflags[3]
+ gi_includes.update(extdepflags[4])
for source in dep.sources:
if hasattr(source, 'held_object'):
source = source.held_object
@@ -349,7 +354,8 @@ class GnomeModule(ExtensionModule):
# 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(raw=True):
+ ldflags = iter(dep.get_link_args(raw=True))
+ for lib in ldflags:
if (os.path.isabs(lib) and
# For PkgConfigDependency only:
getattr(dep, 'is_libtool', False)):
@@ -362,10 +368,15 @@ class GnomeModule(ExtensionModule):
libname = libname[3:]
libname = libname.split(".so")[0]
lib = "-l%s" % libname
- # Hack to avoid passing some compiler options in
+ # FIXME: Hack to avoid passing some compiler options in
if lib.startswith("-W"):
continue
- external_ldflags.update([lib])
+ # If it's a framework arg, slurp the framework name too
+ # to preserve the order of arguments
+ if lib == '-framework':
+ external_ldflags_nodedup += [lib, next(ldflags)]
+ else:
+ external_ldflags.update([lib])
if isinstance(dep, PkgConfigDependency):
girdir = dep.get_pkgconfig_variable("girdir", {'default': ''})
@@ -383,13 +394,16 @@ class GnomeModule(ExtensionModule):
fixed_ldflags = OrderedSet()
for ldflag in ldflags:
if ldflag.startswith("-l"):
- fixed_ldflags.add(ldflag.replace('-l', '--extra-library=', 1))
- else:
- fixed_ldflags.add(ldflag)
+ ldflag = ldflag.replace('-l', '--extra-library=', 1)
+ fixed_ldflags.add(ldflag)
return fixed_ldflags
internal_ldflags = fix_ldflags(internal_ldflags)
external_ldflags = fix_ldflags(external_ldflags)
- return cflags, internal_ldflags, external_ldflags, gi_includes
+ if not separate_nodedup:
+ external_ldflags.update(external_ldflags_nodedup)
+ return cflags, internal_ldflags, external_ldflags, gi_includes
+ else:
+ return cflags, internal_ldflags, external_ldflags, external_ldflags_nodedup, gi_includes
def _unwrap_gir_target(self, girtarget):
while hasattr(girtarget, 'held_object'):
@@ -686,6 +700,13 @@ class GnomeModule(ExtensionModule):
if f.startswith(('-D', '-U', '-I')):
yield f
+ @staticmethod
+ def _get_scanner_ldflags(ldflags):
+ 'g-ir-scanner only accepts -L/-l; must ignore -F and other linker flags'
+ for f in ldflags:
+ if f.startswith(('-L', '-l', '--extra-library')):
+ yield f
+
@FeatureNewKwargs('build target', '0.40.0', ['build_by_default'])
@permittedKwargs({'sources', 'nsversion', 'namespace', 'symbol_prefix', 'identifier_prefix',
'export_packages', 'includes', 'dependencies', 'link_with', 'include_directories',
@@ -727,8 +748,8 @@ class GnomeModule(ExtensionModule):
self._get_dependencies_flags(deps, state, depends, use_gir_args=True)
cflags += list(self._get_scanner_cflags(dep_cflags))
cflags += list(self._get_scanner_cflags(self._get_external_args_for_langs(state, [lc[0] for lc in langs_compilers])))
- internal_ldflags += list(dep_internal_ldflags)
- external_ldflags += list(dep_external_ldflags)
+ internal_ldflags += list(self._get_scanner_ldflags(dep_internal_ldflags))
+ external_ldflags += list(self._get_scanner_ldflags(dep_external_ldflags))
girtargets_inc_dirs = self._get_gir_targets_inc_dirs(girtargets)
inc_dirs = self._scan_inc_dirs(kwargs)