Skip to content

Commit 4cc7801

Browse files
committed
Add "--cfg docsrs" to all rustdoc invocations
1 parent d5a652f commit 4cc7801

File tree

2 files changed

+40
-15
lines changed

2 files changed

+40
-15
lines changed

crates/metadata/lib.rs

+31-13
Original file line numberDiff line numberDiff line change
@@ -267,10 +267,15 @@ impl Metadata {
267267
cargo_args.push("--no-default-features".into());
268268
}
269269

270-
let mut all_rustdoc_args = self.rustdoc_args.clone();
270+
// Unconditionnaly set `--cfg docsrs` as it has become a de-facto way to
271+
// distinguish docs.rs.
272+
//
273+
// See https://github.com/rust-lang/docs.rs/issues/2389.
274+
let mut all_rustdoc_args = vec!["--cfg".into(), "docsrs".into()];
275+
all_rustdoc_args.extend_from_slice(&self.rustdoc_args);
271276
all_rustdoc_args.extend_from_slice(rustdoc_args);
272277

273-
if !self.rustc_args.is_empty() || !all_rustdoc_args.is_empty() {
278+
if !self.rustc_args.is_empty() || all_rustdoc_args.len() > 2 {
274279
cargo_args.push("-Z".into());
275280
cargo_args.push("unstable-options".into());
276281
}
@@ -655,14 +660,20 @@ mod test_targets {
655660
mod test_calculations {
656661
use super::*;
657662

658-
fn default_cargo_args() -> Vec<String> {
659-
vec!["rustdoc".into(), "--lib".into(), "-Zrustdoc-map".into()]
663+
fn default_cargo_args(extra_args: &[String]) -> Vec<String> {
664+
let mut args = vec!["rustdoc".into(), "--lib".into(), "-Zrustdoc-map".into()];
665+
args.extend_from_slice(extra_args);
666+
args.extend_from_slice(&[
667+
"--config".into(),
668+
r#"build.rustdocflags=["--cfg", "docsrs"]"#.into(),
669+
]);
670+
args
660671
}
661672

662673
#[test]
663674
fn test_defaults() {
664675
let metadata = Metadata::default();
665-
assert_eq!(metadata.cargo_args(&[], &[]), default_cargo_args());
676+
assert_eq!(metadata.cargo_args(&[], &[]), default_cargo_args(&[]));
666677
let env = metadata.environment_variables();
667678
assert_eq!(env.get("DOCS_RS").map(String::as_str), Some("1"));
668679
assert!(env.get("RUSTDOCFLAGS").is_none());
@@ -676,17 +687,15 @@ mod test_calculations {
676687
all_features: true,
677688
..Metadata::default()
678689
};
679-
let mut expected_args = default_cargo_args();
680-
expected_args.push("--all-features".into());
690+
let expected_args = default_cargo_args(&["--all-features".into()]);
681691
assert_eq!(metadata.cargo_args(&[], &[]), expected_args);
682692

683693
// no default features
684694
let metadata = Metadata {
685695
no_default_features: true,
686696
..Metadata::default()
687697
};
688-
let mut expected_args = default_cargo_args();
689-
expected_args.push("--no-default-features".into());
698+
let expected_args = default_cargo_args(&["--no-default-features".into()]);
690699
assert_eq!(metadata.cargo_args(&[], &[]), expected_args);
691700

692701
// allow passing both even though it's nonsense; cargo will give an error anyway
@@ -695,9 +704,8 @@ mod test_calculations {
695704
no_default_features: true,
696705
..Metadata::default()
697706
};
698-
let mut expected_args = default_cargo_args();
699-
expected_args.push("--all-features".into());
700-
expected_args.push("--no-default-features".into());
707+
let expected_args =
708+
default_cargo_args(&["--all-features".into(), "--no-default-features".into()]);
701709
assert_eq!(metadata.cargo_args(&[], &[]), expected_args);
702710

703711
// explicit empty vec
@@ -711,6 +719,8 @@ mod test_calculations {
711719
"-Zrustdoc-map".into(),
712720
"--features".into(),
713721
String::new(),
722+
"--config".into(),
723+
r#"build.rustdocflags=["--cfg", "docsrs"]"#.into(),
714724
];
715725
assert_eq!(metadata.cargo_args(&[], &[]), expected_args);
716726

@@ -725,6 +735,8 @@ mod test_calculations {
725735
"-Zrustdoc-map".into(),
726736
"--features".into(),
727737
"some_feature".into(),
738+
"--config".into(),
739+
r#"build.rustdocflags=["--cfg", "docsrs"]"#.into(),
728740
];
729741
assert_eq!(metadata.cargo_args(&[], &[]), expected_args);
730742

@@ -739,6 +751,8 @@ mod test_calculations {
739751
"-Zrustdoc-map".into(),
740752
"--features".into(),
741753
"feature1 feature2".into(),
754+
"--config".into(),
755+
r#"build.rustdocflags=["--cfg", "docsrs"]"#.into(),
742756
];
743757
assert_eq!(metadata.cargo_args(&[], &[]), expected_args);
744758

@@ -761,7 +775,7 @@ mod test_calculations {
761775
"-Z".into(),
762776
"unstable-options".into(),
763777
"--config".into(),
764-
r#"build.rustdocflags=["-Z", "unstable-options", "--static-root-path", "/", "--cap-lints", "warn"]"#.into(),
778+
r#"build.rustdocflags=["--cfg", "docsrs", "-Z", "unstable-options", "--static-root-path", "/", "--cap-lints", "warn"]"#.into(),
765779
];
766780
assert_eq!(metadata.cargo_args(&[], &[]), expected_args);
767781

@@ -782,6 +796,8 @@ mod test_calculations {
782796
"-Ztarget-applies-to-host".into(),
783797
"--config".into(),
784798
"host.rustflags=[\"--cfg\", \"x\"]".into(),
799+
"--config".into(),
800+
"build.rustdocflags=[\"--cfg\", \"docsrs\"]".into(),
785801
];
786802
assert_eq!(metadata.cargo_args(&[], &[]), expected_args);
787803

@@ -794,6 +810,8 @@ mod test_calculations {
794810
String::from("rustdoc"),
795811
"--lib".into(),
796812
"-Zrustdoc-map".into(),
813+
"--config".into(),
814+
"build.rustdocflags=[\"--cfg\", \"docsrs\"]".into(),
797815
"-Zbuild-std".into(),
798816
];
799817
assert_eq!(metadata.cargo_args(&[], &[]), expected_args);

templates/core/about/builds.html

+9-2
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,13 @@ <h4 id="setting-a-readme"> <a href="#setting-a-readme">Setting a README</a> </h4
2929
</p>
3030

3131
<h4 id="detecting-docsrs"> <a href="#detecting-docsrs">Detecting Docs.rs</a> </h4>
32+
<p>
33+
To recognize Docs.rs from your Rust code, you can test for the <code>docsrs</code> cfg, e.g.:
34+
{% filter highlight(lang="rust") %}{% filter dedent(levels=3) -%}
35+
#[cfg(docsrs)]
36+
mod documentation;
37+
{%- endfilter %}{% endfilter %}
38+
</p>
3239
<p>
3340
To recognize Docs.rs from <code>build.rs</code> files, you can test for the environment variable <code>DOCS_RS</code>, e.g.:
3441
{% filter highlight(lang="rust") %}{% filter dedent(levels=3) -%}
@@ -48,9 +55,9 @@ <h4 id="cross-compiling"> <a href="#cross-compiling">Cross-compiling</a> </h4>
4855
You can configure how your crate is built by adding <a href="metadata">package metadata</a> to your <code>Cargo.toml</code>, e.g.:
4956
{% filter highlight(lang="toml") %}{% filter dedent -%}
5057
[package.metadata.docs.rs]
51-
rustc-args = ["--cfg", "docsrs"]
58+
rustc-args = ["--cfg", "my_cfg"]
5259
{%- endfilter %}{% endfilter %}
53-
Here, the compiler arguments are set so that <code>#[cfg(docsrs)]</code> (not to be confused with <code>#[cfg(doc)]</code>) can be used for conditional compilation.
60+
Here, the compiler arguments are set so that <code>#[cfg(my_cfg)]</code> (not to be confused with <code>#[cfg(doc)]</code>) can be used for conditional compilation.
5461
This approach is also useful for setting <a href="https://doc.rust-lang.org/cargo/reference/features.html">cargo features</a>.
5562
</p>
5663

0 commit comments

Comments
 (0)