From 627faa0d39f1d0f02b72473a056a8fe2c322236a Mon Sep 17 00:00:00 2001 From: Sam Thursfield Date: Sun, 4 Dec 2016 15:41:18 +0000 Subject: Add a testcase for 'Duplicate outputs' bug With current Meson, this fails to configure with the following error: Duplicate output 'dependency-generated/enum-types.h' from 'CustomTarget' 'enum-types.h'; conflicts with 'dependency-generated/enum-types.h' from 'CustomTarget' 'enum-types.h' --- .../dependency-generated/enum-types.c.template | 43 +++++++++++++++++++++ .../dependency-generated/enum-types.h.template | 26 +++++++++++++ .../dependency-generated/enums.h | 15 ++++++++ .../dependency-generated/lib.vala | 3 ++ .../dependency-generated/main.vala | 3 ++ .../dependency-generated/meson.build | 44 ++++++++++++++++++++++ .../dependency-generated/null.c | 1 + test cases/vala/8 generated sources/meson.build | 1 + 8 files changed, 136 insertions(+) create mode 100644 test cases/vala/8 generated sources/dependency-generated/enum-types.c.template create mode 100644 test cases/vala/8 generated sources/dependency-generated/enum-types.h.template create mode 100644 test cases/vala/8 generated sources/dependency-generated/enums.h create mode 100644 test cases/vala/8 generated sources/dependency-generated/lib.vala create mode 100644 test cases/vala/8 generated sources/dependency-generated/main.vala create mode 100644 test cases/vala/8 generated sources/dependency-generated/meson.build create mode 100644 test cases/vala/8 generated sources/dependency-generated/null.c diff --git a/test cases/vala/8 generated sources/dependency-generated/enum-types.c.template b/test cases/vala/8 generated sources/dependency-generated/enum-types.c.template new file mode 100644 index 000000000..5ecdd2df2 --- /dev/null +++ b/test cases/vala/8 generated sources/dependency-generated/enum-types.c.template @@ -0,0 +1,43 @@ +/*** BEGIN file-header ***/ + +#include "enum-types.h" + +/*** END file-header ***/ + +/*** BEGIN file-production ***/ +/* enumerations from "@filename@" */ +#include "@filename@" +/*** END file-production ***/ + + +/*** BEGIN value-header ***/ +GType +@enum_name@_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) { + static const G@Type@Value values[] = { +/*** END value-header ***/ + +/*** BEGIN value-production ***/ + { @VALUENAME@, "@VALUENAME@", "@valuenick@" }, +/*** END value-production ***/ + +/*** BEGIN value-tail ***/ + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_@type@_register_static (g_intern_static_string ("@EnumName@"), values); + + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +/*** END value-tail ***/ + +/*** BEGIN file-tail ***/ + +/*** END file-tail ***/ diff --git a/test cases/vala/8 generated sources/dependency-generated/enum-types.h.template b/test cases/vala/8 generated sources/dependency-generated/enum-types.h.template new file mode 100644 index 000000000..e5478ab43 --- /dev/null +++ b/test cases/vala/8 generated sources/dependency-generated/enum-types.h.template @@ -0,0 +1,26 @@ +/*** BEGIN file-header ***/ + +#ifndef __EXAMPLE_ENUMS_TYPES_H__ +#define __EXAMPLE_ENUMS_TYPES_H__ + +#include +#include "enums.h" + +G_BEGIN_DECLS +/*** END file-header ***/ + +/*** BEGIN file-production ***/ + +/* enumerations from "@filename@" */ +/*** END file-production ***/ + +/*** BEGIN value-header ***/ +GType @enum_name@_get_type (void) G_GNUC_CONST; +#define EXAMPLE_TYPE_@ENUMSHORT@ (@enum_name@_get_type ()) +/*** END value-header ***/ + +/*** BEGIN file-tail ***/ +G_END_DECLS + +#endif /* __EXAMPLE_ENUMS_TYPES_H__ */ +/*** END file-tail ***/ diff --git a/test cases/vala/8 generated sources/dependency-generated/enums.h b/test cases/vala/8 generated sources/dependency-generated/enums.h new file mode 100644 index 000000000..3fb621eb8 --- /dev/null +++ b/test cases/vala/8 generated sources/dependency-generated/enums.h @@ -0,0 +1,15 @@ +#ifndef __EXAMPLE_ENUMS_H__ +#define __EXAMPLE_ENUMS_H__ + +G_BEGIN_DECLS + +typedef enum { + EXAMPLE_VERBOSITY_ERRORS, + EXAMPLE_VERBOSITY_MINIMAL, + EXAMPLE_VERBOSITY_DETAILED, + EXAMPLE_VERBOSITY_DEBUG, +} ExampleVerbosity; + +G_END_DECLS + +#endif /* __EXAMPLE_ENUMS_H__ */ diff --git a/test cases/vala/8 generated sources/dependency-generated/lib.vala b/test cases/vala/8 generated sources/dependency-generated/lib.vala new file mode 100644 index 000000000..3fcbb7fa7 --- /dev/null +++ b/test cases/vala/8 generated sources/dependency-generated/lib.vala @@ -0,0 +1,3 @@ +int whatever() { + return 0; +} diff --git a/test cases/vala/8 generated sources/dependency-generated/main.vala b/test cases/vala/8 generated sources/dependency-generated/main.vala new file mode 100644 index 000000000..33c14ce1d --- /dev/null +++ b/test cases/vala/8 generated sources/dependency-generated/main.vala @@ -0,0 +1,3 @@ +int main() { + return 0; +} diff --git a/test cases/vala/8 generated sources/dependency-generated/meson.build b/test cases/vala/8 generated sources/dependency-generated/meson.build new file mode 100644 index 000000000..a1895b4f7 --- /dev/null +++ b/test cases/vala/8 generated sources/dependency-generated/meson.build @@ -0,0 +1,44 @@ +# Test that dependencies with their own generated sources don't +# confuse the Vala build instruction generator. + +# Test case for https://github.com/mesonbuild/meson/issues/1084 + +gnome = import('gnome') + +gobject = dependency('gobject-2.0') + +enums = gnome.mkenums('enum-types', + sources: 'enums.h', + c_template: 'enum-types.c.template', + h_template: 'enum-types.h.template', +) + +libcommon = library('common', + enums[0], enums[1], + dependencies: gobject) + +common_dep = declare_dependency( + # This is required so that whoever depends on this also depends + # on the generated header; that won't happen implicitly. + # See: https://github.com/mesonbuild/meson/issues/1084 + sources: enums[1], + link_with: libcommon, +) + +libplover_vala = library('plover', + 'lib.vala', + dependencies: [common_dep, gobject] +) + +plover_dep = declare_dependency( + link_with: libplover_vala, + dependencies: common_dep +) + +vala_prog = executable('hello', + 'main.vala', + link_with: libplover_vala, + # There's no need to specify common_dep here since plover_dep pulls it + # in, but it should be harmless to do so. + dependencies: [common_dep, plover_dep, gobject] +) diff --git a/test cases/vala/8 generated sources/dependency-generated/null.c b/test cases/vala/8 generated sources/dependency-generated/null.c new file mode 100644 index 000000000..8337712ea --- /dev/null +++ b/test cases/vala/8 generated sources/dependency-generated/null.c @@ -0,0 +1 @@ +// diff --git a/test cases/vala/8 generated sources/meson.build b/test cases/vala/8 generated sources/meson.build index 6e03404b7..277c943c1 100644 --- a/test cases/vala/8 generated sources/meson.build +++ b/test cases/vala/8 generated sources/meson.build @@ -6,3 +6,4 @@ cd.set('x', 'y') subdir('src') subdir('tools') subdir('onlygen') +subdir('dependency-generated') -- cgit v1.2.3 From fc540b72a668c6ef4196f5501b0d385822e8657e Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Mon, 12 Dec 2016 14:15:40 +0530 Subject: vala: Fix duplicate output detection The same vapi or vala might be added multiple times. Don't freak out if that happens. Only freak out if a vapi or vala generated source by the same name and the output same path is added twice. This should never happen anyway since we would refuse to create the target in the first place in theory, but it might happen because of bugs in generators and custom targets. Closes #1084 --- mesonbuild/backend/ninjabackend.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py index 3562cf8c3..051682936 100644 --- a/mesonbuild/backend/ninjabackend.py +++ b/mesonbuild/backend/ninjabackend.py @@ -951,7 +951,7 @@ int dummy; else: srctype = othersgen # Duplicate outputs are disastrous - if f in srctype: + if f in srctype and srctype[f] is not gensrc: msg = 'Duplicate output {0!r} from {1!r} {2!r}; ' \ 'conflicts with {0!r} from {4!r} {3!r}' \ ''.format(f, type(gensrc).__name__, gensrc.name, -- cgit v1.2.3 From 807a53c6fc2e4e4fad12f4f4b6f1343eea30e9c7 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Mon, 12 Dec 2016 14:18:51 +0530 Subject: PkgConfigDependency.version_reqs must be a list If it isn't, the --target-glib check in generate_vala_compile will iterate over the version_reqs as a string and fail to add the --target-glib argument. --- mesonbuild/dependencies.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/mesonbuild/dependencies.py b/mesonbuild/dependencies.py index 606719c42..73062014c 100644 --- a/mesonbuild/dependencies.py +++ b/mesonbuild/dependencies.py @@ -145,6 +145,8 @@ class PkgConfigDependency(Dependency): else: if not isinstance(self.version_reqs, (str, list)): raise DependencyException('Version argument must be string or list.') + if isinstance(self.version_reqs, str): + self.version_reqs = [self.version_reqs] (self.is_found, not_found, found) = \ version_compare_many(self.modversion, self.version_reqs) if not self.is_found: @@ -169,6 +171,11 @@ class PkgConfigDependency(Dependency): # Fetch the libraries and library paths needed for using this self._set_libs() + def __repr__(self): + s = '<{0} {1}: {2} {3}>' + return s.format(self.__class__.__name__, self.name, self.is_found, + self.version_reqs) + def _call_pkgbin(self, args): p, out = Popen_safe([self.pkgbin] + args, env=os.environ)[0:2] return (p.returncode, out.strip()) -- cgit v1.2.3 From 79f66268676ec8bf94c6964a555ecc9144daca8e Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Wed, 14 Dec 2016 22:03:56 +0530 Subject: Pass --gresources to valac for each compiled gresource Without this, the user has to both compile the resource with gnome.compile_resources, pass that to the target sources, and also pass --gresources=/path/to/gres.xml to vala_args in the target. With this, we will do that automatically. --- mesonbuild/backend/backends.py | 35 ++++++++++++++++++++++------------- mesonbuild/backend/ninjabackend.py | 5 +++++ mesonbuild/modules/gnome.py | 3 +++ 3 files changed, 30 insertions(+), 13 deletions(-) diff --git a/mesonbuild/backend/backends.py b/mesonbuild/backend/backends.py index 48dfb1152..a489d0441 100644 --- a/mesonbuild/backend/backends.py +++ b/mesonbuild/backend/backends.py @@ -504,19 +504,13 @@ class Backend(): libs.append(os.path.join(self.get_target_dir(t), f)) return libs - def eval_custom_target_command(self, target, absolute_paths=False): - if not absolute_paths: - ofilenames = [os.path.join(self.get_target_dir(target), i) for i in target.output] - else: - ofilenames = [os.path.join(self.environment.get_build_dir(), self.get_target_dir(target), i) \ - for i in target.output] + def get_custom_target_sources(self, target, absolute_paths=False): + ''' + Custom target sources can be of various object types; strings, File, + BuildTarget, even other CustomTargets. + Returns the path to them relative to the build root directory. + ''' srcs = [] - outdir = self.get_target_dir(target) - # Many external programs fail on empty arguments. - if outdir == '': - outdir = '.' - if absolute_paths: - outdir = os.path.join(self.environment.get_build_dir(), outdir) for i in target.get_sources(): if hasattr(i, 'held_object'): i = i.held_object @@ -531,8 +525,23 @@ class Backend(): else: fname = [i.rel_to_builddir(self.build_to_src)] if absolute_paths: - fname =[os.path.join(self.environment.get_build_dir(), f) for f in fname] + fname = [os.path.join(self.environment.get_build_dir(), f) for f in fname] srcs += fname + return srcs + + def eval_custom_target_command(self, target, absolute_paths=False): + if not absolute_paths: + ofilenames = [os.path.join(self.get_target_dir(target), i) for i in target.output] + else: + ofilenames = [os.path.join(self.environment.get_build_dir(), self.get_target_dir(target), i) \ + for i in target.output] + srcs = self.get_custom_target_sources(target, absolute_paths) + outdir = self.get_target_dir(target) + # Many external programs fail on empty arguments. + if outdir == '': + outdir = '.' + if absolute_paths: + outdir = os.path.join(self.environment.get_build_dir(), outdir) cmd = [] for i in target.command: if isinstance(i, build.Executable): diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py index 051682936..fa71ae514 100644 --- a/mesonbuild/backend/ninjabackend.py +++ b/mesonbuild/backend/ninjabackend.py @@ -1032,6 +1032,11 @@ int dummy; args += ['--pkg', d.name] elif isinstance(d, dependencies.ExternalLibrary): args += d.get_lang_args('vala') + # Detect gresources and add --gresources arguments for each + for (gres, gensrc) in other_src[1].items(): + if hasattr(gensrc, 'gresource_c_output'): + gres_xml, = self.get_custom_target_sources(gensrc) + args += ['--gresources=' + gres_xml] extra_args = [] for a in target.extra_args.get('vala', []): diff --git a/mesonbuild/modules/gnome.py b/mesonbuild/modules/gnome.py index 6d05b4e9d..af3073ff8 100644 --- a/mesonbuild/modules/gnome.py +++ b/mesonbuild/modules/gnome.py @@ -162,6 +162,9 @@ can not be used with the current version of glib-compiled-resources, due to kwargs['depfile'] = depfile kwargs['command'] = copy.copy(cmd) + ['--dependency-file', '@DEPFILE@'] target_c = build.CustomTarget(name, state.subdir, kwargs) + # Used in backend/ninjabackend.py:generate_vala_compile() to pass + # --gresources to valac when GResources are used in Vala targets + target_c.gresource_c_output = True if gresource: # Only one target for .gresource files return [target_c] -- cgit v1.2.3 From 330d9ba7fef6e3a9994eab66139af601741df379 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Wed, 14 Dec 2016 22:01:09 +0530 Subject: Test target glib version and gresources in Vala Test that the --target-glib= argument while compiling Vala files is set properly by using a feature (GtkTemplate) that requires glib >=2.38. At the same time, also test that the appropriate gresource arguments are also set for Vala targets. For each gresource.xml that is compiled, we must pass --gresources=path/to/gresource.xml to valac. --- .../gres/meson.build | 3 ++ .../gres/test-resources.xml | 6 ++++ .../gres/test.ui | 19 +++++++++++ .../meson.build | 11 +++++++ .../test.vala | 37 ++++++++++++++++++++++ 5 files changed, 76 insertions(+) create mode 100644 test cases/vala/14 target glib version and gresources/gres/meson.build create mode 100644 test cases/vala/14 target glib version and gresources/gres/test-resources.xml create mode 100644 test cases/vala/14 target glib version and gresources/gres/test.ui create mode 100644 test cases/vala/14 target glib version and gresources/meson.build create mode 100644 test cases/vala/14 target glib version and gresources/test.vala diff --git a/test cases/vala/14 target glib version and gresources/gres/meson.build b/test cases/vala/14 target glib version and gresources/gres/meson.build new file mode 100644 index 000000000..f222a0095 --- /dev/null +++ b/test cases/vala/14 target glib version and gresources/gres/meson.build @@ -0,0 +1,3 @@ +res = gnome.compile_resources('testui', + 'test-resources.xml', + source_dir : '.') diff --git a/test cases/vala/14 target glib version and gresources/gres/test-resources.xml b/test cases/vala/14 target glib version and gresources/gres/test-resources.xml new file mode 100644 index 000000000..4e8a73f61 --- /dev/null +++ b/test cases/vala/14 target glib version and gresources/gres/test-resources.xml @@ -0,0 +1,6 @@ + + + + test.ui + + diff --git a/test cases/vala/14 target glib version and gresources/gres/test.ui b/test cases/vala/14 target glib version and gresources/gres/test.ui new file mode 100644 index 000000000..f90d941ff --- /dev/null +++ b/test cases/vala/14 target glib version and gresources/gres/test.ui @@ -0,0 +1,19 @@ + + + + + diff --git a/test cases/vala/14 target glib version and gresources/meson.build b/test cases/vala/14 target glib version and gresources/meson.build new file mode 100644 index 000000000..ce6313a7e --- /dev/null +++ b/test cases/vala/14 target glib version and gresources/meson.build @@ -0,0 +1,11 @@ +project('test glib target version and gresources', 'c', 'vala') + +gnome = import('gnome') + +glib = dependency('glib-2.0', version : '>=2.38') +gtk = dependency('gtk+-3.0') + +subdir('gres') + +e = executable('gtktemplate', 'test.vala', res, dependencies : [glib, gtk]) +test('test-target-glib', e) diff --git a/test cases/vala/14 target glib version and gresources/test.vala b/test cases/vala/14 target glib version and gresources/test.vala new file mode 100644 index 000000000..79ef47db0 --- /dev/null +++ b/test cases/vala/14 target glib version and gresources/test.vala @@ -0,0 +1,37 @@ +using Gtk; +using GLib; + +[GtkTemplate (ui = "/org/Meson/test.ui")] +public class TestWidget : Box { + public string text { + get { return entry.text; } + set { entry.text = value; } + } + + [GtkChild] + private Entry entry; + + public TestWidget (string text) { + this.text = text; + } +} + +void main(string[] args) { + Gtk.init (ref args); + var win = new Window(); + win.destroy.connect (Gtk.main_quit); + + var widget = new TestWidget ("SOME TEXT HERE"); + + win.add (widget); + win.show_all (); + + /* Exit immediately */ + Timeout.add_full (Priority.DEFAULT_IDLE, 1, () => + { + Gtk.main_quit(); + return false; + }); + + Gtk.main (); +} -- cgit v1.2.3 From e6f48a03fc989119bb56ea5c7b748f99f0404b5b Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Wed, 14 Dec 2016 22:13:38 +0530 Subject: Allow all code to access module target classes It is often useful to be able to check if a specific object is of a type defined in a module. To that end, define all such targets in modules/__init__.py so that everyone can refer to them without poking into module-specific code. --- mesonbuild/backend/ninjabackend.py | 3 ++- mesonbuild/modules/__init__.py | 21 +++++++++++++++++++++ mesonbuild/modules/gnome.py | 20 +++----------------- mesonbuild/modules/rpm.py | 6 +++--- 4 files changed, 29 insertions(+), 21 deletions(-) diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py index fa71ae514..ec469335d 100644 --- a/mesonbuild/backend/ninjabackend.py +++ b/mesonbuild/backend/ninjabackend.py @@ -13,6 +13,7 @@ # limitations under the License. from . import backends +from .. import modules from .. import environment, mesonlib from .. import build from .. import mlog @@ -1034,7 +1035,7 @@ int dummy; args += d.get_lang_args('vala') # Detect gresources and add --gresources arguments for each for (gres, gensrc) in other_src[1].items(): - if hasattr(gensrc, 'gresource_c_output'): + if isinstance(gensrc, modules.GResourceTarget): gres_xml, = self.get_custom_target_sources(gensrc) args += ['--gresources=' + gres_xml] extra_args = [] diff --git a/mesonbuild/modules/__init__.py b/mesonbuild/modules/__init__.py index e69de29bb..493a7b952 100644 --- a/mesonbuild/modules/__init__.py +++ b/mesonbuild/modules/__init__.py @@ -0,0 +1,21 @@ +from .. import build + +class GResourceTarget(build.CustomTarget): + def __init__(self, name, subdir, kwargs): + super().__init__(name, subdir, kwargs) + +class GResourceHeaderTarget(build.CustomTarget): + def __init__(self, name, subdir, kwargs): + super().__init__(name, subdir, kwargs) + +class GirTarget(build.CustomTarget): + def __init__(self, name, subdir, kwargs): + super().__init__(name, subdir, kwargs) + +class TypelibTarget(build.CustomTarget): + def __init__(self, name, subdir, kwargs): + super().__init__(name, subdir, kwargs) + +class VapiTarget(build.CustomTarget): + def __init__(self, name, subdir, kwargs): + super().__init__(name, subdir, kwargs) diff --git a/mesonbuild/modules/gnome.py b/mesonbuild/modules/gnome.py index af3073ff8..6ddfb857d 100644 --- a/mesonbuild/modules/gnome.py +++ b/mesonbuild/modules/gnome.py @@ -25,6 +25,7 @@ from .. import dependencies from .. import mlog from .. import mesonlib from .. import interpreter +from . import GResourceTarget, GResourceHeaderTarget, GirTarget, TypelibTarget, VapiTarget # gresource compilation is broken due to the way # the resource compiler and Ninja clash about it @@ -161,10 +162,7 @@ can not be used with the current version of glib-compiled-resources, due to depfile = kwargs['output'] + '.d' kwargs['depfile'] = depfile kwargs['command'] = copy.copy(cmd) + ['--dependency-file', '@DEPFILE@'] - target_c = build.CustomTarget(name, state.subdir, kwargs) - # Used in backend/ninjabackend.py:generate_vala_compile() to pass - # --gresources to valac when GResources are used in Vala targets - target_c.gresource_c_output = True + target_c = GResourceTarget(name, state.subdir, kwargs) if gresource: # Only one target for .gresource files return [target_c] @@ -180,7 +178,7 @@ can not be used with the current version of glib-compiled-resources, due to h_kwargs['install'] = install_header h_kwargs['install_dir'] = kwargs.get('install_dir', state.environment.coredata.get_builtin_option('includedir')) - target_h = build.CustomTarget(args[0] + '_h', state.subdir, h_kwargs) + target_h = GResourceHeaderTarget(args[0] + '_h', state.subdir, h_kwargs) return [target_c, target_h] def _get_gresource_dependencies(self, state, input_file, source_dirs, dependencies): @@ -1090,15 +1088,3 @@ can not be used with the current version of glib-compiled-resources, due to def initialize(): return GnomeModule() - -class GirTarget(build.CustomTarget): - def __init__(self, name, subdir, kwargs): - super().__init__(name, subdir, kwargs) - -class TypelibTarget(build.CustomTarget): - def __init__(self, name, subdir, kwargs): - super().__init__(name, subdir, kwargs) - -class VapiTarget(build.CustomTarget): - def __init__(self, name, subdir, kwargs): - super().__init__(name, subdir, kwargs) diff --git a/mesonbuild/modules/rpm.py b/mesonbuild/modules/rpm.py index dca1ad61a..a0f79aa73 100644 --- a/mesonbuild/modules/rpm.py +++ b/mesonbuild/modules/rpm.py @@ -19,7 +19,7 @@ from .. import build from .. import compilers import datetime from .. import mlog -from ..modules import gnome +from . import GirTarget, TypelibTarget import os @@ -65,9 +65,9 @@ class RPMModule: to_delete.add('%%{buildroot}%%{_libdir}/%s' % target.get_filename()) mlog.warning('removing', mlog.bold(target.get_filename()), 'from package because packaging static libs not recommended') - elif isinstance(target, gnome.GirTarget) and target.should_install(): + elif isinstance(target, GirTarget) and target.should_install(): files_devel.add('%%{_datadir}/gir-1.0/%s' % target.get_filename()[0]) - elif isinstance(target, gnome.TypelibTarget) and target.should_install(): + elif isinstance(target, TypelibTarget) and target.should_install(): files.add('%%{_libdir}/girepository-1.0/%s' % target.get_filename()[0]) for header in state.headers: if len(header.get_install_subdir()) > 0: -- cgit v1.2.3 From de0ce7f25c1bc1038fdca66237281722eca64494 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Wed, 14 Dec 2016 22:25:52 +0530 Subject: Add a test that uses hand-written vapi files To use these, you just need to add the .vapi file to your target as a source. This test specifically tests that hand-written vapis referring to C headers work. --- test cases/vala/15 static vapi in source tree/meson.build | 13 +++++++++++++ test cases/vala/15 static vapi in source tree/test.vala | 6 ++++++ .../vala/15 static vapi in source tree/vapi/config.vapi | 4 ++++ 3 files changed, 23 insertions(+) create mode 100644 test cases/vala/15 static vapi in source tree/meson.build create mode 100644 test cases/vala/15 static vapi in source tree/test.vala create mode 100644 test cases/vala/15 static vapi in source tree/vapi/config.vapi diff --git a/test cases/vala/15 static vapi in source tree/meson.build b/test cases/vala/15 static vapi in source tree/meson.build new file mode 100644 index 000000000..44bea484a --- /dev/null +++ b/test cases/vala/15 static vapi in source tree/meson.build @@ -0,0 +1,13 @@ +project('static vapi', 'c', 'vala') + +glib = dependency('glib-2.0') + +conf = configuration_data() +conf.set_quoted('VERSION', '1.0.0') +config_h = configure_file(output : 'config.h', + configuration : conf) + +e = executable('static-vapi', 'vapi/config.vapi', 'test.vala', + dependencies : glib) + +test('test-config', e) diff --git a/test cases/vala/15 static vapi in source tree/test.vala b/test cases/vala/15 static vapi in source tree/test.vala new file mode 100644 index 000000000..06f2d593c --- /dev/null +++ b/test cases/vala/15 static vapi in source tree/test.vala @@ -0,0 +1,6 @@ +using GLib; +using Config; + +public int main (string[] args) { + return GLib.strcmp(VERSION, "1.0.0"); +} diff --git a/test cases/vala/15 static vapi in source tree/vapi/config.vapi b/test cases/vala/15 static vapi in source tree/vapi/config.vapi new file mode 100644 index 000000000..71bcc6ea4 --- /dev/null +++ b/test cases/vala/15 static vapi in source tree/vapi/config.vapi @@ -0,0 +1,4 @@ +[CCode (cprefix = "", lower_case_cprefix = "", cheader_filename = "config.h")] +namespace Config { + public const string VERSION; +} -- cgit v1.2.3 From d5f7ba862bb37ad75b68e007b8b55f40b6f6fd19 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Thu, 15 Dec 2016 13:35:46 +0530 Subject: gnome.mkenums: Use absolute paths for all commandline args Closes #973 test cases/vala/8 generated sources/ tests this. --- mesonbuild/backend/backends.py | 19 ++++++++++--------- mesonbuild/backend/vs2010backend.py | 3 +++ mesonbuild/build.py | 4 +++- mesonbuild/modules/gnome.py | 5 +++-- 4 files changed, 19 insertions(+), 12 deletions(-) diff --git a/mesonbuild/backend/backends.py b/mesonbuild/backend/backends.py index a489d0441..e8d6beb77 100644 --- a/mesonbuild/backend/backends.py +++ b/mesonbuild/backend/backends.py @@ -504,7 +504,7 @@ class Backend(): libs.append(os.path.join(self.get_target_dir(t), f)) return libs - def get_custom_target_sources(self, target, absolute_paths=False): + def get_custom_target_sources(self, target): ''' Custom target sources can be of various object types; strings, File, BuildTarget, even other CustomTargets. @@ -524,23 +524,24 @@ class Backend(): fname = [os.path.join(self.get_target_private_dir(target), p) for p in i.get_outputs()] else: fname = [i.rel_to_builddir(self.build_to_src)] - if absolute_paths: + if target.absolute_paths: fname = [os.path.join(self.environment.get_build_dir(), f) for f in fname] srcs += fname return srcs - def eval_custom_target_command(self, target, absolute_paths=False): - if not absolute_paths: + def eval_custom_target_command(self, target, absolute_outputs=False): + # We only want the outputs to be absolute when using the VS backend + if not absolute_outputs: ofilenames = [os.path.join(self.get_target_dir(target), i) for i in target.output] else: ofilenames = [os.path.join(self.environment.get_build_dir(), self.get_target_dir(target), i) \ for i in target.output] - srcs = self.get_custom_target_sources(target, absolute_paths) + srcs = self.get_custom_target_sources(target) outdir = self.get_target_dir(target) # Many external programs fail on empty arguments. if outdir == '': outdir = '.' - if absolute_paths: + if target.absolute_paths: outdir = os.path.join(self.environment.get_build_dir(), outdir) cmd = [] for i in target.command: @@ -554,9 +555,9 @@ class Backend(): i = os.path.join(self.get_target_dir(i), tmp) elif isinstance(i, mesonlib.File): i = i.rel_to_builddir(self.build_to_src) - if absolute_paths: + if target.absolute_paths: i = os.path.join(self.environment.get_build_dir(), i) - # FIXME: str types are blindly added and ignore the 'absolute_paths' argument + # FIXME: str types are blindly added ignoring 'target.absolute_paths' elif not isinstance(i, str): err_msg = 'Argument {0} is of unknown type {1}' raise RuntimeError(err_msg.format(str(i), str(type(i)))) @@ -602,7 +603,7 @@ class Backend(): ''.format(target.name, i) raise MesonException(msg) source = match.group(0) - if match.group(1) is None and not absolute_paths: + if match.group(1) is None and not target.absolute_paths: lead_dir = '' else: lead_dir = self.environment.get_build_dir() diff --git a/mesonbuild/backend/vs2010backend.py b/mesonbuild/backend/vs2010backend.py index d04345527..f3e9b4fe2 100644 --- a/mesonbuild/backend/vs2010backend.py +++ b/mesonbuild/backend/vs2010backend.py @@ -392,6 +392,9 @@ class Vs2010Backend(backends.Backend): root = self.create_basic_crap(target) action = ET.SubElement(root, 'ItemDefinitionGroup') customstep = ET.SubElement(action, 'CustomBuildStep') + # We need to always use absolute paths because our invocation is always + # from the target dir, not the build root. + target.absolute_paths = True (srcs, ofilenames, cmd) = self.eval_custom_target_command(target, True) cmd_templ = '''"%s" '''*len(cmd) ET.SubElement(customstep, 'Command').text = cmd_templ % tuple(cmd) diff --git a/mesonbuild/build.py b/mesonbuild/build.py index 106386cc6..1c3f4e803 100644 --- a/mesonbuild/build.py +++ b/mesonbuild/build.py @@ -1218,7 +1218,7 @@ class CustomTarget: 'depfile' : True, } - def __init__(self, name, subdir, kwargs): + def __init__(self, name, subdir, kwargs, absolute_paths=False): self.name = name self.subdir = subdir self.dependencies = [] @@ -1227,6 +1227,8 @@ class CustomTarget: self.depfile = None self.process_kwargs(kwargs) self.extra_files = [] + # Whether to use absolute paths for all files on the commandline + self.absolute_paths = absolute_paths unknowns = [] for k in kwargs: if k not in CustomTarget.known_kwargs: diff --git a/mesonbuild/modules/gnome.py b/mesonbuild/modules/gnome.py index 6ddfb857d..eca894a7e 100644 --- a/mesonbuild/modules/gnome.py +++ b/mesonbuild/modules/gnome.py @@ -799,7 +799,7 @@ can not be used with the current version of glib-compiled-resources, due to install_header = False for arg, value in kwargs.items(): if arg == 'sources': - sources = [value] + sources + raise AssertionError("sources should've already been handled") elif arg == 'c_template': c_template = value if 'template' in kwargs: @@ -883,7 +883,8 @@ can not be used with the current version of glib-compiled-resources, due to 'command': cmd } custom_kwargs.update(kwargs) - return build.CustomTarget(output, state.subdir, custom_kwargs) + return build.CustomTarget(output, state.subdir, custom_kwargs, + absolute_paths=True) def genmarshal(self, state, args, kwargs): if len(args) != 1: -- cgit v1.2.3 From 5e5b3f00d8485949634b4411d8304cc467ad8fc7 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Thu, 15 Dec 2016 13:42:28 +0530 Subject: modules: Cache programs found by find_program This avoids printing several 'Found:' messages during configure, and also avoids doing several searches for the same binary. This is already done by the interpreter for `find_program` calls from build files. Also move it to the module-wide __init__.py file so it can be used by other modules as-needed. Also use it for g-ir-scanner where it was missed in one place, also fix exception name in the same place. --- mesonbuild/modules/__init__.py | 13 +++++++++++++ mesonbuild/modules/gnome.py | 16 +++++----------- mesonbuild/modules/qt4.py | 2 +- 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/mesonbuild/modules/__init__.py b/mesonbuild/modules/__init__.py index 493a7b952..8986d7a5c 100644 --- a/mesonbuild/modules/__init__.py +++ b/mesonbuild/modules/__init__.py @@ -1,4 +1,17 @@ from .. import build +from .. import dependencies + +_found_programs = {} + +def find_program(program_name, target_name): + if program_name in _found_programs: + return _found_programs[program_name] + program = dependencies.ExternalProgram(program_name) + if not program.found(): + m = "Target {!r} can't be generated as {!r} could not be found" + raise MesonException(m.format(target_name, program_name)) + _found_programs[program_name] = program + return program class GResourceTarget(build.CustomTarget): def __init__(self, name, subdir, kwargs): diff --git a/mesonbuild/modules/gnome.py b/mesonbuild/modules/gnome.py index eca894a7e..e291c98c7 100644 --- a/mesonbuild/modules/gnome.py +++ b/mesonbuild/modules/gnome.py @@ -25,7 +25,7 @@ from .. import dependencies from .. import mlog from .. import mesonlib from .. import interpreter -from . import GResourceTarget, GResourceHeaderTarget, GirTarget, TypelibTarget, VapiTarget +from . import find_program, GResourceTarget, GResourceHeaderTarget, GirTarget, TypelibTarget, VapiTarget # gresource compilation is broken due to the way # the resource compiler and Ninja clash about it @@ -46,19 +46,13 @@ def gir_has_extra_lib_arg(): _gir_has_extra_lib_arg = False try: - scanner_options = subprocess.check_output(['g-ir-scanner', '--help']).decode() - _gir_has_extra_lib_arg = '--extra-library' in scanner_options - except (FileNotFound, subprocess.CalledProcessError): + g_ir_scanner = find_program('g-ir-scanner', '').get_command() + opts = Popen_safe(g_ir_scanner + ['--help'], stderr=subprocess.STDOUT)[1] + _gir_has_extra_lib_arg = '--extra-library' in opts + except (MesonException, FileNotFoundError, subprocess.CalledProcessError): pass return _gir_has_extra_lib_arg -def find_program(program_name, target_name): - program = dependencies.ExternalProgram(program_name) - if not program.found(): - raise MesonException('%s can\'t be generated as %s could not be found' % ( - target_name, program_name)) - return program - class GnomeModule: @staticmethod diff --git a/mesonbuild/modules/qt4.py b/mesonbuild/modules/qt4.py index ab285fb6b..63dfef8bf 100644 --- a/mesonbuild/modules/qt4.py +++ b/mesonbuild/modules/qt4.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -import os, subprocess +import os from .. import mlog from .. import build from ..mesonlib import MesonException, Popen_safe -- cgit v1.2.3 From ff8cdf86f4a36290156424bfeb5efbde788a5953 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Fri, 16 Dec 2016 00:11:27 +0530 Subject: tests/vala/14: Disable running of GTK+ test There's no X on the Travis CI, so disable this for now. --- test cases/vala/14 target glib version and gresources/meson.build | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test cases/vala/14 target glib version and gresources/meson.build b/test cases/vala/14 target glib version and gresources/meson.build index ce6313a7e..dee26278d 100644 --- a/test cases/vala/14 target glib version and gresources/meson.build +++ b/test cases/vala/14 target glib version and gresources/meson.build @@ -8,4 +8,5 @@ gtk = dependency('gtk+-3.0') subdir('gres') e = executable('gtktemplate', 'test.vala', res, dependencies : [glib, gtk]) -test('test-target-glib', e) +# No X on the CI, so disable this for now +#test('test-target-glib', e) -- cgit v1.2.3