@@ -1040,6 +1040,30 @@ impl Step for Src {
1040
1040
builder. copy ( & builder. src . join ( file) , & dst_src. join ( file) ) ;
1041
1041
}
1042
1042
1043
+ // libtest includes std and everything else, so vendoring it
1044
+ // creates exactly what's needed for `cargo -Zbuild-std` or any
1045
+ // other analysis of the stdlib's source. Cargo also needs help
1046
+ // finding the lock, so we copy it to libtest temporarily.
1047
+ //
1048
+ // Note that this requires std to only have one version of each
1049
+ // crate. e.g. two versions of getopts won't be patchable.
1050
+ let dst_libtest = dst_src. join ( "library/test" ) ;
1051
+ let dst_vendor = dst_src. join ( "vendor" ) ;
1052
+ let root_lock = dst_src. join ( "Cargo.lock" ) ;
1053
+ let temp_lock = dst_libtest. join ( "Cargo.lock" ) ;
1054
+
1055
+ // `cargo vendor` will delete everything from the lockfile that
1056
+ // isn't used by libtest, so we need to not use any links!
1057
+ builder. really_copy ( & root_lock, & temp_lock) ;
1058
+
1059
+ let mut cmd = Command :: new ( & builder. initial_cargo ) ;
1060
+ cmd. arg ( "vendor" ) . arg ( dst_vendor) . current_dir ( & dst_libtest) ;
1061
+ builder. info ( "Dist src" ) ;
1062
+ let _time = timeit ( builder) ;
1063
+ builder. run ( & mut cmd) ;
1064
+
1065
+ builder. remove ( & temp_lock) ;
1066
+
1043
1067
// Create source tarball in rust-installer format
1044
1068
let mut cmd = rust_installer ( builder) ;
1045
1069
cmd. arg ( "generate" )
@@ -1056,8 +1080,6 @@ impl Step for Src {
1056
1080
. arg ( "--component-name=rust-src" )
1057
1081
. arg ( "--legacy-manifest-dirs=rustlib,cargo" ) ;
1058
1082
1059
- builder. info ( "Dist src" ) ;
1060
- let _time = timeit ( builder) ;
1061
1083
builder. run ( & mut cmd) ;
1062
1084
1063
1085
builder. remove_dir ( & image) ;
0 commit comments