@@ -138,10 +138,11 @@ def interpret_package(self, manifest: Manifest, build: builder.Builder, subdir:
138
138
else :
139
139
pkg , cached = self ._fetch_package (manifest .package .name , manifest .package .api )
140
140
if not cached :
141
- self ._prepare_package (pkg )
142
- # This is an entry point, always enable the 'default' feature.
143
- # FIXME: We should have a Meson option similar to `cargo build --no-default-features`
144
- self ._enable_feature (pkg , 'default' )
141
+ for machine in pkg .manifest .machines_from (MachineChoice .HOST ):
142
+ self ._prepare_package (pkg , machine )
143
+ # This is an entry point, always enable the 'default' feature.
144
+ # FIXME: We should have a Meson option similar to `cargo build --no-default-features`
145
+ self ._enable_feature (pkg , 'default' , machine )
145
146
ast += self ._create_project (pkg .manifest .package .name , pkg , build )
146
147
ast .append (build .assign (build .function ('import' , [build .string ('rust' )]), 'rust' ))
147
148
ast += self ._create_package (pkg , build , subdir )
@@ -186,6 +187,8 @@ def _create_package(self, pkg: PackageState, build: builder.Builder, subdir: str
186
187
187
188
if pkg .manifest .lib :
188
189
for crate_type in pkg .manifest .lib .crate_type :
190
+ if crate_type == 'proc-macro' and machine == MachineChoice .HOST :
191
+ continue
189
192
ast .extend (self ._create_lib (pkg , build , crate_type , machine ))
190
193
191
194
return ast
@@ -199,7 +202,8 @@ def interpret_workspace(self, workspace: Workspace, build: builder.Builder, subd
199
202
if not ws .required_members :
200
203
for member in ws .workspace .default_members :
201
204
pkg = self ._require_workspace_member (ws , member )
202
- self ._prepare_package (pkg )
205
+ for machine in pkg .manifest .machines_from (MachineChoice .HOST ):
206
+ self ._prepare_package (pkg , machine )
203
207
204
208
# Call subdir() for each required member of the workspace. The order is
205
209
# important, if a member depends on another member, that member must be
@@ -210,12 +214,16 @@ def _process_member(member: str) -> None:
210
214
if member in processed_members :
211
215
return
212
216
pkg = ws .packages [member ]
213
- cfg = pkg .cfg [MachineChoice .HOST ]
214
- for depname in cfg .required_deps :
215
- dep = pkg .manifest .dependencies [depname ]
216
- if dep .path :
217
- dep_member = os .path .normpath (os .path .join (pkg .ws_member , dep .path ))
218
- _process_member (dep_member )
217
+ # Process dependencies for all configured machines
218
+ for machine in MachineChoice :
219
+ cfg = pkg .cfg [machine ]
220
+ if cfg is None :
221
+ continue
222
+ for depname in cfg .required_deps :
223
+ dep = pkg .manifest .dependencies [depname ]
224
+ if dep .path :
225
+ dep_member = os .path .normpath (os .path .join (pkg .ws_member , dep .path ))
226
+ _process_member (dep_member )
219
227
if member == '.' :
220
228
ast .extend (self ._create_package (pkg , build , subdir ))
221
229
else :
@@ -295,20 +303,21 @@ def _fetch_package_from_subproject(self, package_name: str, meson_depname: str)
295
303
self .packages [key ] = pkg
296
304
return pkg , False
297
305
298
- def _prepare_package (self , pkg : PackageState ) -> None :
299
- if pkg .cfg [MachineChoice .HOST ]:
300
- return
306
+ def _prepare_package (self , pkg : PackageState , machine : MachineChoice ) -> None :
307
+ """Prepare package configuration for specific machine."""
308
+ if pkg .cfg [machine ] is not None :
309
+ return # Already prepared for this machine
301
310
302
- pkg .cfg [MachineChoice . HOST ] = PackageConfiguration ()
303
- # Merge target specific dependencies that are enabled
304
- cfgs = self ._get_cfgs (MachineChoice . HOST )
311
+ pkg .cfg [machine ] = PackageConfiguration ()
312
+ # Merge target- specific dependencies that are enabled for this machine
313
+ target_cfgs = self ._get_cfgs (machine )
305
314
for condition , dependencies in pkg .manifest .target .items ():
306
- if eval_cfg (condition , cfgs ):
315
+ if eval_cfg (condition , target_cfgs ):
307
316
pkg .manifest .dependencies .update (dependencies )
308
- # Fetch required dependencies recursively.
317
+ # Fetch required dependencies recursively for this machine
309
318
for depname , dep in pkg .manifest .dependencies .items ():
310
319
if not dep .optional :
311
- self ._add_dependency (pkg , depname )
320
+ self ._add_dependency (pkg , depname , machine )
312
321
313
322
def _dep_package (self , pkg : PackageState , dep : Dependency ) -> PackageState :
314
323
if dep .path :
@@ -363,8 +372,8 @@ def _load_manifest(self, subdir: str, workspace: T.Optional[Workspace] = None, m
363
372
self .manifests [subdir ] = manifest_
364
373
return manifest_
365
374
366
- def _add_dependency (self , pkg : PackageState , depname : str ) -> None :
367
- cfg = pkg .cfg [MachineChoice . HOST ]
375
+ def _add_dependency (self , pkg : PackageState , depname : str , machine : MachineChoice ) -> None :
376
+ cfg = pkg .cfg [machine ]
368
377
if depname in cfg .required_deps :
369
378
return
370
379
dep = pkg .manifest .dependencies .get (depname )
@@ -373,22 +382,24 @@ def _add_dependency(self, pkg: PackageState, depname: str) -> None:
373
382
return
374
383
cfg .required_deps .add (depname )
375
384
dep_pkg = self ._dep_package (pkg , dep )
376
- self ._prepare_package (dep_pkg )
377
- if dep .default_features :
378
- self ._enable_feature (dep_pkg , 'default' )
379
- for f in dep .features :
380
- self ._enable_feature (dep_pkg , f )
381
- for f in cfg .optional_deps_features [depname ]:
382
- self ._enable_feature (dep_pkg , f )
383
-
384
- def _enable_feature (self , pkg : PackageState , feature : str ) -> None :
385
- cfg = pkg .cfg [MachineChoice .HOST ]
385
+ # Use machines_from() to determine which machines the dependency needs
386
+ for dep_machine in dep_pkg .manifest .machines_from (machine ):
387
+ self ._prepare_package (dep_pkg , dep_machine )
388
+ if dep .default_features :
389
+ self ._enable_feature (dep_pkg , 'default' , dep_machine )
390
+ for f in dep .features :
391
+ self ._enable_feature (dep_pkg , f , dep_machine )
392
+ for f in cfg .optional_deps_features [depname ]:
393
+ self ._enable_feature (dep_pkg , f , dep_machine )
394
+
395
+ def _enable_feature (self , pkg : PackageState , feature : str , machine : MachineChoice ) -> None :
396
+ cfg = pkg .cfg [machine ]
386
397
if feature in cfg .features :
387
398
return
388
399
cfg .features .add (feature )
389
400
# A feature can also be a dependency.
390
401
if feature in pkg .manifest .dependencies :
391
- self ._add_dependency (pkg , feature )
402
+ self ._add_dependency (pkg , feature , machine )
392
403
# Recurse on extra features and dependencies this feature pulls.
393
404
# https://doc.rust-lang.org/cargo/reference/features.html#the-features-section
394
405
for f in pkg .manifest .features .get (feature , []):
@@ -397,19 +408,21 @@ def _enable_feature(self, pkg: PackageState, feature: str) -> None:
397
408
if depname [- 1 ] == '?' :
398
409
depname = depname [:- 1 ]
399
410
else :
400
- self ._add_dependency (pkg , depname )
411
+ self ._add_dependency (pkg , depname , machine )
401
412
if depname in cfg .required_deps :
402
413
dep = pkg .manifest .dependencies [depname ]
403
414
dep_pkg = self ._dep_package (pkg , dep )
404
- self ._enable_feature (dep_pkg , dep_f )
415
+ # Use machines_from() to determine which machines the dependency needs
416
+ for dep_machine in dep_pkg .manifest .machines_from (machine ):
417
+ self ._enable_feature (dep_pkg , dep_f , dep_machine )
405
418
else :
406
419
# This feature will be enabled only if that dependency
407
420
# is later added.
408
421
cfg .optional_deps_features [depname ].add (dep_f )
409
422
elif f .startswith ('dep:' ):
410
- self ._add_dependency (pkg , f [4 :])
423
+ self ._add_dependency (pkg , f [4 :], machine )
411
424
else :
412
- self ._enable_feature (pkg , f )
425
+ self ._enable_feature (pkg , f , machine )
413
426
414
427
def has_check_cfg (self , machine : MachineChoice ) -> bool :
415
428
if not self .environment .is_cross_build ():
@@ -501,8 +514,10 @@ def _create_dependencies(self, pkg: PackageState, build: builder.Builder, machin
501
514
for depname in cfg .required_deps :
502
515
dep = pkg .manifest .dependencies [depname ]
503
516
dep_pkg = self ._dep_package (pkg , dep )
504
- if dep_pkg .manifest .lib :
505
- ast += self ._create_dependency (dep_pkg , dep , build , machine )
517
+ if not dep_pkg .manifest .lib :
518
+ continue
519
+ for dep_machine in dep_pkg .manifest .machines_from (machine ):
520
+ ast += self ._create_dependency (dep_pkg , dep , build , dep_machine )
506
521
ast .append (build .assign (build .array ([]), 'system_deps_args' ))
507
522
for name , sys_dep in pkg .manifest .system_dependencies .items ():
508
523
if sys_dep .enabled (cfg .features ):
@@ -626,10 +641,11 @@ def _create_lib(self, pkg: PackageState, build: builder.Builder, crate_type: raw
626
641
for name in cfg .required_deps :
627
642
dep = pkg .manifest .dependencies [name ]
628
643
dep_pkg = self ._dep_package (pkg , dep )
629
- dependencies .append (build .identifier (_dependency_varname (dep .package , machine )))
644
+ for dep_machine in dep_pkg .manifest .machines_from (machine ):
645
+ dependencies .append (build .identifier (_dependency_varname (dep .package , dep_machine )))
630
646
dep_lib_name = dep_pkg .manifest .lib .name
631
647
dep_crate_name = name if name != dep .package else dep_lib_name
632
- dependency_map [build .string (_fixup_meson_target_name (dep_lib_name , machine ))] = build .string (dep_crate_name )
648
+ dependency_map [build .string (_fixup_meson_target_name (dep_lib_name , dep_machine ))] = build .string (dep_crate_name )
633
649
for name , sys_dep in pkg .manifest .system_dependencies .items ():
634
650
if sys_dep .enabled (cfg .features ):
635
651
dependencies .append (build .identifier (f'{ fixup_meson_varname (name )} _system_dep' ))
0 commit comments