Function cargo::ops::cargo_compile::rebuild_unit_graph_shared
source · fn rebuild_unit_graph_shared(
interner: &UnitInterner,
unit_graph: UnitGraph,
roots: &[Unit],
scrape_units: &[Unit],
to_host: Option<CompileKind>
) -> (Vec<Unit>, Vec<Unit>, UnitGraph)
Expand description
This is used to rebuild the unit graph, sharing host dependencies if possible.
This will translate any unit’s CompileKind::Target(host)
to
CompileKind::Host
if to_host
is not None
and the kind is equal to to_host
.
This also handles generating the unit dep_hash
, and merging shared units if possible.
This is necessary because if normal dependencies used CompileKind::Host
,
there would be no way to distinguish those units from build-dependency
units or artifact dependency units.
This can cause a problem if a shared normal/build/artifact dependency needs
to link to another dependency whose features differ based on whether or
not it is a normal, build or artifact dependency. If all units used
CompileKind::Host
, then they would end up being identical, causing a
collision in the UnitGraph
, and Cargo would end up randomly choosing one
value or the other.
The solution is to keep normal, build and artifact dependencies separate when
building the unit graph, and then run this second pass which will try to
combine shared dependencies safely. By adding a hash of the dependencies
to the Unit
, this allows the CompileKind
to be changed back to Host
and artifact_target_for_features
to be removed without fear of an unwanted
collision for build or artifact dependencies.