@@ -537,7 +537,7 @@ impl Step for Rustc {
537
537
538
538
fn should_run ( run : ShouldRun < ' _ > ) -> ShouldRun < ' _ > {
539
539
let builder = run. builder ;
540
- run. krate ( "rustc-main" ) . default_condition ( builder. config . docs )
540
+ run. krate ( "rustc-main" ) . path ( "compiler" ) . default_condition ( builder. config . docs )
541
541
}
542
542
543
543
fn make_run ( run : RunConfig < ' _ > ) {
@@ -553,9 +553,24 @@ impl Step for Rustc {
553
553
fn run ( self , builder : & Builder < ' _ > ) {
554
554
let stage = self . stage ;
555
555
let target = self . target ;
556
+ let mut is_explicit_request = false ;
556
557
builder. info ( & format ! ( "Documenting stage{} compiler ({})" , stage, target) ) ;
557
558
558
- if !builder. config . compiler_docs {
559
+ let paths = builder
560
+ . paths
561
+ . iter ( )
562
+ . map ( components_simplified)
563
+ . filter_map ( |path| {
564
+ if path. get ( 0 ) == Some ( & "compiler" ) {
565
+ is_explicit_request = true ;
566
+ path. get ( 1 ) . map ( |p| p. to_owned ( ) )
567
+ } else {
568
+ None
569
+ }
570
+ } )
571
+ . collect :: < Vec < _ > > ( ) ;
572
+
573
+ if !builder. config . compiler_docs && !is_explicit_request {
559
574
builder. info ( "\t skipping - compiler/librustdoc docs disabled" ) ;
560
575
return ;
561
576
}
@@ -604,26 +619,54 @@ impl Step for Rustc {
604
619
cargo. rustdocflag ( "--extern-html-root-url" ) ;
605
620
cargo. rustdocflag ( "ena=https://docs.rs/ena/latest/" ) ;
606
621
607
- // Find dependencies for top level crates.
608
622
let mut compiler_crates = HashSet :: new ( ) ;
609
- for root_crate in & [ "rustc_driver" , "rustc_codegen_llvm" , "rustc_codegen_ssa" ] {
610
- compiler_crates. extend (
611
- builder
612
- . in_tree_crates ( root_crate, Some ( target) )
613
- . into_iter ( )
614
- . map ( |krate| krate. name ) ,
615
- ) ;
623
+
624
+ if paths. is_empty ( ) {
625
+ // Find dependencies for top level crates.
626
+ for root_crate in & [ "rustc_driver" , "rustc_codegen_llvm" , "rustc_codegen_ssa" ] {
627
+ compiler_crates. extend (
628
+ builder
629
+ . in_tree_crates ( root_crate, Some ( target) )
630
+ . into_iter ( )
631
+ . map ( |krate| krate. name ) ,
632
+ ) ;
633
+ }
634
+ } else {
635
+ for root_crate in paths {
636
+ if !builder. src . join ( "compiler" ) . join ( & root_crate) . exists ( ) {
637
+ builder. info ( & format ! (
638
+ "\t skipping - compiler/{} (unknown compiler crate)" ,
639
+ root_crate
640
+ ) ) ;
641
+ } else {
642
+ compiler_crates. extend (
643
+ builder
644
+ . in_tree_crates ( root_crate, Some ( target) )
645
+ . into_iter ( )
646
+ . map ( |krate| krate. name ) ,
647
+ ) ;
648
+ }
649
+ }
616
650
}
617
651
652
+ let mut to_open = None ;
618
653
for krate in & compiler_crates {
619
654
// Create all crate output directories first to make sure rustdoc uses
620
655
// relative links.
621
656
// FIXME: Cargo should probably do this itself.
622
657
t ! ( fs:: create_dir_all( out_dir. join( krate) ) ) ;
623
658
cargo. arg ( "-p" ) . arg ( krate) ;
659
+ if to_open. is_none ( ) {
660
+ to_open = Some ( krate) ;
661
+ }
624
662
}
625
663
626
664
builder. run ( & mut cargo. into ( ) ) ;
665
+ // Let's open the first crate documentation page:
666
+ if let Some ( krate) = to_open {
667
+ let index = out. join ( krate) . join ( "index.html" ) ;
668
+ open ( builder, & index) ;
669
+ }
627
670
}
628
671
}
629
672
0 commit comments