@@ -371,7 +371,6 @@ def _process_member(member: str) -> None:
371371 ast .append (build .function ('subdir' , [build .string (member )]))
372372 processed_members [member ] = pkg
373373
374- ast .append (build .assign (build .function ('import' , [build .string ('rust' )]), 'rust' ))
375374 for member in ws .required_members :
376375 _process_member (member )
377376 ast = self ._create_project (name , processed_members .get ('.' ), build ) + ast
@@ -652,7 +651,16 @@ def _create_project(self, name: str, pkg: T.Optional[PackageState], build: build
652651 elif pkg .manifest .package .license_file :
653652 kwargs ['license_files' ] = build .string (pkg .manifest .package .license_file )
654653
655- return [build .function ('project' , args , kwargs )]
654+ # project(...)
655+ # rust = import('rust')
656+ # cargo = rust.workspace(dev_dependencies: False)
657+ return [
658+ build .function ('project' , args , kwargs ),
659+ build .assign (build .function ('import' , [build .string ('rust' )]),
660+ 'rust' ),
661+ build .assign (build .method ('workspace' , build .identifier ('rust' ), []),
662+ 'cargo' )
663+ ]
656664
657665 def _create_dependencies (self , pkg : PackageState , build : builder .Builder ) -> T .List [mparser .BaseNode ]:
658666 cfg = pkg .cfg
@@ -697,12 +705,24 @@ def _create_system_dependency(self, name: str, dep: SystemDependency, build: bui
697705
698706 def _create_dependency (self , pkg : PackageState , dep : Dependency , build : builder .Builder ) -> T .List [mparser .BaseNode ]:
699707 cfg = pkg .cfg
700- version_ = dep .meson_version or [pkg .manifest .package .version ]
701- kw = {
702- 'version' : build .array ([build .string (s ) for s in version_ ]),
703- }
704- # Lookup for this dependency with the features we want in default_options kwarg.
705- #
708+ dep_obj : mparser .BaseNode
709+ if self .cargolock and self .resolve_package (dep .package , dep .api ):
710+ dep_obj = build .method (
711+ 'dependency' ,
712+ build .method (
713+ 'subproject' ,
714+ build .identifier ('cargo' ),
715+ [build .string (dep .package ), build .string (dep .api )]))
716+ else :
717+ version_ = dep .meson_version or [pkg .manifest .package .version ]
718+ kw = {
719+ 'version' : build .array ([build .string (s ) for s in version_ ]),
720+ }
721+ dep_obj = build .function (
722+ 'dependency' ,
723+ [build .string (_dependency_name (dep .package , dep .api ))],
724+ kw )
725+
706726 # However, this subproject could have been previously configured with a
707727 # different set of features. Cargo collects the set of features globally
708728 # but Meson can only use features enabled by the first call that triggered
@@ -713,13 +733,9 @@ def _create_dependency(self, pkg: PackageState, dep: Dependency, build: builder.
713733 # option manually with -Dxxx-rs:feature-yyy=true, or the main project can do
714734 # that in its project(..., default_options: ['xxx-rs:feature-yyy=true']).
715735 return [
716- # xxx_dep = dependency ('xxx', version : ... )
736+ # xxx_dep = cargo.subproject ('xxx', 'api').dependency( )
717737 build .assign (
718- build .function (
719- 'dependency' ,
720- [build .string (_dependency_name (dep .package , dep .api ))],
721- kw ,
722- ),
738+ dep_obj ,
723739 _dependency_varname (dep ),
724740 ),
725741 # actual_features = xxx_dep.get_variable('features', default_value : '').split(',')
0 commit comments