Skip to content

feat(rustdoc): stabilize --emit flag#146220

Merged
rust-bors[bot] merged 1 commit into
rust-lang:mainfrom
weihanglo:rustdoc-emit
May 14, 2026
Merged

feat(rustdoc): stabilize --emit flag#146220
rust-bors[bot] merged 1 commit into
rust-lang:mainfrom
weihanglo:rustdoc-emit

Conversation

@weihanglo
Copy link
Copy Markdown
Member

@weihanglo weihanglo commented Sep 5, 2025

View all comments

---> FCP <---

Stabilization Report: rustdoc --emit

Feature: rustdoc --emit
Tracking issue: #83784
Stabilization PR: #146220

What we are stabilizing

This stabilizes the rustdoc --emit flag, which controls what types of output rustdoc produces. The flag accepts a comma-separated list of the following emit types:

  • html-static-files --- Shared static files with content-hashed filenames for safe caching.
  • html-non-static-files --- Per-crate documentation files with deterministic filenames.
  • dep-info[=<path>] --- A Makefile-compatible .d file listing all source files loaded during documentation generation. Same as rustc's dep-info files.

When --emit is not specified, the default behavior is --emit=html-static-files,html-non-static-files (i.e., full HTML documentation output, no dep-info).

What we are not stabilizing

  • Interaction between other unstable options, such as -Zrustdoc-mergeable-info and --output-format=doctest
  • Available options and the default options when --emit not specified.
  • Extension of per-type emit paths for options currently missing that.

Motivation

Cargo

The primary consumer is Cargo, which needs --emit=dep-info=<path> to precisely track the input dependencies of a rustdoc invocation (see the -Zrustdoc-depinfo unstable Cargo feature). Without dep-info, Cargo cannot detect changes to files pulled in via #[path = "..."] or similar mechanisms and leads to stale documentation in incremental builds.

Cargo also uses the selective emission mechanism (html-static-files / html-non-static-files) when the unstable -Zrustdoc-mergeable-info feature is active. It skips writing shared static files and search index during per-crate doc generation and defer them to a final merge phase.

Under stable usage, Cargo passes all three emit types together.

docs.rs

docs.rs is the other major consumer. It uses selective emission to avoid redundantly copying toolchain-wide static files for every crate, which has historically been a source of breakage. See the tracking #83784 and the about page for more https://docs.rs/about/download.

Tests

  • tests/run-make/emit-shared-files --- Verifies selective emission of static vs non-static files.
  • tests/run-make/rustdoc-dep-info --- Verifies dep-info generation, including explicit path and --out-dir interaction.
  • tests/run-make/rustdoc-scrape-examples-dep-info --- Verifies dep-info works with scrape-examples.
  • tests/run-make/rustdoc-default-output/ --- Verifies --help output shows [html-static-files,html-non-static-files,dep-info]

@rustbot rustbot added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. T-rustdoc Relevant to the rustdoc team, which will review and decide on the PR/issue. labels Sep 5, 2025
@weihanglo
Copy link
Copy Markdown
Member Author

Questions:

  • Do we want to stabilize also unversioned-shared-resources option? It currently does nothing AFAIK.
  • Do we want a stabilization report?
  • How many details do we want to put in doc?

@weihanglo
Copy link
Copy Markdown
Member Author

cc @aDotInTheVoid since you've involved in the PR removing the last blocker :)

@weihanglo weihanglo marked this pull request as ready for review September 24, 2025 19:21
@rustbot rustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. and removed S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. labels Sep 24, 2025
@fmease fmease added the needs-fcp This change is insta-stable, or significant enough to need a team FCP to proceed. label Oct 13, 2025
Comment thread src/doc/rustdoc/src/command-line-arguments.md Outdated
@notriddle notriddle self-assigned this Oct 13, 2025
@GuillaumeGomez
Copy link
Copy Markdown
Member

We discussed on today's rustdoc meeting. Before going any further, we will investigate exactly what each --emit option does exactly to have a clearer picture of what's actually needed and also to add missing documentation.

@weihanglo
Copy link
Copy Markdown
Member Author

We discussed on today's rustdoc meeting. Before going any further, we will investigate exactly what each --emit option does exactly to have a clearer picture of what's actually needed and also to add missing documentation.

Thanks for it!

This PR contains a doc based on my understanding and the history of these options, but I am not 100% sure if that is correct

@rustbot

This comment has been minimized.

@fmease
Copy link
Copy Markdown
Member

fmease commented Oct 25, 2025

I haven't read this yet but here are probably some very important and relevant considerations: #83784.

@weihanglo
Copy link
Copy Markdown
Member Author

For the use case in Cargo, we actually don't need anything other than dep-info. The originak ask was here: #t-rustdoc > Plan to stabilize `--emit=dep-info[=path]` @ 💬:

One thing that might be a blocker: rust-lang/cargo#15605

Do we want to stabilize the --emit flag with all the emit types, or just dep-info? At this moment it is required for cargo to pass --emit=toolchain-shared-resources,invocation-specific,dep-info=<PATH> in order to make the generated doc look good and styled.

I guess one way forward is that rustdoc provides an extra emit type, say, default. So that cargo can run --emit=default,dep-info=/path/to/foo.d without even considering those other options. And in rustdoc documentation we can state that the default emit type is whatever the default emits rustdoc is doing. Pretty much like --remap-path-scope=all:

all - an alias for all of the above, also equivalent to supplying only --remap-path-prefix without --remap-path-scope.

notriddle added a commit to notriddle/rust that referenced this pull request Oct 27, 2025
This option hasn't done anything for a long time, and can be
removed. I've kept a shim in place to avoid breaking docs.rs,
but the option no longer does anything.

Using git-blame, I tracked this option down to
f77ebd4, the commit that
introduced EmitType in the first place. It was used with
SharedResource::Unversioned, which no longer exists since
f9e1f6f removed them.

Part of rust-lang#146220
@notriddle
Copy link
Copy Markdown
Contributor

I've opened #148180, a follow-up that removes the no-op unversioned-shared-resources, which hasn't done anything ever since we switched to using hashes for cache busting.

notriddle added a commit to notriddle/rust that referenced this pull request Oct 27, 2025
This option hasn't done anything for a long time, and can be
removed. I've kept a shim in place to avoid breaking docs.rs,
but the option no longer does anything.

Using git-blame, I tracked this option down to
f77ebd4, the commit that
introduced EmitType in the first place. It was used with
SharedResource::Unversioned, which no longer exists since
f9e1f6f removed them.

CC rust-lang#146220
Part of rust-lang#83784
@rustbot

This comment has been minimized.

notriddle added a commit to notriddle/rust that referenced this pull request Oct 28, 2025
This option hasn't done anything for a long time, and can be
removed. I've kept a shim in place to avoid breaking docs.rs,
but the option no longer does anything.

Using git-blame, I tracked this option down to
f77ebd4, the commit that
introduced EmitType in the first place. It was used with
SharedResource::Unversioned, which no longer exists since
f9e1f6f removed them.

CC rust-lang#146220
Part of rust-lang#83784
matthiaskrgr added a commit to matthiaskrgr/rust that referenced this pull request Oct 28, 2025
…rces, r=GuillaumeGomez

rustdoc: remove `--emit=unversioned-shared-resources`

This option hasn't done anything for a long time, and can be removed. I've kept a shim in place to avoid breaking docs.rs, but the option no longer does anything.

Using git-blame, I tracked this option down to
f77ebd4, the commit that introduced EmitType in the first place. It was used with SharedResource::Unversioned, which no longer exists since f9e1f6f removed them.

CC rust-lang#146220
Part of rust-lang#83784
jhpratt added a commit to jhpratt/rust that referenced this pull request Apr 14, 2026
rustdoc: dep-info for standalone markdown inputs

Part of rust-lang#146220 (comment)

r? @fmease
rust-timer added a commit that referenced this pull request Apr 14, 2026
Rollup merge of #154352 - notriddle:emit-md, r=fmease

rustdoc: dep-info for standalone markdown inputs

Part of #146220 (comment)

r? @fmease
@fmease
Copy link
Copy Markdown
Member

fmease commented Apr 14, 2026

@rfcbot resolve interaction-with-other-modes

As already mentioned, we now emit an error if --emit and --test are specified at the same time (PR #153895). Moreover, --emit=depinfo now works for Markdown input files (PR #154352).

--emit=html-static-files, --emit=dep-info still emits a HTML artifact for Markdown input files despite --emit not containing html-non-static-files if the flag is specified like that. That's tracked in #155298 (ideally it would be fixed before the stabilization but it's not super pressing).

We still don't honor --emit under --output-format doctests -Zunstable-options but it's okay to postpone that.

@rfcbot resolve tiny-stab-report

Thanks, weihanglo, for adding a stabilization report!

@notriddle
Copy link
Copy Markdown
Contributor

#155374 adds a few more tests for this functionality

@rustbot

This comment has been minimized.

@rust-rfcbot rust-rfcbot added final-comment-period In the final comment period and will be merged soon unless new substantive objections are raised. and removed proposed-final-comment-period Proposed to merge/close by relevant subteam, see T-<team> label. Will enter FCP once signed off. labels May 4, 2026
@rust-rfcbot
Copy link
Copy Markdown
Collaborator

🔔 This is now entering its final comment period, as per the review above. 🔔

@rustbot
Copy link
Copy Markdown
Collaborator

rustbot commented May 4, 2026

This PR was rebased onto a different main commit. Here's a range-diff highlighting what actually changed.

Rebasing is a normal part of keeping PRs up to date, so no action is needed—this note is just to help reviewers.

@rust-rfcbot rust-rfcbot added finished-final-comment-period The final comment period is finished for this PR / Issue. to-announce Announce this issue on triage meeting and removed final-comment-period In the final comment period and will be merged soon unless new substantive objections are raised. labels May 14, 2026
@rust-rfcbot
Copy link
Copy Markdown
Collaborator

The final comment period, with a disposition to merge, as per the review above, is now complete.

As the automated representative of the governance process, I would like to thank the author for their work and everyone else who contributed.

@GuillaumeGomez
Copy link
Copy Markdown
Member

Thanks everyone!

@bors r+ rollup

@rust-bors
Copy link
Copy Markdown
Contributor

rust-bors Bot commented May 14, 2026

📌 Commit cef0e99 has been approved by GuillaumeGomez

It is now in the queue for this repository.

@rust-bors rust-bors Bot added S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels May 14, 2026
rust-bors Bot pushed a commit that referenced this pull request May 14, 2026
Rollup of 3 pull requests

Successful merges:

 - #146220 (feat(rustdoc): stabilize `--emit` flag)
 - #153785 (Hand-written Debug implementation for `TypeTest`)
 - #156564 (Lint level cleanups)
@rust-bors rust-bors Bot merged commit 6f222b3 into rust-lang:main May 14, 2026
11 checks passed
@rustbot rustbot added this to the 1.97.0 milestone May 14, 2026
jollaitbot pushed a commit to sailfishos-mirror/rust that referenced this pull request May 15, 2026
Rollup merge of #146220 - weihanglo:rustdoc-emit, r=GuillaumeGomez

feat(rustdoc): stabilize `--emit` flag

### [---> FCP <---](rust-lang/rust#146220 (comment))

## Stabilization Report: `rustdoc --emit`

**Feature:** `rustdoc --emit`
**Tracking issue:** rust-lang/rust#83784
**Stabilization PR:** rust-lang/rust#146220

### What we are stabilizing

This stabilizes the `rustdoc --emit` flag, which controls what types of output rustdoc produces. The flag accepts a comma-separated list of the following emit types:

- `html-static-files` --- Shared static files with content-hashed filenames for safe caching.
- `html-non-static-files` --- Per-crate documentation files with deterministic filenames.
- `dep-info[=<path>]` --- A Makefile-compatible `.d` file listing all source files loaded during documentation generation. Same as rustc's dep-info files.

When `--emit` is not specified, the default behavior is `--emit=html-static-files,html-non-static-files` (i.e., full HTML documentation output, no dep-info).

### What we are not stabilizing

* Interaction between other unstable options, such as `-Zrustdoc-mergeable-info` and `--output-format=doctest`
* Available options and the default options when `--emit` not specified.
* Extension of per-type emit paths for options currently missing that.

### Motivation

#### Cargo

The primary consumer is Cargo, which needs `--emit=dep-info=<path>` to precisely track the input dependencies of a rustdoc invocation (see the [`-Zrustdoc-depinfo`] unstable Cargo feature). Without dep-info, Cargo cannot detect changes to files pulled in via `#[path = "..."]` or similar mechanisms and leads to stale documentation in incremental builds.

Cargo also uses the selective emission mechanism (`html-static-files` / `html-non-static-files`) when the unstable [`-Zrustdoc-mergeable-info`] feature is active. It skips writing shared static files and search index during per-crate doc generation and defer them to a final merge phase.

Under stable usage, Cargo passes all three emit types together.

#### docs.rs

docs.rs is the other major consumer. It uses selective emission to avoid redundantly copying toolchain-wide static files for every crate, which has historically been a source of breakage. See the tracking rust-lang/rust#83784 and the about page for more <https://docs.rs/about/download>.

### Tests

- `tests/run-make/emit-shared-files` --- Verifies selective emission of static vs non-static files.
- `tests/run-make/rustdoc-dep-info` --- Verifies dep-info generation, including explicit path and `--out-dir` interaction.
- `tests/run-make/rustdoc-scrape-examples-dep-info` --- Verifies dep-info works with scrape-examples.
- `tests/run-make/rustdoc-default-output/` --- Verifies `--help` output shows `[html-static-files,html-non-static-files,dep-info]`

[`-Zrustdoc-depinfo`]: https://doc.rust-lang.org/nightly/cargo/reference/unstable.html#rustdoc-depinfo
[`-Zrustdoc-mergeable-info`]: https://doc.rust-lang.org/nightly/cargo/reference/unstable.html#rustdoc-mergeable-info
Sirus97 pushed a commit to clear-crab/package-manager that referenced this pull request May 16, 2026
`--emit` is now stable in rustdoc: rust-lang/rust#146220

`-Zunstable-options` flag is still required for `-Zrustdoc-mergeable-info`
related flags.
Sirus97 pushed a commit to clear-crab/package-manager that referenced this pull request May 16, 2026
### What does this PR try to resolve?

`--emit` is now stable in rustdoc: rust-lang/rust#146220

`-Zunstable-options` flag is still required for
`-Zrustdoc-mergeable-info` related flags.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

disposition-merge This issue / PR is in PFCP or FCP with a disposition to merge it. finished-final-comment-period The final comment period is finished for this PR / Issue. needs-fcp This change is insta-stable, or significant enough to need a team FCP to proceed. S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. T-rustdoc Relevant to the rustdoc team, which will review and decide on the PR/issue. to-announce Announce this issue on triage meeting

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants