Skip to content

Commit

Permalink
interpreter: when overriding a dependency make its name match
Browse files Browse the repository at this point in the history
Otherwise internal dependencies have auto-generated names that are not
human readable. Instead, use the name that the dependency overrides. For
example:

```meson
meson.override_dependency('zlib', declare_dependency())
dep_zlib = dependency('zlib')
assert(dep_zlib.name() == 'zlib')
```

Fixes: mesonbuild#12967
  • Loading branch information
dcbaker committed Sep 12, 2024
1 parent f81c681 commit 9dac852
Show file tree
Hide file tree
Showing 7 changed files with 79 additions and 4 deletions.
13 changes: 12 additions & 1 deletion mesonbuild/interpreter/mesonmain.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
# SPDX-License-Identifier: Apache-2.0
# Copyright 2012-2021 The Meson development team
# Copyright © 2021 Intel Corporation
# Copyright © 2021-2024 Intel Corporation
from __future__ import annotations

import copy
import os
import typing as T

Expand Down Expand Up @@ -348,6 +349,16 @@ def override_dependency_method(self, args: T.Tuple[str, dependencies.Dependency]
if not name:
raise InterpreterException('First argument must be a string and cannot be empty')

# Make a copy since we're going to mutate.
#
# dep = declare_dependency()
# meson.override_dependency('foo', dep)
# meson.override_dependency('foo-1.0', dep)
# dep = dependency('foo')
# dep.name() # == 'foo-1.0'
dep = copy.copy(dep)
dep.name = name

optkey = OptionKey('default_library', subproject=self.interpreter.subproject)
default_library = self.interpreter.coredata.get_option(optkey)
assert isinstance(default_library, str), 'for mypy'
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Copyright © 2018 Intel Corporation
# Copyright © 2018-2024 Intel Corporation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -29,4 +29,12 @@ dec_exe = executable(
dependencies : sub_dep,
)

# Ensure that two partial dependencies of the same dependency are applied, as
# they may provide different values.
dec2_exe = executable(
'declare_dep2',
files('main.c', 'other.c'),
dependencies : [sub_dep.partial_dependency(), sub_dep],
)

test('Declare Dependency', dec_exe)
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/*
* SPDX-License-Identifier: Apache-2.0
* Copyright © 2024 Intel Corporation
*/

#include <zlib.h>

int main(void) { return 0; }
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
/*
* SPDX-License-Identifier: Apache-2.0
* Copyright © 2024 Intel Corporation
*/

#include <zlib.h>
#include <string.h>

int main(void) {
const char * zver = zlibVersion();
return strcmp(zver, ZLIB_VERSION);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# SPDX-License-Identifier: Apache-2.0
# Copyright © 2024 Intel Corporation

# TODO: don't use compile whenever we get includes and compile args separated
dep_zlib_sub = dep_zlib.partial_dependency(compile_args : true, includes : true)

executable(
'zlib header only test',
'header_only.c',
dependencies : dep_zlib_sub,
)

executable(
'zlib link test',
'link.c',
dependencies : [dep_zlib_sub, dep_zlib],
)
5 changes: 4 additions & 1 deletion test cases/common/183 partial dependency/meson.build
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Copyright © 2018 Intel Corporation
# Copyright © 2018-2024 Intel Corporation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
Expand All @@ -15,3 +15,6 @@
project('partial dependency', ['c', 'cpp'])

subdir('declare_dependency')

dep_zlib = dependency('zlib', required : false)
subdir('external_dependency', if_found : dep_zlib)
18 changes: 17 additions & 1 deletion test cases/common/98 subproject subdir/meson.build
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
# SPDX-License-Identifier: Apache-2.0
# Copyright 2016-2023 The Meson Developers
# Copyright © 2024 Intel Corporation

project('proj', 'c')
subproject('sub')
libSub = dependency('sub', fallback: ['sub', 'libSub'])
Expand All @@ -6,7 +10,19 @@ exe = executable('prog', 'prog.c', dependencies: libSub)
test('subproject subdir', exe)

# Verify the subproject has placed dependency override.
dependency('sub-1.0')
d = dependency('sub-1.0')

# verify that the name is the overridden name
assert(d.name() == 'sub-1.0', 'name was not properly set, should have been "sub-1.0", but was @0@'.format(d.name()))

# Verify that when a dependency object is used for two overrides, the correct
# name is used
meson.override_dependency('new-dep', d)
d2 = dependency('new-dep')
assert(d2.name() == 'new-dep', 'name was not properly set, should have been "new-dep", but was @0@'.format(d2.name()))

# And that the old dependency wasn't changed
assert(d.name() == 'sub-1.0', 'original dependency was mutated.')

# Verify we can now take 'sub' dependency without fallback, but only version 1.0.
dependency('sub')
Expand Down

0 comments on commit 9dac852

Please sign in to comment.