Skip to content

Commit a808902

Browse files
committed
modules: rust: invoke subprojects automatically from dependencies()
Signed-off-by: Paolo Bonzini <[email protected]>
1 parent 736cf07 commit a808902

File tree

5 files changed

+33
-16
lines changed

5 files changed

+33
-16
lines changed

mesonbuild/cargo/interpreter.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@
2222
from .cfg import eval_cfg
2323
from .toml import load_toml
2424
from .manifest import Manifest, CargoLock, CargoLockPackage, Workspace, fixup_meson_varname
25-
from ..mesonlib import is_parent_path, MesonException, MachineChoice, unique_list, version_compare
25+
from ..mesonlib import (
26+
is_parent_path, lazy_property, MesonException, MachineChoice,
27+
unique_list, version_compare)
2628
from .. import coredata, mlog
2729
from ..wrap.wrap import PackageDefinition
2830

@@ -103,6 +105,12 @@ class PackageState:
103105
# Package configuration state
104106
cfg: T.Optional[PackageConfiguration] = None
105107

108+
@lazy_property
109+
def path(self) -> T.Optional[str]:
110+
if not self.ws_subdir:
111+
return None
112+
return os.path.normpath(os.path.join(self.ws_subdir, self.ws_member))
113+
106114
def get_env_dict(self, environment: Environment, subdir: str) -> T.Dict[str, str]:
107115
"""Get environment variables for this package."""
108116
# Common variables for build.rs and crates

mesonbuild/modules/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ def __init__(self, interpreter: 'Interpreter') -> None:
3636
self.source_root = interpreter.environment.get_source_dir()
3737
self.build_to_src = relpath(interpreter.environment.get_source_dir(),
3838
interpreter.environment.get_build_dir())
39+
self.subproject_dir = interpreter.subproject_dir
3940
self.subproject = interpreter.subproject
4041
self.subdir = interpreter.subdir
4142
self.root_subdir = interpreter.root_subdir

mesonbuild/modules/rust.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
)
2424
from ..interpreterbase import ContainerTypeInfo, InterpreterException, KwargInfo, typed_kwargs, typed_pos_args, noKwargs, noPosargs, permittedKwargs
2525
from ..interpreter.interpreterobjects import Doctest
26-
from ..mesonlib import File, MachineChoice, MesonException, PerMachine
26+
from ..mesonlib import (is_parent_path, File, MachineChoice, MesonException, PerMachine)
2727
from ..programs import ExternalProgram, NonExistingExternalProgram
2828

2929
if T.TYPE_CHECKING:
@@ -116,6 +116,10 @@ def __init__(self, interpreter: Interpreter, ws: cargo.WorkspaceState) -> None:
116116
'subproject': self.subproject_method,
117117
})
118118

119+
@property
120+
def subdir(self) -> str:
121+
return self.ws.subdir
122+
119123
@noPosargs
120124
@noKwargs
121125
def packages_method(self, state: ModuleState, args: T.List, kwargs: TYPE_kwargs) -> T.List[str]:
@@ -245,6 +249,10 @@ def dependencies_method(self, state: ModuleState, args: T.List, kwargs: T.Dict[s
245249
if kwargs['dependencies']:
246250
for dep_key, dep_pkg in cfg.dep_packages.items():
247251
if dep_pkg.manifest.lib:
252+
if dep_pkg.ws_subdir != self.rust_ws.subdir or \
253+
is_parent_path(os.path.join(self.rust_ws.subdir, state.subproject_dir),
254+
dep_pkg.path):
255+
self.rust_ws._do_subproject(dep_pkg)
248256
# Get the dependency name for this package
249257
depname = dep_pkg.get_dependency_name(None)
250258
dependency = state.overridden_dependency(depname)

test cases/rust/31 rust.workspace package/meson.build

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,20 +20,20 @@ assert(hello_rs.api() == '1')
2020
assert(hello_rs.all_features() == ['default', 'goodbye'])
2121
assert(hello_rs.features() == ['default', 'goodbye'])
2222

23-
answer_rs = cargo.subproject('answer', '2')
24-
assert(answer_rs.name() == 'answer')
25-
assert(answer_rs.version() == '2.1.0')
26-
assert(answer_rs.api() == '2')
27-
assert(answer_rs.all_features() == ['default', 'large'])
28-
assert(answer_rs.features() == ['default', 'large'])
29-
3023
e = executable('package-test', 'src/main.rs',
3124
dependencies: main_pkg.dependencies(),
3225
rust_args: main_pkg.rust_args(),
3326
rust_dependency_map: main_pkg.rust_dependency_map(),
3427
)
3528
test('package-test', e)
3629

30+
answer_rs = cargo.subproject('answer', '2')
31+
assert(answer_rs.name() == 'answer')
32+
assert(answer_rs.version() == '2.1.0')
33+
assert(answer_rs.api() == '2')
34+
assert(answer_rs.all_features() == ['default', 'large'])
35+
assert(answer_rs.features() == ['default', 'large'])
36+
3737
# failure test cases for package()
3838
testcase expect_error('argument to package() cannot be a subproject')
3939
cargo.package('hello')

test cases/rust/32 rust.workspace workspace/meson.build

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,6 @@ assert(hello_rs.api() == '1')
2020
assert(hello_rs.all_features() == ['default', 'goodbye'])
2121
assert(hello_rs.features() == ['default', 'goodbye'])
2222

23-
answer_rs = cargo.subproject('answer', '2')
24-
assert(answer_rs.name() == 'answer')
25-
assert(answer_rs.version() == '2.1.0')
26-
assert(answer_rs.api() == '2')
27-
assert(answer_rs.all_features() == ['default', 'large'])
28-
assert(answer_rs.features() == ['default', 'large'])
29-
3023
subdir('more')
3124

3225
e = executable('workspace-test', 'src/main.rs',
@@ -36,6 +29,13 @@ e = executable('workspace-test', 'src/main.rs',
3629
)
3730
test('workspace-test', e)
3831

32+
answer_rs = cargo.subproject('answer', '2')
33+
assert(answer_rs.name() == 'answer')
34+
assert(answer_rs.version() == '2.1.0')
35+
assert(answer_rs.api() == '2')
36+
assert(answer_rs.all_features() == ['default', 'large'])
37+
assert(answer_rs.features() == ['default', 'large'])
38+
3939
# failure test cases for package()
4040
testcase expect_error('argument to package() cannot be a subproject')
4141
cargo.package('hello')

0 commit comments

Comments
 (0)