From b91662a903b14a5d4617d3d876217c485a81cd3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dami=C3=A1n=20Nohales?= Date: Tue, 9 Feb 2016 16:09:36 -0300 Subject: [PATCH] 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. --- mesonbuild/modules/gnome.py | 73 ++++++++++++++++--------------------- 1 file changed, 32 insertions(+), 41 deletions(-) diff --git a/mesonbuild/modules/gnome.py b/mesonbuild/modules/gnome.py index 2ea6c1d7d..965342cd8 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: