diff options
author | Damián Nohales <damiannohales@gmail.com> | 2016-02-09 16:09:36 -0300 |
---|---|---|
committer | Damián Nohales <damiannohales@gmail.com> | 2016-02-09 19:41:26 -0300 |
commit | b91662a903b14a5d4617d3d876217c485a81cd3e (patch) | |
tree | 5167a7a0e2eb9d01740ba860e3a373c95f7fceb1 | |
parent | 6a3e29ccd47ac7c20de1c28de8b6323fa7c77ae2 (diff) | |
download | meson-b91662a903b14a5d4617d3d876217c485a81cd3e.zip meson-b91662a903b14a5d4617d3d876217c485a81cd3e.tar.gz meson-b91662a903b14a5d4617d3d876217c485a81cd3e.tar.bz2 |
Allow multiple source_dir in GResource
There are use case where one may want to specify --sourcedir option
multiple times to glib-compile-resources, which will look for
resources in every specified directory.
By doing this, we also need to get rid of the manual GResource XML
parsing and we opted to use the glib-compile-resources command with
the --generate-dependencies option. This command will solve the
multiple source_dir case for us.
-rw-r--r-- | mesonbuild/modules/gnome.py | 73 |
1 files changed, 32 insertions, 41 deletions
diff --git a/mesonbuild/modules/gnome.py b/mesonbuild/modules/gnome.py index 2ea6c1d..965342c 100644 --- a/mesonbuild/modules/gnome.py +++ b/mesonbuild/modules/gnome.py @@ -20,63 +20,54 @@ import os, sys import subprocess from ..coredata import MesonException from .. import mlog -import xml.etree.ElementTree as ET -from ..mesonlib import File girwarning_printed = False class GnomeModule: def compile_resources(self, state, args, kwargs): - cmd = ['glib-compile-resources', '@INPUT@', '--generate'] - if 'source_dir' in kwargs: - resource_loc = os.path.join(state.subdir, kwargs.pop('source_dir')) - d = os.path.join(state.build_to_src, resource_loc) - cmd += ['--sourcedir', d] - else: - resource_loc = state.subdir + cmd = ['glib-compile-resources', '@INPUT@'] + + source_dirs = kwargs.pop('source_dir', []) + if not isinstance(source_dirs, list): + source_dirs = [source_dirs] + + kwargs['depend_files'] = self.get_gresource_dependencies(state, args[1], source_dirs) + + for source_dir in source_dirs: + sourcedir = os.path.join(state.build_to_src, state.subdir, source_dir) + cmd += ['--sourcedir', sourcedir] + if 'c_name' in kwargs: cmd += ['--c-name', kwargs.pop('c_name')] - cmd += ['--target', '@OUTPUT@'] + cmd += ['--generate', '--target', '@OUTPUT@'] + kwargs['command'] = cmd + kwargs['input'] = args[1] output_c = args[0] + '.c' output_h = args[0] + '.h' - resfile = args[1] - kwargs['depend_files'] = self.parse_gresource_xml(state, resfile, resource_loc) - kwargs['input'] = resfile kwargs['output'] = output_c target_c = build.CustomTarget(args[0]+'_c', state.subdir, kwargs) kwargs['output'] = output_h target_h = build.CustomTarget(args[0] + '_h', state.subdir, kwargs) return [target_c, target_h] - def parse_gresource_xml(self, state, fobj, resource_loc): - if isinstance(fobj, File): - fname = fobj.fname - subdir = fobj.subdir - else: - fname = fobj - subdir = state.subdir - abspath = os.path.join(state.environment.source_dir, state.subdir, fname) - relative_part = os.path.split(fname)[0] - try: - tree = ET.parse(abspath) - root = tree.getroot() - result = [] - for child in root[0]: - if child.tag != 'file': - mlog.log("Warning, malformed rcc file: ", os.path.join(state.subdir, fname)) - break - else: - relfname = os.path.join(resource_loc, child.text) - absfname = os.path.join(state.environment.source_dir, relfname) - if os.path.isfile(absfname): - result.append(relfname) - else: - mlog.log('Warning, resource file points to nonexisting file %s.' % relfname) - return result - except Exception: - return [] + def get_gresource_dependencies(self, state, input_file, source_dirs): + cmd = ['glib-compile-resources', + os.path.join(state.subdir, input_file), + '--generate-dependencies'] + + for source_dir in source_dirs: + cmd += ['--sourcedir', os.path.join(state.subdir, source_dir)] + + pc = subprocess.Popen(cmd, stdout=subprocess.PIPE, universal_newlines=True, + cwd=state.environment.get_source_dir()) + (stdout, _) = pc.communicate() + if pc.returncode != 0: + mlog.log(mlog.bold('Warning:'), 'glib-compile-resources has failed to get the dependencies for {}'.format(cmd[1])) + raise subprocess.CalledProcessError(pc.returncode, cmd) + + return stdout.split('\n')[:-1] def generate_gir(self, state, args, kwargs): if len(args) != 1: @@ -203,7 +194,7 @@ class GnomeModule: scankwargs['install'] = kwargs['install'] scankwargs['install_dir'] = os.path.join(state.environment.get_datadir(), 'gir-1.0') scan_target = GirTarget(girfile, state.subdir, scankwargs) - + typelib_output = '%s-%s.typelib' % (ns, nsversion) typelib_cmd = ['g-ir-compiler', scan_target, '--output', '@OUTPUT@'] if inc_dirs: |