Skip to content

Commit fea9f69

Browse files
sp1ritCSjpakkane
authored andcommitted
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: mesonbuild#14694
1 parent 19d3e4d commit fea9f69

File tree

7 files changed

+77
-5
lines changed

7 files changed

+77
-5
lines changed

mesonbuild/backend/backends.py

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1085,11 +1085,6 @@ def generate_basic_compiler_args(self, target: build.BuildTarget, compiler: 'Com
10851085
if compiler.language == 'vala':
10861086
if dep.type_name == 'pkgconfig':
10871087
assert isinstance(dep, dependencies.ExternalDependency)
1088-
if dep.name == 'glib-2.0' and dep.version_reqs is not None:
1089-
for req in dep.version_reqs:
1090-
if req.startswith(('>=', '==')):
1091-
commands += ['--target-glib', req[2:]]
1092-
break
10931088
commands += ['--pkg', dep.name]
10941089
elif isinstance(dep, dependencies.ExternalLibrary):
10951090
commands += dep.get_link_args('vala')
@@ -1101,6 +1096,32 @@ def generate_basic_compiler_args(self, target: build.BuildTarget, compiler: 'Com
11011096
commands += dep.get_exe_args(compiler)
11021097
# For 'automagic' deps: Boost and GTest. Also dependency('threads').
11031098
# pkg-config puts the thread flags itself via `Cflags:`
1099+
if compiler.language == 'vala':
1100+
# Vala wants to know the minimum glib version
1101+
for dep in target.added_deps:
1102+
if dep.name == 'glib-2.0':
1103+
if dep.type_name == 'pkgconfig':
1104+
assert isinstance(dep, dependencies.ExternalDependency)
1105+
if dep.version_reqs is not None:
1106+
for req in dep.version_reqs:
1107+
if req.startswith(('>=', '==')):
1108+
commands += ['--target-glib', req[2:]]
1109+
break
1110+
elif isinstance(dep, dependencies.InternalDependency) and dep.version is not None:
1111+
glib_version = dep.version.split('.')
1112+
if len(glib_version) != 3:
1113+
mlog.warning(f'GLib version has unexpected format: {dep.version}')
1114+
break
1115+
try:
1116+
# If GLib version is a development version, downgrade
1117+
# --target-glib to the previous version, as valac will
1118+
# complain about non-even minor versions
1119+
glib_version[1] = str((int(glib_version[1]) // 2) * 2)
1120+
except ValueError:
1121+
mlog.warning(f'GLib version has unexpected format: {dep.version}')
1122+
break
1123+
commands += ['--target-glib', f'{glib_version[0]}.{glib_version[1]}']
1124+
11041125
# Fortran requires extra include directives.
11051126
if compiler.language == 'fortran':
11061127
for lt in chain(target.link_targets, target.link_whole_targets):

mesonbuild/build.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1357,6 +1357,10 @@ def add_deps(self, deps):
13571357
deps = listify(deps)
13581358
for dep in deps:
13591359
if dep in self.added_deps:
1360+
# Prefer to add dependencies to added_deps which have a name
1361+
if dep.is_named():
1362+
self.added_deps.remove(dep)
1363+
self.added_deps.add(dep)
13601364
continue
13611365

13621366
if isinstance(dep, dependencies.InternalDependency):

mesonbuild/dependencies/base.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,11 @@ def __repr__(self) -> str:
143143
def is_built(self) -> bool:
144144
return False
145145

146+
def is_named(self) -> bool:
147+
if self.name is None:
148+
return False
149+
return self.name != f'dep{self._id}'
150+
146151
def summary_value(self) -> T.Union[str, mlog.AnsiDecorator, mlog.AnsiText]:
147152
if not self.found():
148153
return mlog.red('NO')
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
public int func() {
2+
return 42;
3+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
project('vala internal glib')
2+
3+
if not add_languages('vala', required: false)
4+
error('MESON_SKIP_TEST valac not installed')
5+
endif
6+
7+
glib_ver = get_option('glib-version')
8+
if glib_ver == 'unset'
9+
error('Required to set -Dglib-version')
10+
endif
11+
12+
glib_dep = declare_dependency(version: glib_ver)
13+
meson.override_dependency('glib-2.0', glib_dep)
14+
15+
named_glib_dep = dependency('glib-2.0')
16+
17+
assert(named_glib_dep.type_name() == 'internal')
18+
assert(glib_dep == named_glib_dep)
19+
20+
tgt = static_library('vala-tgt', 'lib.vala',
21+
dependencies: named_glib_dep)
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
option('glib-version', type: 'string', value: 'unset')

unittests/platformagnostictests.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,23 @@ def test_python_dependency_without_pkgconfig(self):
9595
testdir = os.path.join(self.unit_test_dir, '102 python without pkgconfig')
9696
self.init(testdir, override_envvars={'PKG_CONFIG': 'notfound'})
9797

98+
def test_vala_target_with_internal_glib(self):
99+
testdir = os.path.join(self.unit_test_dir, '129 vala internal glib')
100+
for run in [{ 'version': '2.84.4', 'expected': '2.84'}, { 'version': '2.85.2', 'expected': '2.84' }]:
101+
self.new_builddir()
102+
self.init(testdir, extra_args=[f'-Dglib-version={run["version"]}'])
103+
try:
104+
with open(os.path.join(self.builddir, 'meson-info', 'intro-targets.json'), 'r', encoding='utf-8') as tgt_intro:
105+
intro = json.load(tgt_intro)
106+
target = list(filter(lambda tgt: tgt['name'] == 'vala-tgt', intro))
107+
self.assertLength(target, 1)
108+
sources = target[0]['target_sources']
109+
vala_sources = filter(lambda src: src.get('language') == 'vala', sources)
110+
for src in vala_sources:
111+
self.assertIn(('--target-glib', run['expected']), zip(src['parameters'], src['parameters'][1:]))
112+
except FileNotFoundError:
113+
self.skipTest('Current backend does not produce introspection data')
114+
98115
def test_debug_function_outputs_to_meson_log(self):
99116
testdir = os.path.join(self.unit_test_dir, '104 debug function')
100117
log_msg = 'This is an example debug output, should only end up in debug log'

0 commit comments

Comments
 (0)