summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian "sp1rit"​ <sp1rit@disroot.org>2025-06-11 19:10:12 +0200
committerJussi Pakkanen <jussi.pakkanen@mailbox.org>2025-06-23 19:59:53 +0300
commitfea9f6918a6647430f4e22ca908f074b3e93e489 (patch)
tree102087d670e2f9b5145bccdf7ac84f1c3c10f838
parent19d3e4dc30bd3210eb85e29a538ad1606adef1bc (diff)
downloadmeson-fea9f6918a6647430f4e22ca908f074b3e93e489.tar.gz
vala: Also add --target-glib if glib is built as subproject
Previously, meson would only check if glib was part of target.external_dependencies and add --target-glib appropriately. This however had the downside of meson not adding --target-glib if glib was included as a subproject, potentially breaking otherwise builds. Instead of checking external_dependencies, check target.added_deps for an occurrence of 'glib-2.0' and then pick the appropriate codepath (either from the external dependency based on version_reqs or for the internal dependency based on the actual version, potentially downgraded to the latest release version) Related-to: #14694
-rw-r--r--mesonbuild/backend/backends.py31
-rw-r--r--mesonbuild/build.py4
-rw-r--r--mesonbuild/dependencies/base.py5
-rw-r--r--test cases/unit/129 vala internal glib/lib.vala3
-rw-r--r--test cases/unit/129 vala internal glib/meson.build21
-rw-r--r--test cases/unit/129 vala internal glib/meson.options1
-rw-r--r--unittests/platformagnostictests.py17
7 files changed, 77 insertions, 5 deletions
diff --git a/mesonbuild/backend/backends.py b/mesonbuild/backend/backends.py
index 28a92d28e..ed57a4c1b 100644
--- a/mesonbuild/backend/backends.py
+++ b/mesonbuild/backend/backends.py
@@ -1085,11 +1085,6 @@ class Backend:
if compiler.language == 'vala':
if dep.type_name == 'pkgconfig':
assert isinstance(dep, dependencies.ExternalDependency)
- if dep.name == 'glib-2.0' and dep.version_reqs is not None:
- for req in dep.version_reqs:
- if req.startswith(('>=', '==')):
- commands += ['--target-glib', req[2:]]
- break
commands += ['--pkg', dep.name]
elif isinstance(dep, dependencies.ExternalLibrary):
commands += dep.get_link_args('vala')
@@ -1101,6 +1096,32 @@ class Backend:
commands += dep.get_exe_args(compiler)
# For 'automagic' deps: Boost and GTest. Also dependency('threads').
# pkg-config puts the thread flags itself via `Cflags:`
+ if compiler.language == 'vala':
+ # Vala wants to know the minimum glib version
+ for dep in target.added_deps:
+ if dep.name == 'glib-2.0':
+ if dep.type_name == 'pkgconfig':
+ assert isinstance(dep, dependencies.ExternalDependency)
+ if dep.version_reqs is not None:
+ for req in dep.version_reqs:
+ if req.startswith(('>=', '==')):
+ commands += ['--target-glib', req[2:]]
+ break
+ elif isinstance(dep, dependencies.InternalDependency) and dep.version is not None:
+ glib_version = dep.version.split('.')
+ if len(glib_version) != 3:
+ mlog.warning(f'GLib version has unexpected format: {dep.version}')
+ break
+ try:
+ # If GLib version is a development version, downgrade
+ # --target-glib to the previous version, as valac will
+ # complain about non-even minor versions
+ glib_version[1] = str((int(glib_version[1]) // 2) * 2)
+ except ValueError:
+ mlog.warning(f'GLib version has unexpected format: {dep.version}')
+ break
+ commands += ['--target-glib', f'{glib_version[0]}.{glib_version[1]}']
+
# Fortran requires extra include directives.
if compiler.language == 'fortran':
for lt in chain(target.link_targets, target.link_whole_targets):
diff --git a/mesonbuild/build.py b/mesonbuild/build.py
index 7ebf3050d..72d376d17 100644
--- a/mesonbuild/build.py
+++ b/mesonbuild/build.py
@@ -1357,6 +1357,10 @@ class BuildTarget(Target):
deps = listify(deps)
for dep in deps:
if dep in self.added_deps:
+ # Prefer to add dependencies to added_deps which have a name
+ if dep.is_named():
+ self.added_deps.remove(dep)
+ self.added_deps.add(dep)
continue
if isinstance(dep, dependencies.InternalDependency):
diff --git a/mesonbuild/dependencies/base.py b/mesonbuild/dependencies/base.py
index 38bfc0822..732bae544 100644
--- a/mesonbuild/dependencies/base.py
+++ b/mesonbuild/dependencies/base.py
@@ -143,6 +143,11 @@ class Dependency(HoldableObject):
def is_built(self) -> bool:
return False
+ def is_named(self) -> bool:
+ if self.name is None:
+ return False
+ return self.name != f'dep{self._id}'
+
def summary_value(self) -> T.Union[str, mlog.AnsiDecorator, mlog.AnsiText]:
if not self.found():
return mlog.red('NO')
diff --git a/test cases/unit/129 vala internal glib/lib.vala b/test cases/unit/129 vala internal glib/lib.vala
new file mode 100644
index 000000000..e62e63234
--- /dev/null
+++ b/test cases/unit/129 vala internal glib/lib.vala
@@ -0,0 +1,3 @@
+public int func() {
+ return 42;
+}
diff --git a/test cases/unit/129 vala internal glib/meson.build b/test cases/unit/129 vala internal glib/meson.build
new file mode 100644
index 000000000..947908200
--- /dev/null
+++ b/test cases/unit/129 vala internal glib/meson.build
@@ -0,0 +1,21 @@
+project('vala internal glib')
+
+if not add_languages('vala', required: false)
+ error('MESON_SKIP_TEST valac not installed')
+endif
+
+glib_ver = get_option('glib-version')
+if glib_ver == 'unset'
+ error('Required to set -Dglib-version')
+endif
+
+glib_dep = declare_dependency(version: glib_ver)
+meson.override_dependency('glib-2.0', glib_dep)
+
+named_glib_dep = dependency('glib-2.0')
+
+assert(named_glib_dep.type_name() == 'internal')
+assert(glib_dep == named_glib_dep)
+
+tgt = static_library('vala-tgt', 'lib.vala',
+ dependencies: named_glib_dep)
diff --git a/test cases/unit/129 vala internal glib/meson.options b/test cases/unit/129 vala internal glib/meson.options
new file mode 100644
index 000000000..f8a1ecee3
--- /dev/null
+++ b/test cases/unit/129 vala internal glib/meson.options
@@ -0,0 +1 @@
+option('glib-version', type: 'string', value: 'unset')
diff --git a/unittests/platformagnostictests.py b/unittests/platformagnostictests.py
index ba2c38f75..9c5e2bd2c 100644
--- a/unittests/platformagnostictests.py
+++ b/unittests/platformagnostictests.py
@@ -95,6 +95,23 @@ class PlatformAgnosticTests(BasePlatformTests):
testdir = os.path.join(self.unit_test_dir, '102 python without pkgconfig')
self.init(testdir, override_envvars={'PKG_CONFIG': 'notfound'})
+ def test_vala_target_with_internal_glib(self):
+ testdir = os.path.join(self.unit_test_dir, '129 vala internal glib')
+ for run in [{ 'version': '2.84.4', 'expected': '2.84'}, { 'version': '2.85.2', 'expected': '2.84' }]:
+ self.new_builddir()
+ self.init(testdir, extra_args=[f'-Dglib-version={run["version"]}'])
+ try:
+ with open(os.path.join(self.builddir, 'meson-info', 'intro-targets.json'), 'r', encoding='utf-8') as tgt_intro:
+ intro = json.load(tgt_intro)
+ target = list(filter(lambda tgt: tgt['name'] == 'vala-tgt', intro))
+ self.assertLength(target, 1)
+ sources = target[0]['target_sources']
+ vala_sources = filter(lambda src: src.get('language') == 'vala', sources)
+ for src in vala_sources:
+ self.assertIn(('--target-glib', run['expected']), zip(src['parameters'], src['parameters'][1:]))
+ except FileNotFoundError:
+ self.skipTest('Current backend does not produce introspection data')
+
def test_debug_function_outputs_to_meson_log(self):
testdir = os.path.join(self.unit_test_dir, '104 debug function')
log_msg = 'This is an example debug output, should only end up in debug log'