@@ -155,17 +155,19 @@ static TARGETS: &[&str] = &[
155
155
"x86_64-unknown-hermit" ,
156
156
] ;
157
157
158
- static DOCS_TARGETS : & [ & str ] = & [
159
- "aarch64-unknown-linux-gnu" ,
160
- "i686-apple-darwin" ,
161
- "i686-pc-windows-gnu" ,
162
- "i686-pc-windows-msvc" ,
163
- "i686-unknown-linux-gnu" ,
164
- "x86_64-apple-darwin" ,
165
- "x86_64-pc-windows-gnu" ,
166
- "x86_64-pc-windows-msvc" ,
167
- "x86_64-unknown-linux-gnu" ,
168
- "x86_64-unknown-linux-musl" ,
158
+ /// This allows the manifest to contain rust-docs for hosts that don't build
159
+ /// docs.
160
+ ///
161
+ /// Tuples of `(host_partial, host_instead)`. If the host does not have the
162
+ /// rust-docs component available, then if the host name contains
163
+ /// `host_partial`, it will use the docs from `host_instead` instead.
164
+ ///
165
+ /// The order here matters, more specific entries should be first.
166
+ static DOCS_FALLBACK : & [ ( & str , & str ) ] = & [
167
+ ( "-apple-" , "x86_64-apple-darwin" ) ,
168
+ ( "aarch64" , "aarch64-unknown-linux-gnu" ) ,
169
+ ( "arm-" , "aarch64-unknown-linux-gnu" ) ,
170
+ ( "" , "x86_64-unknown-linux-gnu" ) ,
169
171
] ;
170
172
171
173
static MSI_INSTALLERS : & [ & str ] = & [
@@ -301,23 +303,27 @@ impl Builder {
301
303
}
302
304
303
305
fn add_packages_to ( & mut self , manifest : & mut Manifest ) {
304
- let mut package = |name, targets| self . package ( name, & mut manifest. pkg , targets) ;
305
- package ( "rustc" , HOSTS ) ;
306
- package ( "rustc-dev" , HOSTS ) ;
307
- package ( "reproducible-artifacts" , HOSTS ) ;
308
- package ( "rustc-docs" , HOSTS ) ;
309
- package ( "cargo" , HOSTS ) ;
310
- package ( "rust-mingw" , MINGW ) ;
311
- package ( "rust-std" , TARGETS ) ;
312
- package ( "rust-docs" , DOCS_TARGETS ) ;
313
- package ( "rust-src" , & [ "*" ] ) ;
314
- package ( "rls-preview" , HOSTS ) ;
315
- package ( "rust-analyzer-preview" , HOSTS ) ;
316
- package ( "clippy-preview" , HOSTS ) ;
317
- package ( "miri-preview" , HOSTS ) ;
318
- package ( "rustfmt-preview" , HOSTS ) ;
319
- package ( "rust-analysis" , TARGETS ) ;
320
- package ( "llvm-tools-preview" , TARGETS ) ;
306
+ macro_rules! package {
307
+ ( $name: expr, $targets: expr) => {
308
+ self . package( $name, & mut manifest. pkg, $targets, & [ ] )
309
+ } ;
310
+ }
311
+ package ! ( "rustc" , HOSTS ) ;
312
+ package ! ( "rustc-dev" , HOSTS ) ;
313
+ package ! ( "reproducible-artifacts" , HOSTS ) ;
314
+ package ! ( "rustc-docs" , HOSTS ) ;
315
+ package ! ( "cargo" , HOSTS ) ;
316
+ package ! ( "rust-mingw" , MINGW ) ;
317
+ package ! ( "rust-std" , TARGETS ) ;
318
+ self . package ( "rust-docs" , & mut manifest. pkg , HOSTS , DOCS_FALLBACK ) ;
319
+ package ! ( "rust-src" , & [ "*" ] ) ;
320
+ package ! ( "rls-preview" , HOSTS ) ;
321
+ package ! ( "rust-analyzer-preview" , HOSTS ) ;
322
+ package ! ( "clippy-preview" , HOSTS ) ;
323
+ package ! ( "miri-preview" , HOSTS ) ;
324
+ package ! ( "rustfmt-preview" , HOSTS ) ;
325
+ package ! ( "rust-analysis" , TARGETS ) ;
326
+ package ! ( "llvm-tools-preview" , TARGETS ) ;
321
327
}
322
328
323
329
fn add_artifacts_to ( & mut self , manifest : & mut Manifest ) {
@@ -500,7 +506,13 @@ impl Builder {
500
506
. extend ( pkgs. iter ( ) . map ( |s| ( * s) . to_owned ( ) ) ) ;
501
507
}
502
508
503
- fn package ( & mut self , pkgname : & str , dst : & mut BTreeMap < String , Package > , targets : & [ & str ] ) {
509
+ fn package (
510
+ & mut self ,
511
+ pkgname : & str ,
512
+ dst : & mut BTreeMap < String , Package > ,
513
+ targets : & [ & str ] ,
514
+ fallback : & [ ( & str , & str ) ] ,
515
+ ) {
504
516
let version_info = self
505
517
. versions
506
518
. version ( & PkgType :: from_component ( pkgname) )
@@ -512,16 +524,32 @@ impl Builder {
512
524
is_present = false ; // Pretend the component is entirely missing.
513
525
}
514
526
527
+ macro_rules! tarball_name {
528
+ ( $target_name: expr) => {
529
+ self . versions. tarball_name( & PkgType :: from_component( pkgname) , $target_name) . unwrap( )
530
+ } ;
531
+ }
532
+ let mut target_from_compressed_tar = |target_name| {
533
+ let target = Target :: from_compressed_tar ( self , & tarball_name ! ( target_name) ) ;
534
+ if target. available {
535
+ return target;
536
+ }
537
+ for ( substr, fallback_target) in fallback {
538
+ if target_name. contains ( substr) {
539
+ let t = Target :: from_compressed_tar ( self , & tarball_name ! ( fallback_target) ) ;
540
+ // Fallbacks must always be available.
541
+ assert ! ( t. available) ;
542
+ return t;
543
+ }
544
+ }
545
+ Target :: unavailable ( )
546
+ } ;
547
+
515
548
let targets = targets
516
549
. iter ( )
517
550
. map ( |name| {
518
551
let target = if is_present {
519
- let filename = self
520
- . versions
521
- . tarball_name ( & PkgType :: from_component ( pkgname) , name)
522
- . unwrap ( ) ;
523
-
524
- Target :: from_compressed_tar ( self , & filename)
552
+ target_from_compressed_tar ( name)
525
553
} else {
526
554
// If the component is not present for this build add it anyway but mark it as
527
555
// unavailable -- this way rustup won't allow upgrades without --force
0 commit comments