aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNirbheek Chauhan <nirbheek@centricular.com>2018-08-14 20:58:35 +0530
committerNirbheek Chauhan <nirbheek@centricular.com>2018-09-03 20:16:05 +0530
commit2f6a7fdb58b6b9b8bbee1b95a4ba51af228b7474 (patch)
tree30f729ca32db0ee904147381f681b7b7b465e45e
parent98b396543eb4f8ce214b9e2767604d266a9b7ecb (diff)
downloadmeson-2f6a7fdb58b6b9b8bbee1b95a4ba51af228b7474.zip
meson-2f6a7fdb58b6b9b8bbee1b95a4ba51af228b7474.tar.gz
meson-2f6a7fdb58b6b9b8bbee1b95a4ba51af228b7474.tar.bz2
gnome: Filter CFLAGS and 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 dependencies, which add -F and -framework arguments. Also filter CFLAGS because that's also similarly restrictive. https://github.com/mesonbuild/meson/pull/4024
-rw-r--r--mesonbuild/modules/gnome.py68
1 files changed, 49 insertions, 19 deletions
diff --git a/mesonbuild/modules/gnome.py b/mesonbuild/modules/gnome.py
index cb69641..dd8b555 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)
@@ -328,18 +331,21 @@ class GnomeModule(ExtensionModule):
if hasattr(lib, 'held_object'):
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)
+ libdepflags = self._get_dependencies_flags(lib.get_external_deps(), state,
+ depends, include_rpath,
+ use_gir_args, True)
cflags.update(libdepflags[0])
internal_ldflags.update(libdepflags[1])
external_ldflags.update(libdepflags[2])
- gi_includes.update(libdepflags[3])
- extdepflags = self._get_dependencies_flags(dep.ext_deps, state, depends, include_rpath,
- use_gir_args)
+ 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, 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 +355,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 +369,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': ''})
@@ -380,16 +392,34 @@ class GnomeModule(ExtensionModule):
if gir_has_extra_lib_arg(self.interpreter) and use_gir_args:
def fix_ldflags(ldflags):
- fixed_ldflags = OrderedSet()
+ 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
+
+ @staticmethod
+ def _get_scanner_cflags(cflags):
+ 'g-ir-scanner only accepts -I/-D/-U; must ignore all other flags'
+ for f in cflags:
+ 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',
@@ -574,12 +604,12 @@ class GnomeModule(ExtensionModule):
# are not used here.
dep_cflags, dep_internal_ldflags, dep_external_ldflags, gi_includes = \
self._get_dependencies_flags(deps, state, depends, use_gir_args=True)
- cflags += list(dep_cflags)
- internal_ldflags += list(dep_internal_ldflags)
- external_ldflags += list(dep_external_ldflags)
+ cflags += list(self._get_scanner_cflags(dep_cflags))
+ cflags += list(self._get_scanner_cflags(state.environment.coredata.get_external_args(lang)))
+ internal_ldflags += list(self._get_scanner_ldflags(dep_internal_ldflags))
+ external_ldflags += list(self._get_scanner_ldflags(dep_external_ldflags))
scan_command += ['--cflags-begin']
scan_command += cflags
- scan_command += state.environment.coredata.get_external_args(lang)
scan_command += ['--cflags-end']
# need to put our output directory first as we need to use the
# generated libraries instead of any possibly installed system/prefix