From d1043c96c1f59e6931599ca81d36b5624375777f Mon Sep 17 00:00:00 2001 From: Joshua Nelson Date: Tue, 26 Nov 2019 19:23:20 -0500 Subject: [PATCH 1/4] Work around rustdoc bugs for proc-macros Use documentation in /target/doc if /target/$target/doc doesn't exist. Partially addresses https://github.com/rust-lang/docs.rs/issues/422. Note: this does _not_ fix the issue mentioned above, it doesn't link to the right CSS files. See https://cdn.discordapp.com/attachments/541978667522195476/649031211913838592/unknown.png for an example. --- src/docbuilder/rustwide_builder.rs | 87 +++++++++++++++++------------- 1 file changed, 50 insertions(+), 37 deletions(-) diff --git a/src/docbuilder/rustwide_builder.rs b/src/docbuilder/rustwide_builder.rs index b4094f123..1853880a6 100644 --- a/src/docbuilder/rustwide_builder.rs +++ b/src/docbuilder/rustwide_builder.rs @@ -267,7 +267,7 @@ impl RustwideBuilder { .build(&self.toolchain, &krate, sandbox) .run(|build| { let mut files_list = None; - let mut has_docs = false; + let (mut has_docs, mut in_target) = (false, false); let mut successful_targets = Vec::new(); // Do an initial build and then copy the sources in the database @@ -281,19 +281,24 @@ impl RustwideBuilder { build.host_source_dir(), )?); - has_docs = res - .cargo_metadata - .root() - .library_name() - .map(|name| { - build - .host_target_dir() - .join(&res.target) - .join("doc") - .join(name) - .is_dir() - }) - .unwrap_or(false); + if let Some(name) = res + .cargo_metadata + .root() + .library_name() { + let host_target = build.host_target_dir(); + if host_target.join(&res.target) + .join("doc") + .join(&name) + .is_dir() { + has_docs = true; + in_target = true; + // hack for proc-macro documentation: + // it really should be in target/$target/doc, + // but rustdoc has a bug and puts it in target/doc + } else if host_target.join("doc").join(name).is_dir() { + has_docs = true; + } + } } if has_docs { @@ -301,34 +306,18 @@ impl RustwideBuilder { self.copy_docs( &build.host_target_dir(), local_storage.path(), - &res.target, + if in_target { &res.target } else { "" }, true, )?; + successful_targets.push(DEFAULT_TARGET.to_string()); - // Then build the documentation for all the targets - for target in TARGETS { - debug!("building package {} {} for {}", name, version, target); - let target_res = self.execute_build(Some(target), &build, &limits)?; - if target_res.successful { - // Cargo is not giving any error and not generating documentation of some crates - // when we use a target compile options. Check documentation exists before - // adding target to successfully_targets. - if build.host_target_dir().join(target).join("doc").is_dir() { - debug!( - "adding documentation for target {} to the database", - target - ); - self.copy_docs( - &build.host_target_dir(), - local_storage.path(), - target, - false, - )?; - successful_targets.push(target.to_string()); - } + if in_target { + // Then build the documentation for all the targets + for target in TARGETS { + debug!("building package {} {} for {}", name, version, target); + self.build_target(target, &build, &limits, &local_storage.path(), &mut successful_targets)?; } } - self.upload_docs(&conn, name, version, local_storage.path())?; } @@ -362,6 +351,30 @@ impl RustwideBuilder { Ok(res.successful) } + fn build_target(&self, target: &str, build: &Build, limits: &Limits, + local_storage: &Path, successful_targets: &mut Vec) -> Result<()> { + let target_res = self.execute_build(Some(target), build, limits)?; + if target_res.successful { + // Cargo is not giving any error and not generating documentation of some crates + // when we use a target compile options. Check documentation exists before + // adding target to successfully_targets. + if build.host_target_dir().join(target).join("doc").is_dir() { + debug!( + "adding documentation for target {} to the database", + target, + ); + self.copy_docs( + &build.host_target_dir(), + local_storage, + target, + false, + )?; + successful_targets.push(target.to_string()); + } + } + Ok(()) + } + fn execute_build( &self, target: Option<&str>, From 73eca29259d0bebd40b5c0aa0df708aac87ac79d Mon Sep 17 00:00:00 2001 From: Joshua Nelson Date: Tue, 26 Nov 2019 20:16:31 -0500 Subject: [PATCH 2/4] Don't pass --target flag for proc-macros --- src/docbuilder/rustwide_builder.rs | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/src/docbuilder/rustwide_builder.rs b/src/docbuilder/rustwide_builder.rs index 1853880a6..4ae0d7c31 100644 --- a/src/docbuilder/rustwide_builder.rs +++ b/src/docbuilder/rustwide_builder.rs @@ -309,7 +309,6 @@ impl RustwideBuilder { if in_target { &res.target } else { "" }, true, )?; - successful_targets.push(DEFAULT_TARGET.to_string()); if in_target { // Then build the documentation for all the targets @@ -385,14 +384,7 @@ impl RustwideBuilder { let cargo_metadata = CargoMetadata::load(&self.workspace, &self.toolchain, &build.host_source_dir())?; - let target = if let Some(target) = target { - target - } else if let Some(target) = metadata.default_target.as_ref().map(|s| s.as_str()) { - target - } else { - DEFAULT_TARGET - } - .to_string(); + let target = target.or_else(|| metadata.default_target.as_ref().map(|s| s.as_str())); let mut rustdoc_flags: Vec = vec![ "-Z".to_string(), @@ -419,9 +411,11 @@ impl RustwideBuilder { "doc".to_owned(), "--lib".to_owned(), "--no-deps".to_owned(), - "--target".to_owned(), - target.to_owned(), ]; + if let Some(explicit_target) = target { + cargo_args.push("--target".to_owned()); + cargo_args.push(explicit_target.to_owned()); + }; if let Some(features) = &metadata.features { cargo_args.push("--features".to_owned()); cargo_args.push(features.join(" ")); @@ -445,8 +439,9 @@ impl RustwideBuilder { "RUSTFLAGS", metadata .rustc_args + .as_ref() .map(|args| args.join(" ")) - .unwrap_or("".to_owned()), + .unwrap_or_default() ) .env("RUSTDOCFLAGS", rustdoc_flags.join(" ")) .args(&cargo_args) @@ -460,7 +455,7 @@ impl RustwideBuilder { docsrs_version: format!("docsrs {}", ::BUILD_VERSION), successful, cargo_metadata, - target: target.to_string(), + target: target.unwrap_or_default().to_string(), }) } From a9ce13ba8e8adbe2e5fa81d0694f3ff430d60d61 Mon Sep 17 00:00:00 2001 From: Joshua Nelson Date: Tue, 26 Nov 2019 20:24:07 -0500 Subject: [PATCH 3/4] remove unused DEFAULT_TARGET static --- src/docbuilder/rustwide_builder.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/docbuilder/rustwide_builder.rs b/src/docbuilder/rustwide_builder.rs index 4ae0d7c31..03d68f5fa 100644 --- a/src/docbuilder/rustwide_builder.rs +++ b/src/docbuilder/rustwide_builder.rs @@ -26,7 +26,6 @@ static TARGETS: &[&str] = &[ "x86_64-pc-windows-msvc", "x86_64-unknown-linux-gnu", ]; -static DEFAULT_TARGET: &str = "x86_64-unknown-linux-gnu"; static ESSENTIAL_FILES_VERSIONED: &[&str] = &[ "brush.svg", From b2a2c795d4379a4214b58edcb3b5caae1c5f7406 Mon Sep 17 00:00:00 2001 From: Joshua Nelson Date: Tue, 26 Nov 2019 20:33:02 -0500 Subject: [PATCH 4/4] fix formatting --- src/docbuilder/rustwide_builder.rs | 49 +++++++++++++++--------------- 1 file changed, 24 insertions(+), 25 deletions(-) diff --git a/src/docbuilder/rustwide_builder.rs b/src/docbuilder/rustwide_builder.rs index 03d68f5fa..bd586b107 100644 --- a/src/docbuilder/rustwide_builder.rs +++ b/src/docbuilder/rustwide_builder.rs @@ -280,15 +280,14 @@ impl RustwideBuilder { build.host_source_dir(), )?); - if let Some(name) = res - .cargo_metadata - .root() - .library_name() { + if let Some(name) = res.cargo_metadata.root().library_name() { let host_target = build.host_target_dir(); - if host_target.join(&res.target) + if host_target + .join(&res.target) .join("doc") .join(&name) - .is_dir() { + .is_dir() + { has_docs = true; in_target = true; // hack for proc-macro documentation: @@ -313,7 +312,13 @@ impl RustwideBuilder { // Then build the documentation for all the targets for target in TARGETS { debug!("building package {} {} for {}", name, version, target); - self.build_target(target, &build, &limits, &local_storage.path(), &mut successful_targets)?; + self.build_target( + target, + &build, + &limits, + &local_storage.path(), + &mut successful_targets, + )?; } } self.upload_docs(&conn, name, version, local_storage.path())?; @@ -349,24 +354,22 @@ impl RustwideBuilder { Ok(res.successful) } - fn build_target(&self, target: &str, build: &Build, limits: &Limits, - local_storage: &Path, successful_targets: &mut Vec) -> Result<()> { + fn build_target( + &self, + target: &str, + build: &Build, + limits: &Limits, + local_storage: &Path, + successful_targets: &mut Vec, + ) -> Result<()> { let target_res = self.execute_build(Some(target), build, limits)?; if target_res.successful { // Cargo is not giving any error and not generating documentation of some crates // when we use a target compile options. Check documentation exists before // adding target to successfully_targets. if build.host_target_dir().join(target).join("doc").is_dir() { - debug!( - "adding documentation for target {} to the database", - target, - ); - self.copy_docs( - &build.host_target_dir(), - local_storage, - target, - false, - )?; + debug!("adding documentation for target {} to the database", target,); + self.copy_docs(&build.host_target_dir(), local_storage, target, false)?; successful_targets.push(target.to_string()); } } @@ -406,11 +409,7 @@ impl RustwideBuilder { if let Some(package_rustdoc_args) = &metadata.rustdoc_args { rustdoc_flags.append(&mut package_rustdoc_args.iter().map(|s| s.to_owned()).collect()); } - let mut cargo_args = vec![ - "doc".to_owned(), - "--lib".to_owned(), - "--no-deps".to_owned(), - ]; + let mut cargo_args = vec!["doc".to_owned(), "--lib".to_owned(), "--no-deps".to_owned()]; if let Some(explicit_target) = target { cargo_args.push("--target".to_owned()); cargo_args.push(explicit_target.to_owned()); @@ -440,7 +439,7 @@ impl RustwideBuilder { .rustc_args .as_ref() .map(|args| args.join(" ")) - .unwrap_or_default() + .unwrap_or_default(), ) .env("RUSTDOCFLAGS", rustdoc_flags.join(" ")) .args(&cargo_args)