@@ -754,21 +754,31 @@ fn doc_std(
754754 builder. cp_link_r ( & out_dir, out) ;
755755}
756756
757+ /// Prepare a compiler that will be able to document something for `target` at `stage`.
758+ fn prepare_doc_compiler ( builder : & Builder < ' _ > , target : TargetSelection , stage : u32 ) -> Compiler {
759+ let build_compiler = builder. compiler ( stage - 1 , builder. host_target ) ;
760+ builder. std ( build_compiler, target) ;
761+ build_compiler
762+ }
763+
764+ /// Document the compiler for the given `target` using rustdoc from `build_compiler`.
757765#[ derive( Debug , Clone , Hash , PartialEq , Eq ) ]
758766pub struct Rustc {
759- pub stage : u32 ,
760- pub target : TargetSelection ,
767+ build_compiler : Compiler ,
768+ target : TargetSelection ,
761769 crates : Vec < String > ,
762770}
763771
764772impl Rustc {
765- pub ( crate ) fn new ( stage : u32 , target : TargetSelection , builder : & Builder < ' _ > ) -> Self {
773+ /// Document `stage` compiler for the given `target`.
774+ pub ( crate ) fn for_stage ( builder : & Builder < ' _ > , target : TargetSelection , stage : u32 ) -> Self {
766775 let crates = builder
767776 . in_tree_crates ( "rustc-main" , Some ( target) )
768777 . into_iter ( )
769778 . map ( |krate| krate. name . to_string ( ) )
770779 . collect ( ) ;
771- Self { stage, target, crates }
780+ let build_compiler = prepare_doc_compiler ( builder, target, stage) ;
781+ Self { build_compiler, target, crates }
772782 }
773783}
774784
@@ -785,11 +795,7 @@ impl Step for Rustc {
785795 }
786796
787797 fn make_run ( run : RunConfig < ' _ > ) {
788- run. builder . ensure ( Rustc {
789- stage : run. builder . top_stage ,
790- target : run. target ,
791- crates : run. make_run_crates ( Alias :: Compiler ) ,
792- } ) ;
798+ run. builder . ensure ( Rustc :: for_stage ( run. builder , run. target , run. builder . top_stage ) ) ;
793799 }
794800
795801 /// Generates compiler documentation.
@@ -799,7 +805,6 @@ impl Step for Rustc {
799805 /// we do not merge it with the other documentation from std, test and
800806 /// proc_macros. This is largely just a wrapper around `cargo doc`.
801807 fn run ( self , builder : & Builder < ' _ > ) {
802- let stage = self . stage ;
803808 let target = self . target ;
804809
805810 // This is the intended out directory for compiler documentation.
@@ -808,21 +813,21 @@ impl Step for Rustc {
808813
809814 // Build the standard library, so that proc-macros can use it.
810815 // (Normally, only the metadata would be necessary, but proc-macros are special since they run at compile-time.)
811- let compiler = builder . compiler ( stage , builder . config . host_target ) ;
812- builder. std ( compiler , builder. config . host_target ) ;
816+ let build_compiler = self . build_compiler ;
817+ builder. std ( build_compiler , builder. config . host_target ) ;
813818
814819 let _guard = builder. msg_rustc_tool (
815820 Kind :: Doc ,
816- stage,
821+ build_compiler . stage ,
817822 format ! ( "compiler{}" , crate_description( & self . crates) ) ,
818- compiler . host ,
823+ build_compiler . host ,
819824 target,
820825 ) ;
821826
822827 // Build cargo command.
823828 let mut cargo = builder:: Cargo :: new (
824829 builder,
825- compiler ,
830+ build_compiler ,
826831 Mode :: Rustc ,
827832 SourceType :: InTree ,
828833 target,
@@ -840,7 +845,7 @@ impl Step for Rustc {
840845 // If there is any bug, please comment out the next line.
841846 cargo. rustdocflag ( "--generate-link-to-definition" ) ;
842847
843- compile:: rustc_cargo ( builder, & mut cargo, target, & compiler , & self . crates ) ;
848+ compile:: rustc_cargo ( builder, & mut cargo, target, & build_compiler , & self . crates ) ;
844849 cargo. arg ( "-Zskip-rustdoc-fingerprint" ) ;
845850
846851 // Only include compiler crates, no dependencies of those, such as `libc`.
@@ -855,7 +860,7 @@ impl Step for Rustc {
855860
856861 let mut to_open = None ;
857862
858- let out_dir = builder. stage_out ( compiler , Mode :: Rustc ) . join ( target) . join ( "doc" ) ;
863+ let out_dir = builder. stage_out ( build_compiler , Mode :: Rustc ) . join ( target) . join ( "doc" ) ;
859864 for krate in & * self . crates {
860865 // Create all crate output directories first to make sure rustdoc uses
861866 // relative links.
@@ -877,7 +882,7 @@ impl Step for Rustc {
877882 symlink_dir_force ( & builder. config , & out, & out_dir) ;
878883 // Cargo puts proc macros in `target/doc` even if you pass `--target`
879884 // explicitly (https://github.com/rust-lang/cargo/issues/7677).
880- let proc_macro_out_dir = builder. stage_out ( compiler , Mode :: Rustc ) . join ( "doc" ) ;
885+ let proc_macro_out_dir = builder. stage_out ( build_compiler , Mode :: Rustc ) . join ( "doc" ) ;
881886 symlink_dir_force ( & builder. config , & out, & proc_macro_out_dir) ;
882887
883888 cargo. into_cmd ( ) . run ( builder) ;
@@ -903,7 +908,7 @@ impl Step for Rustc {
903908 }
904909
905910 fn metadata ( & self ) -> Option < StepMetadata > {
906- Some ( StepMetadata :: doc ( "rustc" , self . target ) . stage ( self . stage ) )
911+ Some ( StepMetadata :: doc ( "rustc" , self . target ) . built_by ( self . build_compiler ) )
907912 }
908913}
909914
0 commit comments