@@ -84,7 +84,7 @@ impl Step for ToolBuild {
84
84
//
85
85
// Compiler tools should be linked in the same way as the compiler it's paired with,
86
86
// so it must be built with the previous stage compiler.
87
- self . compiler . stage -= 1
87
+ self . compiler . stage -= 1 ;
88
88
}
89
89
Mode :: ToolStd => builder. ensure ( compile:: Std :: new ( self . compiler , self . target ) ) ,
90
90
Mode :: ToolBootstrap => { }
@@ -580,118 +580,74 @@ impl Step for Rustdoc {
580
580
}
581
581
582
582
fn run ( self , builder : & Builder < ' _ > ) -> PathBuf {
583
- let target_compiler = self . compiler ;
584
- if target_compiler. stage == 0 {
585
- if !target_compiler. is_snapshot ( builder) {
583
+ let compiler = self . compiler ;
584
+ let target = compiler. host ;
585
+
586
+ if compiler. stage == 0 {
587
+ if !compiler. is_snapshot ( builder) {
586
588
panic ! ( "rustdoc in stage 0 must be snapshot rustdoc" ) ;
587
589
}
588
- return builder. initial_rustc . with_file_name ( exe ( "rustdoc" , target_compiler . host ) ) ;
590
+ return builder. initial_rustc . with_file_name ( exe ( "rustdoc" , compiler . host ) ) ;
589
591
}
590
- let target = target_compiler. host ;
591
592
592
593
let bin_rustdoc = || {
593
- let sysroot = builder. sysroot ( target_compiler ) ;
594
+ let sysroot = builder. sysroot ( compiler ) ;
594
595
let bindir = sysroot. join ( "bin" ) ;
595
596
t ! ( fs:: create_dir_all( & bindir) ) ;
596
- let bin_rustdoc = bindir. join ( exe ( "rustdoc" , target_compiler . host ) ) ;
597
+ let bin_rustdoc = bindir. join ( exe ( "rustdoc" , target ) ) ;
597
598
let _ = fs:: remove_file ( & bin_rustdoc) ;
598
599
bin_rustdoc
599
600
} ;
600
601
601
602
// If CI rustc is enabled and we haven't modified the rustdoc sources,
602
603
// use the precompiled rustdoc from CI rustc's sysroot to speed up bootstrapping.
603
604
if builder. download_rustc ( )
604
- && target_compiler . stage > 0
605
+ && compiler . stage > 0
605
606
&& builder. rust_info ( ) . is_managed_git_subrepository ( )
606
607
{
607
608
let files_to_track = & [ "src/librustdoc" , "src/tools/rustdoc" ] ;
608
609
609
610
// Check if unchanged
610
611
if builder. config . last_modified_commit ( files_to_track, "download-rustc" , true ) . is_some ( )
611
612
{
612
- let precompiled_rustdoc = builder
613
- . config
614
- . ci_rustc_dir ( )
615
- . join ( "bin" )
616
- . join ( exe ( "rustdoc" , target_compiler. host ) ) ;
613
+ let precompiled_rustdoc =
614
+ builder. config . ci_rustc_dir ( ) . join ( "bin" ) . join ( exe ( "rustdoc" , target) ) ;
617
615
618
616
let bin_rustdoc = bin_rustdoc ( ) ;
619
617
builder. copy_link ( & precompiled_rustdoc, & bin_rustdoc) ;
620
618
return bin_rustdoc;
621
619
}
622
620
}
623
621
624
- let build_compiler = if builder. download_rustc ( ) && target_compiler. stage == 1 {
625
- // We already have the stage 1 compiler, we don't need to cut the stage.
626
- builder. compiler ( target_compiler. stage , builder. config . build )
627
- } else {
628
- // Similar to `compile::Assemble`, build with the previous stage's compiler. Otherwise
629
- // we'd have stageN/bin/rustc and stageN/bin/rustdoc be effectively different stage
630
- // compilers, which isn't what we want. Rustdoc should be linked in the same way as the
631
- // rustc compiler it's paired with, so it must be built with the previous stage compiler.
632
- builder. compiler ( target_compiler. stage - 1 , builder. config . build )
633
- } ;
634
-
635
- // When using `download-rustc` and a stage0 build_compiler, copying rustc doesn't actually
636
- // build stage0 libstd (because the libstd in sysroot has the wrong ABI). Explicitly build
637
- // it.
638
- builder. ensure ( compile:: Std :: new ( build_compiler, target_compiler. host ) ) ;
639
- builder. ensure ( compile:: Rustc :: new ( build_compiler, target_compiler. host ) ) ;
640
-
641
622
// The presence of `target_compiler` ensures that the necessary libraries (codegen backends,
642
623
// compiler libraries, ...) are built. Rustdoc does not require the presence of any
643
624
// libraries within sysroot_libdir (i.e., rustlib), though doctests may want it (since
644
625
// they'll be linked to those libraries). As such, don't explicitly `ensure` any additional
645
626
// libraries here. The intuition here is that If we've built a compiler, we should be able
646
627
// to build rustdoc.
647
628
//
648
- let mut features = Vec :: new ( ) ;
629
+ let mut extra_features = Vec :: new ( ) ;
649
630
if builder. config . jemalloc {
650
- features . push ( "jemalloc" . to_string ( ) ) ;
631
+ extra_features . push ( "jemalloc" . to_string ( ) ) ;
651
632
}
652
633
653
- // NOTE: Never modify the rustflags here, it breaks the build cache for other tools!
654
- let mut cargo = prepare_tool_cargo (
655
- builder,
656
- build_compiler,
657
- Mode :: ToolRustc ,
634
+ let tool_rustdoc = builder. ensure ( ToolBuild {
635
+ compiler,
658
636
target,
659
- Kind :: Build ,
660
- "src/tools/rustdoc" ,
661
- SourceType :: InTree ,
662
- features. as_slice ( ) ,
663
- ) ;
664
-
665
- // rustdoc is performance sensitive, so apply LTO to it.
666
- let lto = match builder. config . rust_lto {
667
- RustcLto :: Off => Some ( "off" ) ,
668
- RustcLto :: Thin => Some ( "thin" ) ,
669
- RustcLto :: Fat => Some ( "fat" ) ,
670
- RustcLto :: ThinLocal => None ,
671
- } ;
672
- if let Some ( lto) = lto {
673
- cargo. env ( cargo_profile_var ( "LTO" , & builder. config ) , lto) ;
674
- }
675
-
676
- let _guard = builder. msg_tool (
677
- Kind :: Build ,
678
- Mode :: ToolRustc ,
679
- "rustdoc" ,
680
- build_compiler. stage ,
681
- & self . compiler . host ,
682
- & target,
683
- ) ;
684
- cargo. into_cmd ( ) . run ( builder) ;
685
-
686
637
// Cargo adds a number of paths to the dylib search path on windows, which results in
687
638
// the wrong rustdoc being executed. To avoid the conflicting rustdocs, we name the "tool"
688
639
// rustdoc a different name.
689
- let tool_rustdoc = builder
690
- . cargo_out ( build_compiler, Mode :: ToolRustc , target)
691
- . join ( exe ( "rustdoc_tool_binary" , target_compiler. host ) ) ;
640
+ tool : "rustdoc_tool_binary" ,
641
+ mode : Mode :: ToolRustc ,
642
+ path : "src/tools/rustdoc" ,
643
+ source_type : SourceType :: InTree ,
644
+ extra_features,
645
+ allow_features : "" ,
646
+ cargo_args : Vec :: new ( ) ,
647
+ } ) ;
692
648
693
649
// don't create a stage0-sysroot/bin directory.
694
- if target_compiler . stage > 0 {
650
+ if compiler . stage > 0 {
695
651
if builder. config . rust_debuginfo_level_tools == DebuginfoLevel :: None {
696
652
// Due to LTO a lot of debug info from C++ dependencies such as jemalloc can make it into
697
653
// our final binaries
@@ -916,50 +872,29 @@ impl Step for LlvmBitcodeLinker {
916
872
}
917
873
918
874
fn run ( self , builder : & Builder < ' _ > ) -> PathBuf {
919
- let bin_name = "llvm-bitcode-linker" ;
920
-
921
- // If enabled, use ci-rustc and skip building the in-tree compiler.
922
- if !builder. download_rustc ( ) {
923
- builder. ensure ( compile:: Std :: new ( self . compiler , self . compiler . host ) ) ;
924
- builder. ensure ( compile:: Rustc :: new ( self . compiler , self . target ) ) ;
925
- }
926
-
927
- let cargo = prepare_tool_cargo (
928
- builder,
929
- self . compiler ,
930
- Mode :: ToolRustc ,
931
- self . target ,
932
- Kind :: Build ,
933
- "src/tools/llvm-bitcode-linker" ,
934
- SourceType :: InTree ,
935
- & self . extra_features ,
936
- ) ;
937
-
938
- let _guard = builder. msg_tool (
939
- Kind :: Build ,
940
- Mode :: ToolRustc ,
941
- bin_name,
942
- self . compiler . stage ,
943
- & self . compiler . host ,
944
- & self . target ,
945
- ) ;
946
-
947
- cargo. into_cmd ( ) . run ( builder) ;
948
-
949
- let tool_out = builder
950
- . cargo_out ( self . compiler , Mode :: ToolRustc , self . target )
951
- . join ( exe ( bin_name, self . compiler . host ) ) ;
875
+ let bin_source = builder. ensure ( ToolBuild {
876
+ compiler : self . compiler ,
877
+ target : self . target ,
878
+ tool : "llvm-bitcode-linker" ,
879
+ mode : Mode :: ToolRustc ,
880
+ path : "src/tools/llvm-bitcode-linker" ,
881
+ source_type : SourceType :: InTree ,
882
+ extra_features : self . extra_features ,
883
+ allow_features : "" ,
884
+ cargo_args : Vec :: new ( ) ,
885
+ } ) ;
952
886
953
887
if self . compiler . stage > 0 {
954
888
let bindir_self_contained = builder
955
889
. sysroot ( self . compiler )
956
890
. join ( format ! ( "lib/rustlib/{}/bin/self-contained" , self . target. triple) ) ;
957
891
t ! ( fs:: create_dir_all( & bindir_self_contained) ) ;
958
- let bin_destination = bindir_self_contained. join ( exe ( bin_name, self . compiler . host ) ) ;
959
- builder. copy_link ( & tool_out, & bin_destination) ;
892
+ let bin_destination =
893
+ bindir_self_contained. join ( exe ( "llvm-bitcode-linker" , self . compiler . host ) ) ;
894
+ builder. copy_link ( & bin_source, & bin_destination) ;
960
895
bin_destination
961
896
} else {
962
- tool_out
897
+ bin_source
963
898
}
964
899
}
965
900
}
0 commit comments