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, and applying other unit adjustments based on the whole graph.
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.
This is also responsible for adjusting the strip
profile option to
opportunistically strip if debug is 0 for all dependencies. This helps
remove debuginfo added by the standard library.
This is also responsible for adjusting the debug
setting for host
dependencies, turning off debug if the user has not explicitly enabled it,
and the unit is not shared with a target unit.