aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/modules/gnome.py
diff options
context:
space:
mode:
authorMathieu Duponchelle <mathieu@centricular.com>2018-08-09 17:34:55 +0200
committerMathieu Duponchelle <mathieu@centricular.com>2018-08-09 17:34:55 +0200
commit6ea939dd5fb1401f87b57f72e1479aab3382069c (patch)
tree75247e36f21a4a5d71854cefc448f4519a6cde6a /mesonbuild/modules/gnome.py
parent8377ea45aa61efbe8e1a75b74cc75a40d3081be2 (diff)
downloadmeson-6ea939dd5fb1401f87b57f72e1479aab3382069c.zip
meson-6ea939dd5fb1401f87b57f72e1479aab3382069c.tar.gz
meson-6ea939dd5fb1401f87b57f72e1479aab3382069c.tar.bz2
gnome.generate_gir: support generating gir for multiple libraries
Fixes #3688
Diffstat (limited to 'mesonbuild/modules/gnome.py')
-rw-r--r--mesonbuild/modules/gnome.py119
1 files changed, 72 insertions, 47 deletions
diff --git a/mesonbuild/modules/gnome.py b/mesonbuild/modules/gnome.py
index f22ad1e..34dcbe8 100644
--- a/mesonbuild/modules/gnome.py
+++ b/mesonbuild/modules/gnome.py
@@ -499,54 +499,69 @@ class GnomeModule(ExtensionModule):
'Gir include dirs should be include_directories().')
return ret
- def _scan_lang(self, state, lang):
+ def _scan_langs(self, state, langs):
ret = []
- for link_arg in state.environment.coredata.get_external_link_args(lang):
- if link_arg.startswith('-L'):
- ret.append(link_arg)
+ for lang in langs:
+ for link_arg in state.environment.coredata.get_external_link_args(lang):
+ if link_arg.startswith('-L'):
+ ret.append(link_arg)
return ret
- def _scan_gir_target(self, state, girtarget):
+ def _scan_gir_targets(self, state, girtargets):
ret = []
- if isinstance(girtarget, build.Executable):
- ret += ['--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)
- ret.append('-L' + d)
- ret += ['--library', libname]
- # need to put our output directory first as we need to use the
- # generated libraries instead of any possibly installed system/prefix
- # ones.
- ret += ["-L@PRIVATE_OUTDIR_ABS_%s@" % girtarget.get_id()]
+ for girtarget in girtargets:
+ if isinstance(girtarget, build.Executable):
+ ret += ['--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)
+ ret.append('-L' + d)
+ ret += ['--library', libname]
+ # need to put our output directory first as we need to use the
+ # generated libraries instead of any possibly installed system/prefix
+ # ones.
+ ret += ["-L@PRIVATE_OUTDIR_ABS_%s@" % girtarget.get_id()]
return ret
- def _get_girtarget_lang_compiler(self, girtarget):
- 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
+ def _get_girtargets_langs_compilers(self, girtargets):
+ ret = []
+ for girtarget in girtargets:
+ 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'):
+ ret.append((lang, compiler))
+ break
+
+ return ret
- return lang, compiler
+ def _get_gir_targets_deps(self, girtargets):
+ ret = []
+ for girtarget in girtargets:
+ ret += girtarget.get_all_link_deps()
+ ret += girtarget.get_external_deps()
+ return ret
+
+ def _get_gir_targets_inc_dirs(self, girtargets):
+ ret = []
+ for girtarget in girtargets:
+ ret += girtarget.get_include_dirs()
+ return ret
- def _get_lang_compiler_flags(self, state, lang, compiler):
+ def _get_langs_compilers_flags(self, state, langs_compilers):
cflags = []
internal_ldflags = []
external_ldflags = []
- if lang and compiler:
+ for lang, compiler in langs_compilers:
if state.global_args.get(lang):
cflags += state.global_args[lang]
if state.project_args.get(lang):
@@ -562,8 +577,8 @@ class GnomeModule(ExtensionModule):
return cflags, internal_ldflags, external_ldflags
- def _make_gir_filelist(self, state, srcdir, ns, nsversion, girtarget, libsources):
- gir_filelist_dir = state.backend.get_target_private_dir_abs(girtarget)
+ def _make_gir_filelist(self, state, srcdir, ns, nsversion, girtargets, libsources):
+ gir_filelist_dir = state.backend.get_target_private_dir_abs(girtargets[0])
if not os.path.isdir(gir_filelist_dir):
os.mkdir(gir_filelist_dir)
gir_filelist_filename = os.path.join(gir_filelist_dir, '%s_%s_gir_filelist' % (ns, nsversion))
@@ -658,21 +673,30 @@ class GnomeModule(ExtensionModule):
return typelib_includes
+ def _get_external_args_for_langs(self, state, langs):
+ ret = []
+ for lang in langs:
+ ret += state.environment.coredata.get_external_args(lang)
+ return ret
+
@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',
'install', 'install_dir_gir', 'install_dir_typelib', 'extra_args',
'packages', 'header', 'build_by_default'})
def generate_gir(self, state, args, kwargs):
- if len(args) != 1:
- raise MesonException('Gir takes one argument')
+ if not args:
+ raise MesonException('generate_gir takes at least one argument')
if kwargs.get('install_dir'):
raise MesonException('install_dir is not supported with generate_gir(), see "install_dir_gir" and "install_dir_typelib"')
giscanner = self.interpreter.find_program_impl('g-ir-scanner')
gicompiler = self.interpreter.find_program_impl('g-ir-compiler')
- girtarget = self._unwrap_gir_target(args[0])
+ girtargets = [self._unwrap_gir_target(arg) for arg in args]
+
+ if len(girtargets) > 1 and any([isinstance(el, build.Executable) for el in girtargets]):
+ raise MesonException('generate_gir only accepts a single argument when one of the arguments is an executable')
self.gir_dep, pkgargs = self._get_gir_dep(state)
@@ -682,12 +706,12 @@ class GnomeModule(ExtensionModule):
girfile = '%s-%s.gir' % (ns, nsversion)
srcdir = os.path.join(state.environment.get_source_dir(), state.subdir)
builddir = os.path.join(state.environment.get_build_dir(), state.subdir)
- depends = [girtarget]
+ depends = [] + girtargets
gir_inc_dirs = []
- lang, compiler = self._get_girtarget_lang_compiler(girtarget)
- cflags, internal_ldflags, external_ldflags = self._get_lang_compiler_flags(state, lang, compiler)
- deps = (girtarget.get_all_link_deps() + girtarget.get_external_deps() +
- extract_as_list(kwargs, 'dependencies', pop=True, unholder=True))
+ langs_compilers = self._get_girtargets_langs_compilers(girtargets)
+ cflags, internal_ldflags, external_ldflags = self._get_langs_compilers_flags(state, langs_compilers)
+ deps = self._get_gir_targets_deps(girtargets)
+ deps += extract_as_list(kwargs, 'dependencies', pop=True, unholder=True)
typelib_includes = self._gather_typelib_includes_and_update_depends(state, deps, depends)
# ldflags will be misinterpreted by gir scanner (showing
# spurious dependencies) but building GStreamer fails if they
@@ -697,6 +721,7 @@ class GnomeModule(ExtensionModule):
cflags += list(dep_cflags)
internal_ldflags += list(dep_internal_ldflags)
external_ldflags += list(dep_external_ldflags)
+ girtargets_inc_dirs = self._get_gir_targets_inc_dirs(girtargets)
inc_dirs = self._scan_inc_dirs(kwargs)
scan_command = [giscanner]
@@ -708,8 +733,8 @@ class GnomeModule(ExtensionModule):
scan_command += self._scan_header(kwargs)
scan_command += self._scan_extra_args(kwargs)
scan_command += ['-I' + srcdir, '-I' + builddir]
- scan_command += get_include_args(girtarget.get_include_dirs())
- scan_command += ['--filelist=' + self._make_gir_filelist(state, srcdir, ns, nsversion, girtarget, libsources)]
+ scan_command += get_include_args(girtargets_inc_dirs)
+ scan_command += ['--filelist=' + self._make_gir_filelist(state, srcdir, ns, nsversion, girtargets, libsources)]
scan_command += self._scan_link_withs(state, depends, kwargs)
scan_command += self._scan_include(state, depends, gir_inc_dirs, kwargs)
scan_command += self._scan_symbol_prefix(kwargs)
@@ -717,12 +742,12 @@ class GnomeModule(ExtensionModule):
scan_command += self._scan_export_packages(kwargs)
scan_command += ['--cflags-begin']
scan_command += cflags
- scan_command += state.environment.coredata.get_external_args(lang)
+ scan_command += self._get_external_args_for_langs(state, [lc[0] for lc in langs_compilers])
scan_command += ['--cflags-end']
scan_command += get_include_args(inc_dirs)
scan_command += get_include_args(list(gi_includes) + gir_inc_dirs + inc_dirs, prefix='--add-include-path=')
- scan_command += self._scan_gir_target(state, girtarget)
- scan_command += self._scan_lang(state, lang)
+ scan_command += self._scan_gir_targets(state, girtargets)
+ scan_command += self._scan_langs(state, [lc[0] for lc in langs_compilers])
scan_command += list(internal_ldflags)
scan_command += list(external_ldflags)