From 0326d0fc8a43e83809289dbbf08c543b689f20c2 Mon Sep 17 00:00:00 2001 From: Dylan Baker Date: Mon, 16 Jun 2025 08:44:10 -0700 Subject: [PATCH 1/3] vala: add a method to get a generated vala header This allows targets that don't link with a vala target to rely on the header generation. --- docs/markdown/Vala.md | 13 +++++++++++++ docs/markdown/snippets/vala-target-extra-methods.md | 12 ++++++++++++ docs/yaml/objects/build_tgt.yaml | 8 ++++++++ mesonbuild/interpreter/interpreterobjects.py | 13 +++++++++++++ 4 files changed, 46 insertions(+) create mode 100644 docs/markdown/snippets/vala-target-extra-methods.md diff --git a/docs/markdown/Vala.md b/docs/markdown/Vala.md index fdc4fbae47c3..23ff570188ec 100644 --- a/docs/markdown/Vala.md +++ b/docs/markdown/Vala.md @@ -304,6 +304,19 @@ In this example, the second and third elements of the `install_dir` array indicate the destination with `true` to use default directories (i.e. `include` and `share/vala/vapi`). +### Depending on C header + +*(since 1.10.0)* + +Given the previous example, + +```meson +foo_lib = shared_library(...) +foo_h = foo_lib.vala_header() +``` + +This header can now be used like any other generated header to create an +order-only dependency. ### GObject Introspection and language bindings diff --git a/docs/markdown/snippets/vala-target-extra-methods.md b/docs/markdown/snippets/vala-target-extra-methods.md new file mode 100644 index 000000000000..1c7867e4f125 --- /dev/null +++ b/docs/markdown/snippets/vala-target-extra-methods.md @@ -0,0 +1,12 @@ +## Vala BuildTarget dependency enhancements + +A BuildTarget that has Vala sources can now get a File dependency for its +generated header. + +```meson +lib = library('foo', 'foo.vala') +lib_h = lib.vala_header() +lib_s = static_lib('static', 'static.c', lib_h) +``` + +`static.c` will not start compilation until `lib.h` is generated. diff --git a/docs/yaml/objects/build_tgt.yaml b/docs/yaml/objects/build_tgt.yaml index 73b9b5da7546..7229de590122 100644 --- a/docs/yaml/objects/build_tgt.yaml +++ b/docs/yaml/objects/build_tgt.yaml @@ -77,3 +77,11 @@ methods: objects feature compatible with [[@external_program]] objects. This simplifies use-cases where an executable is used instead of an [[@external_program]]. + +- name: vala_header + returns: file + since: 1.10.0 + description: | + Returns a [[@file]] object pointing to a C compatible header generated by + the vala compiler, if this target does not generate a vala header then it is + an error to call this method. diff --git a/mesonbuild/interpreter/interpreterobjects.py b/mesonbuild/interpreter/interpreterobjects.py index 17ba989d37de..db6782ceb155 100644 --- a/mesonbuild/interpreter/interpreterobjects.py +++ b/mesonbuild/interpreter/interpreterobjects.py @@ -988,6 +988,19 @@ def get_id_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> str: def name_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> str: return self._target_object.name + @FeatureNew('vala_header', '1.10.0') + @noPosargs + @noKwargs + @InterpreterObject.method('vala_header') + def vala_header_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> mesonlib.File: + if not hasattr(self._target_object, 'vala_header'): + raise mesonlib.MesonException("Attempted to get a Vala header from a target that doesn't generate one") + + assert self.interpreter.backend is not None, 'for mypy' + return mesonlib.File.from_built_file( + self.interpreter.backend.get_target_dir(self._target_object), self._target_object.vala_header) + + class ExecutableHolder(BuildTargetHolder[build.Executable]): pass From e7b6396c0f8a6115cf93849a09dd4ad20cc914e6 Mon Sep 17 00:00:00 2001 From: Dylan Baker Date: Mon, 16 Jun 2025 08:46:14 -0700 Subject: [PATCH 2/3] vala: Add method to build_target to get generated vapi file Same as the previous, but for VAPI --- docs/markdown/Vala.md | 11 +++++++++++ docs/markdown/snippets/vala-target-extra-methods.md | 4 +++- docs/yaml/objects/build_tgt.yaml | 8 ++++++++ mesonbuild/interpreter/interpreterobjects.py | 12 ++++++++++++ 4 files changed, 34 insertions(+), 1 deletion(-) diff --git a/docs/markdown/Vala.md b/docs/markdown/Vala.md index 23ff570188ec..af9426352d72 100644 --- a/docs/markdown/Vala.md +++ b/docs/markdown/Vala.md @@ -318,6 +318,17 @@ foo_h = foo_lib.vala_header() This header can now be used like any other generated header to create an order-only dependency. +### Depending on VAPI header + +*(since 1.10.0)* + +Given the previous example, + +```meson +foo_lib = shared_library(...) +foo_vapi = foo_lib.vala_vapi() +``` + ### GObject Introspection and language bindings A 'binding' allows another programming language to use a library diff --git a/docs/markdown/snippets/vala-target-extra-methods.md b/docs/markdown/snippets/vala-target-extra-methods.md index 1c7867e4f125..72d89e56e5db 100644 --- a/docs/markdown/snippets/vala-target-extra-methods.md +++ b/docs/markdown/snippets/vala-target-extra-methods.md @@ -1,12 +1,14 @@ ## Vala BuildTarget dependency enhancements A BuildTarget that has Vala sources can now get a File dependency for its -generated header. +generated header and generated vapi. ```meson lib = library('foo', 'foo.vala') lib_h = lib.vala_header() lib_s = static_lib('static', 'static.c', lib_h) + +lib_vapi = lib.vala_vapi() ``` `static.c` will not start compilation until `lib.h` is generated. diff --git a/docs/yaml/objects/build_tgt.yaml b/docs/yaml/objects/build_tgt.yaml index 7229de590122..da64a469e585 100644 --- a/docs/yaml/objects/build_tgt.yaml +++ b/docs/yaml/objects/build_tgt.yaml @@ -85,3 +85,11 @@ methods: Returns a [[@file]] object pointing to a C compatible header generated by the vala compiler, if this target does not generate a vala header then it is an error to call this method. + +- name: vala_vapi + returns: file + since: 1.10.0 + description: | + Returns a [[@file]] object pointing to a VAPI header generated by the vala + compiler, if this target does not generate a VAPI file then it is an error + to call this method. diff --git a/mesonbuild/interpreter/interpreterobjects.py b/mesonbuild/interpreter/interpreterobjects.py index db6782ceb155..ab8e130d94c2 100644 --- a/mesonbuild/interpreter/interpreterobjects.py +++ b/mesonbuild/interpreter/interpreterobjects.py @@ -1000,6 +1000,18 @@ def vala_header_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> mes return mesonlib.File.from_built_file( self.interpreter.backend.get_target_dir(self._target_object), self._target_object.vala_header) + @FeatureNew('vala_vapi', '1.10.0') + @noPosargs + @noKwargs + @InterpreterObject.method('vala_vapi') + def vala_vapi_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> mesonlib.File: + if not hasattr(self._target_object, 'vala_vapi'): + raise mesonlib.MesonException("Attempted to get a Vala VAPI from a target that doesn't generate one") + + assert self.interpreter.backend is not None, 'for mypy' + return mesonlib.File.from_built_file( + self.interpreter.backend.get_target_dir(self._target_object), self._target_object.vala_vapi) + class ExecutableHolder(BuildTargetHolder[build.Executable]): pass From 7d51e0c2bc2983aa78609f33a825ecaba6104657 Mon Sep 17 00:00:00 2001 From: Dylan Baker Date: Mon, 16 Jun 2025 08:46:52 -0700 Subject: [PATCH 3/3] vala: Add method to get generated GIR from a build_target Fixes: #2296 Fixes: #4481 Fixes: #5968 --- docs/markdown/Vala.md | 25 +++++++++++++++++++ .../snippets/vala-target-extra-methods.md | 9 ++++++- docs/yaml/objects/build_tgt.yaml | 8 ++++++ mesonbuild/interpreter/interpreterobjects.py | 12 +++++++++ test cases/vala/9 gir/meson.build | 7 ++++-- 5 files changed, 58 insertions(+), 3 deletions(-) diff --git a/docs/markdown/Vala.md b/docs/markdown/Vala.md index af9426352d72..ff7a7c7361e8 100644 --- a/docs/markdown/Vala.md +++ b/docs/markdown/Vala.md @@ -318,6 +318,7 @@ foo_h = foo_lib.vala_header() This header can now be used like any other generated header to create an order-only dependency. + ### Depending on VAPI header *(since 1.10.0)* @@ -329,6 +330,15 @@ foo_lib = shared_library(...) foo_vapi = foo_lib.vala_vapi() ``` +### Depending on generated GIR + +*(since 1.10.0)* + +```meson +foo_lib = shared_library(..., vala_gir : 'foo.gir') +foo_gir = foo_lib.vala_gir() +``` + ### GObject Introspection and language bindings A 'binding' allows another programming language to use a library @@ -363,6 +373,21 @@ directory (i.e. `share/gir-1.0` for GIRs). The fourth element in the To then generate a typelib file use a custom target with the `g-ir-compiler` program and a dependency on the library: +*Since Meson 1.10*, use the `.vala_gir()` method to get a handle to the generated `.gir` file: + +```meson +g_ir_compiler = find_program('g-ir-compiler') +custom_target('foo typelib', command: [g_ir_compiler, '--output', '@OUTPUT@', '@INPUT@'], + input: foo_lib.vala_gir(), + output: 'Foo-1.0.typelib', + install: true, + install_dir: get_option('libdir') / 'girepository-1.0') +``` + + +*Before Meson 1.10*, calculating the path to the input is required, as is adding a +manual dependency to the vala target: + ```meson g_ir_compiler = find_program('g-ir-compiler') custom_target('foo typelib', command: [g_ir_compiler, '--output', '@OUTPUT@', '@INPUT@'], diff --git a/docs/markdown/snippets/vala-target-extra-methods.md b/docs/markdown/snippets/vala-target-extra-methods.md index 72d89e56e5db..526f557a27a1 100644 --- a/docs/markdown/snippets/vala-target-extra-methods.md +++ b/docs/markdown/snippets/vala-target-extra-methods.md @@ -1,7 +1,7 @@ ## Vala BuildTarget dependency enhancements A BuildTarget that has Vala sources can now get a File dependency for its -generated header and generated vapi. +generated header, vapi, and gir files. ```meson lib = library('foo', 'foo.vala') @@ -9,6 +9,13 @@ lib_h = lib.vala_header() lib_s = static_lib('static', 'static.c', lib_h) lib_vapi = lib.vala_vapi() + +custom_target( + 'foo-typelib', + command : ['g-ir-compiler', '--output', '@OUTPUT@', '@INPUT@'], + input : lib.vala_gir(), + output : 'Foo-1.0.typelib' +) ``` `static.c` will not start compilation until `lib.h` is generated. diff --git a/docs/yaml/objects/build_tgt.yaml b/docs/yaml/objects/build_tgt.yaml index da64a469e585..3fed56c43280 100644 --- a/docs/yaml/objects/build_tgt.yaml +++ b/docs/yaml/objects/build_tgt.yaml @@ -93,3 +93,11 @@ methods: Returns a [[@file]] object pointing to a VAPI header generated by the vala compiler, if this target does not generate a VAPI file then it is an error to call this method. + +- name: vala_gir + returns: file + since: 1.10.0 + description: | + Returns a [[@file]] object pointing to a GIR file generated by the vala + compiler, if this target does not generate a GIR file then it is an error + to call this method. diff --git a/mesonbuild/interpreter/interpreterobjects.py b/mesonbuild/interpreter/interpreterobjects.py index ab8e130d94c2..86e8957bc2a1 100644 --- a/mesonbuild/interpreter/interpreterobjects.py +++ b/mesonbuild/interpreter/interpreterobjects.py @@ -1012,6 +1012,18 @@ def vala_vapi_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> meson return mesonlib.File.from_built_file( self.interpreter.backend.get_target_dir(self._target_object), self._target_object.vala_vapi) + @FeatureNew('vala_gir', '1.10.0') + @noPosargs + @noKwargs + @InterpreterObject.method('vala_gir') + def vala_gir_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> mesonlib.File: + if not hasattr(self._target_object, 'vala_gir'): + raise mesonlib.MesonException("Attempted to get a Vala GIR from a target that doesn't generate one") + + assert self.interpreter.backend is not None, 'for mypy' + return mesonlib.File.from_built_file( + self.interpreter.backend.get_target_dir(self._target_object), self._target_object.vala_gir) + class ExecutableHolder(BuildTargetHolder[build.Executable]): pass diff --git a/test cases/vala/9 gir/meson.build b/test cases/vala/9 gir/meson.build index 332052760474..c70938b8d43f 100644 --- a/test cases/vala/9 gir/meson.build +++ b/test cases/vala/9 gir/meson.build @@ -1,3 +1,6 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright © 2025 Intel Corporation + project('foo', 'c', 'vala') glib = dependency('glib-2.0') @@ -12,6 +15,6 @@ foo = shared_library('foo', 'foo.vala', custom_target('foo-typelib', command: [g_ir_compiler, '--output', '@OUTPUT@', '@INPUT@'], - input: meson.current_build_dir() + '/Foo-1.0.gir', + input: foo.vala_gir(), output: 'Foo-1.0.typelib', - depends: foo) + build_by_default : true)