Merge pull request #991 from mesonbuild/wip/tingping/gresource-depfile

gnome: Use depfile support of recent glib-compile-resources
pull/1023/head
Jussi Pakkanen 8 years ago committed by GitHub
commit fd425d56a5
  1. 5
      mesonbuild/backend/backends.py
  2. 4
      mesonbuild/backend/ninjabackend.py
  3. 61
      mesonbuild/modules/gnome.py

@ -599,10 +599,7 @@ class Backend():
elif '@DEPFILE@' in i: elif '@DEPFILE@' in i:
if target.depfile is None: if target.depfile is None:
raise MesonException('Custom target %s has @DEPFILE@ but no depfile keyword argument.' % target.name) raise MesonException('Custom target %s has @DEPFILE@ but no depfile keyword argument.' % target.name)
if absolute_paths: dfilename = os.path.join(outdir, target.depfile)
dfilename = os.path.join(self.get_target_private_dir_abs(target), target.depfile)
else:
dfilename = os.path.join(self.get_target_private_dir(target), target.depfile)
i = i.replace('@DEPFILE@', dfilename) i = i.replace('@DEPFILE@', dfilename)
elif '@PRIVATE_OUTDIR_' in i: elif '@PRIVATE_OUTDIR_' in i:
match = re.search('@PRIVATE_OUTDIR_(ABS_)?([-a-zA-Z0-9.@:]*)@', i) match = re.search('@PRIVATE_OUTDIR_(ABS_)?([-a-zA-Z0-9.@:]*)@', i)

@ -494,8 +494,8 @@ int dummy;
cmd_type = 'custom' cmd_type = 'custom'
if target.depfile is not None: if target.depfile is not None:
rel_dfile = os.path.join(self.get_target_private_dir(target), target.depfile) rel_dfile = os.path.join(self.get_target_dir(target), target.depfile)
abs_pdir = os.path.join(self.environment.get_build_dir(), self.get_target_private_dir(target)) abs_pdir = os.path.join(self.environment.get_build_dir(), self.get_target_dir(target))
os.makedirs(abs_pdir, exist_ok=True) os.makedirs(abs_pdir, exist_ok=True)
elem.add_item('DEPFILE', rel_dfile) elem.add_item('DEPFILE', rel_dfile)
elem.add_item('COMMAND', cmd) elem.add_item('COMMAND', cmd)

@ -18,6 +18,7 @@ functionality such as gobject-introspection and gresources.'''
from .. import build from .. import build
import os import os
import sys import sys
import copy
import subprocess import subprocess
from ..mesonlib import MesonException from ..mesonlib import MesonException
from .. import dependencies from .. import dependencies
@ -43,9 +44,9 @@ class GnomeModule:
def __print_gresources_warning(self, state): def __print_gresources_warning(self, state):
global gresource_warning_printed global gresource_warning_printed
if not gresource_warning_printed: if not gresource_warning_printed:
if mesonlib.version_compare(self._get_native_glib_version(state), '< 2.50.0'): if mesonlib.version_compare(self._get_native_glib_version(state), '< 2.50.2'):
mlog.warning('GLib compiled dependencies do not work fully ' mlog.warning('GLib compiled dependencies do not work fully '
'with versions of GLib older than 2.50.0.\n' 'with versions of GLib older than 2.50.2.\n'
'See the following upstream issue:', 'See the following upstream issue:',
mlog.bold('https://bugzilla.gnome.org/show_bug.cgi?id=745754')) mlog.bold('https://bugzilla.gnome.org/show_bug.cgi?id=745754'))
gresource_warning_printed = True gresource_warning_printed = True
@ -60,9 +61,6 @@ class GnomeModule:
if not isinstance(source_dirs, list): if not isinstance(source_dirs, list):
source_dirs = [source_dirs] source_dirs = [source_dirs]
# Always include current directory, but after paths set by user
source_dirs.append(os.path.join(state.environment.get_source_dir(), state.subdir))
if len(args) < 2: if len(args) < 2:
raise MesonException('Not enough arguments; The name of the resource and the path to the XML file are required') raise MesonException('Not enough arguments; The name of the resource and the path to the XML file are required')
@ -70,8 +68,8 @@ class GnomeModule:
if not isinstance(dependencies, list): if not isinstance(dependencies, list):
dependencies = [dependencies] dependencies = [dependencies]
if mesonlib.version_compare(self._get_native_glib_version(state), glib_version = self._get_native_glib_version(state)
'< 2.48.2'): if mesonlib.version_compare(glib_version, '< 2.48.2'):
if len(dependencies) > 0: if len(dependencies) > 0:
raise MesonException( raise MesonException(
'The "dependencies" argument of gnome.compile_resources() ' 'The "dependencies" argument of gnome.compile_resources() '
@ -87,18 +85,18 @@ class GnomeModule:
else: else:
raise RuntimeError('Unreachable code.') raise RuntimeError('Unreachable code.')
kwargs['depend_files'] = self._get_gresource_dependencies( depend_files, depends, subdirs = self._get_gresource_dependencies(
state, ifile, source_dirs, dependencies) state, ifile, source_dirs, dependencies)
for source_dir in source_dirs: # Make source dirs relative to build dir now
sourcedir = os.path.join(state.build_to_src, state.subdir, source_dir) source_dirs = [os.path.join(state.build_to_src, state.subdir, d) for d in source_dirs]
cmd += ['--sourcedir', sourcedir] # Always include current directory, but after paths set by user
source_dirs.append(os.path.join(state.build_to_src, state.subdir))
# Ensure build directories of generated deps are included
source_dirs += subdirs
if len(dependencies) > 0: for source_dir in set(source_dirs):
# Add the build variant of each sourcedir if we have any cmd += ['--sourcedir', source_dir]
# generated dependencies.
sourcedir = os.path.join(state.subdir, source_dir)
cmd += ['--sourcedir', sourcedir]
if 'c_name' in kwargs: if 'c_name' in kwargs:
cmd += ['--c-name', kwargs.pop('c_name')] cmd += ['--c-name', kwargs.pop('c_name')]
@ -106,17 +104,30 @@ class GnomeModule:
cmd += mesonlib.stringlistify(kwargs.pop('extra_args', [])) cmd += mesonlib.stringlistify(kwargs.pop('extra_args', []))
kwargs['command'] = cmd
kwargs['input'] = args[1] kwargs['input'] = args[1]
kwargs['output'] = args[0] + '.c' kwargs['output'] = args[0] + '.c'
kwargs['depends'] = depends
if mesonlib.version_compare(glib_version, '< 2.50.2'):
# This will eventually go out of sync if dependencies are added
kwargs['depend_files'] = depend_files
kwargs['command'] = cmd
else:
depfile = kwargs['output'] + '.d'
kwargs['depfile'] = depfile
kwargs['command'] = copy.copy(cmd) + ['--dependency-file', '@DEPFILE@']
target_c = build.CustomTarget(args[0] + '_c', state.subdir, kwargs) target_c = build.CustomTarget(args[0] + '_c', state.subdir, kwargs)
kwargs['output'] = args[0] + '.h'
target_h = build.CustomTarget(args[0] + '_h', state.subdir, kwargs) h_kwargs = {
'command': cmd,
'input': args[1],
'output': args[0] + '.h',
# The header doesn't actually care about the files yet it errors if missing
'depends': depends
}
target_h = build.CustomTarget(args[0] + '_h', state.subdir, h_kwargs)
return [target_c, target_h] return [target_c, target_h]
def _get_gresource_dependencies(self, state, input_file, source_dirs, dependencies): def _get_gresource_dependencies(self, state, input_file, source_dirs, dependencies):
self.__print_gresources_warning(state)
for dep in dependencies: for dep in dependencies:
if not isinstance(dep, interpreter.CustomTargetHolder) and not \ if not isinstance(dep, interpreter.CustomTargetHolder) and not \
isinstance(dep, mesonlib.File): isinstance(dep, mesonlib.File):
@ -131,6 +142,7 @@ class GnomeModule:
for source_dir in source_dirs: for source_dir in source_dirs:
cmd += ['--sourcedir', os.path.join(state.subdir, source_dir)] cmd += ['--sourcedir', os.path.join(state.subdir, source_dir)]
cmd += ['--sourcedir', state.subdir] # Current dir
pc = subprocess.Popen(cmd, stdout=subprocess.PIPE, universal_newlines=True, pc = subprocess.Popen(cmd, stdout=subprocess.PIPE, universal_newlines=True,
cwd=state.environment.get_source_dir()) cwd=state.environment.get_source_dir())
@ -154,6 +166,8 @@ class GnomeModule:
return os.path.exists(os.path.join(state.environment.get_source_dir(), f)) return os.path.exists(os.path.join(state.environment.get_source_dir(), f))
missing_dep_files = [f for f in dep_files if not exists_in_srcdir(f)] missing_dep_files = [f for f in dep_files if not exists_in_srcdir(f)]
depends = []
subdirs = []
for missing in missing_dep_files: for missing in missing_dep_files:
found = False found = False
missing_basename = os.path.basename(missing) missing_basename = os.path.basename(missing)
@ -164,6 +178,7 @@ class GnomeModule:
found = True found = True
dep_files.remove(missing) dep_files.remove(missing)
dep_files.append(dep) dep_files.append(dep)
subdirs.append(dep.subdir)
break break
elif isinstance(dep, interpreter.CustomTargetHolder): elif isinstance(dep, interpreter.CustomTargetHolder):
if dep.held_object.get_basename() == missing_basename: if dep.held_object.get_basename() == missing_basename:
@ -174,6 +189,8 @@ class GnomeModule:
is_built=True, is_built=True,
subdir=dep.held_object.get_subdir(), subdir=dep.held_object.get_subdir(),
fname=dep.held_object.get_basename())) fname=dep.held_object.get_basename()))
depends.append(dep.held_object)
subdirs.append(dep.held_object.get_subdir())
break break
if not found: if not found:
@ -183,7 +200,7 @@ class GnomeModule:
'gnome.compile_resources() using the "dependencies" ' 'gnome.compile_resources() using the "dependencies" '
'keyword argument.' % (missing, input_file)) 'keyword argument.' % (missing, input_file))
return dep_files return dep_files, depends, subdirs
@staticmethod @staticmethod
def _get_link_args(state, lib, depends=None): def _get_link_args(state, lib, depends=None):

Loading…
Cancel
Save