From aa5fd955eaf7d9f4df7776081e629b00ed4e8abb Mon Sep 17 00:00:00 2001 From: QuietMisdreavus Date: Fri, 3 May 2019 10:14:21 -0500 Subject: [PATCH 1/3] don't automatically build for all targets --- src/docbuilder/chroot_builder.rs | 22 +++++++++++++++++----- src/docbuilder/metadata.rs | 15 +++++++++++++++ templates/about.hbs | 1 + 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/src/docbuilder/chroot_builder.rs b/src/docbuilder/chroot_builder.rs index 02295e57a..2a210460f 100644 --- a/src/docbuilder/chroot_builder.rs +++ b/src/docbuilder/chroot_builder.rs @@ -86,11 +86,18 @@ impl DocBuilder { // copy sources and documentation let file_list = try!(self.add_sources_into_database(&conn, &pkg)); let successfully_targets = if res.have_doc { + let default_target = metadata.default_target.as_ref().map(String::as_str); + let mut build_targets = metadata.extra_targets.clone().unwrap_or_default(); + if let Some(default_target) = default_target { + if !build_targets.iter().any(|t| t == default_target) { + build_targets.push(default_target.to_owned()); + } + } try!(self.copy_documentation(&pkg, &res.rustc_version, - metadata.default_target.as_ref().map(String::as_str), + default_target, true)); - let successfully_targets = self.build_package_for_all_targets(&pkg); + let successfully_targets = self.build_package_for_all_targets(&pkg, &build_targets); for target in &successfully_targets { try!(self.copy_documentation(&pkg, &res.rustc_version, Some(target), false)); } @@ -151,11 +158,16 @@ impl DocBuilder { - /// Builds documentation of crate for every target and returns Vec of successfully targets - fn build_package_for_all_targets(&self, package: &Package) -> Vec { + /// Builds documentation of the given crate for the given targets and returns a Vec of the ones + /// that were successful. + fn build_package_for_all_targets(&self, package: &Package, targets: &[String]) -> Vec { let mut successfuly_targets = Vec::new(); - for target in TARGETS.iter() { + for target in targets.iter() { + if !TARGETS.contains(&&**target) { + // we only support building for win/mac/linux 32-/64-bit + continue; + } debug!("Building {} for {}", canonical_name(&package), target); let cmd = format!("cratesfyi doc {} ={} {}", package.manifest().name(), diff --git a/src/docbuilder/metadata.rs b/src/docbuilder/metadata.rs index e99e10cb4..1f7d51c3b 100644 --- a/src/docbuilder/metadata.rs +++ b/src/docbuilder/metadata.rs @@ -21,6 +21,7 @@ use failure::err_msg; /// all-features = true /// no-default-features = true /// default-target = "x86_64-unknown-linux-gnu" +/// extra-targets = [ "x86_64-apple-darwin", "x86_64-pc-windows-msvc" ] /// rustc-args = [ "--example-rustc-arg" ] /// rustdoc-args = [ "--example-rustdoc-arg" ] /// dependencies = [ "example-system-dependency" ] @@ -45,6 +46,11 @@ pub struct Metadata { /// is always built on this target. You can change default target by setting this. pub default_target: Option, + /// Docs.rs doesn't automatically build extra targets for crates. If you want a crate to build + /// for multiple targets, set `extra-targets` to the list of targets to build, in addition to + /// `default-target`. + pub extra_targets: Option>, + /// List of command line arguments for `rustc`. pub rustc_args: Option>, @@ -93,6 +99,7 @@ impl Metadata { all_features: false, no_default_features: false, default_target: None, + extra_targets: None, rustc_args: None, rustdoc_args: None, dependencies: None, @@ -120,6 +127,8 @@ impl Metadata { .and_then(|v| v.as_bool()).unwrap_or(metadata.all_features); metadata.default_target = table.get("default-target") .and_then(|v| v.as_str()).map(|v| v.to_owned()); + metadata.extra_targets = table.get("extra-targets").and_then(|f| f.as_array()) + .and_then(|f| f.iter().map(|v| v.as_str().map(|v| v.to_owned())).collect()); metadata.rustc_args = table.get("rustc-args").and_then(|f| f.as_array()) .and_then(|f| f.iter().map(|v| v.as_str().map(|v| v.to_owned())).collect()); metadata.rustdoc_args = table.get("rustdoc-args").and_then(|f| f.as_array()) @@ -151,6 +160,7 @@ mod test { all-features = true no-default-features = true default-target = "x86_64-unknown-linux-gnu" + extra-targets = [ "x86_64-apple-darwin", "x86_64-pc-windows-msvc" ] rustc-args = [ "--example-rustc-arg" ] rustdoc-args = [ "--example-rustdoc-arg" ] dependencies = [ "example-system-dependency" ] @@ -171,6 +181,11 @@ mod test { assert_eq!(metadata.default_target.unwrap(), "x86_64-unknown-linux-gnu".to_owned()); + let extra_targets = metadata.extra_targets.unwrap(); + assert_eq!(extra_targets.len(), 2); + assert_eq!(extra_targets[0], "x86_64-apple-darwin".to_owned()); + assert_eq!(extra_targets[1], "x86_64-pc-windows-msvc".to_owned()); + let rustc_args = metadata.rustc_args.unwrap(); assert_eq!(rustc_args.len(), 1); assert_eq!(rustc_args[0], "--example-rustc-arg".to_owned()); diff --git a/templates/about.hbs b/templates/about.hbs index f602ff403..ea05a7e38 100644 --- a/templates/about.hbs +++ b/templates/about.hbs @@ -115,6 +115,7 @@ features = [ "feature1", "feature2" ] all-features = true no-default-features = true default-target = "x86_64-unknown-linux-gnu" +extra-targets = [ "x86_64-apple-darwin", "x86_64-pc-windows-msvc" ] rustc-args = [ "--example-rustc-arg" ] rustdoc-args = [ "--example-rustdoc-arg" ] From 64450fe6806a3fc41aa5835d5088452e7a8df0c5 Mon Sep 17 00:00:00 2001 From: QuietMisdreavus Date: Fri, 3 May 2019 10:24:34 -0500 Subject: [PATCH 2/3] update documentation on package metadata --- templates/about.hbs | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/templates/about.hbs b/templates/about.hbs index ea05a7e38..0eff25647 100644 --- a/templates/about.hbs +++ b/templates/about.hbs @@ -101,22 +101,44 @@ -

Metadata for custom builds

+

Metadata for custom builds

You can customize docs.rs builds by defining [package.metadata.docs.rs] table in your crates' `Cargo.toml`.

-

An example metadata:

+

The available configuration flags you can customize are:

[package]
 name = "test"
 
 [package.metadata.docs.rs]
+
+# Features to pass to Cargo (default: none)
 features = [ "feature1", "feature2" ]
+
+# Whether to pass `--all-features` to Cargo (default: false)
 all-features = true
+
+# Whether to pass `--no-default-features` to Cargo (default: false)
 no-default-features = true
+
+# Target to test build on, used as the default landing page (default: "x86_64-unknown-linux-gnu")
+#
+# Available targets:
+# - x86_64-unknown-linux-gnu
+# - x86_64-apple-darwin
+# - x86_64-pc-windows-msvc
+# - i686-unknown-linux-gnu
+# - i686-apple-darwin
+# - i686-pc-windows-msvc
 default-target = "x86_64-unknown-linux-gnu"
+
+# Extra targets to build, same available targets as `default-target` (default: none)
 extra-targets = [ "x86_64-apple-darwin", "x86_64-pc-windows-msvc" ]
+
+# Additional `RUSTFLAGS` to set (default: none)
 rustc-args = [ "--example-rustc-arg" ]
+
+# Additional `RUSTDOCFLAGS` to set (default: none)
 rustdoc-args = [ "--example-rustdoc-arg" ]

Version

From 9c59ab1dfbc1e594c8069be0537b45e0ab164b3a Mon Sep 17 00:00:00 2001 From: QuietMisdreavus Date: Fri, 3 May 2019 10:38:10 -0500 Subject: [PATCH 3/3] provide a fallback target to include in `extra-targets` --- src/docbuilder/chroot_builder.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/docbuilder/chroot_builder.rs b/src/docbuilder/chroot_builder.rs index 2a210460f..0c4119732 100644 --- a/src/docbuilder/chroot_builder.rs +++ b/src/docbuilder/chroot_builder.rs @@ -25,7 +25,7 @@ const TARGETS: [&'static str; 6] = [ "x86_64-unknown-linux-gnu" ]; - +const DEFAULT_TARGET: &'static str = "x86_64-unknown-linux-gnu"; #[derive(Debug)] pub struct ChrootBuilderResult { @@ -88,7 +88,10 @@ impl DocBuilder { let successfully_targets = if res.have_doc { let default_target = metadata.default_target.as_ref().map(String::as_str); let mut build_targets = metadata.extra_targets.clone().unwrap_or_default(); - if let Some(default_target) = default_target { + { + // FIXME: skip the second build for `default_target` by copying its documentation + // in twice + let default_target = default_target.unwrap_or(DEFAULT_TARGET); if !build_targets.iter().any(|t| t == default_target) { build_targets.push(default_target.to_owned()); }