@@ -36,30 +36,141 @@ does is call the `main()` that's in this crate's `lib.rs`, though.)
36
36
37
37
## Cheat sheet
38
38
39
+ * Run ` ./x.py setup tools ` before getting started. This will configure ` x.py `
40
+ with nice settings for developing rustdoc and other tools, including
41
+ downloading a copy of rustc rather than building it.
39
42
* Use ` ./x.py build ` to make a usable
40
43
rustdoc you can run on other projects.
41
44
* Add ` library/test ` to be able to use ` rustdoc --test ` .
42
- * If you've used ` rustup toolchain link local /path/to/build/$TARGET/stage1 `
43
- previously, then after the previous build command, ` cargo +local doc ` will
44
- Just Work.
45
+ * Run ` rustup toolchain link stage2 build/$TARGET/stage2 ` to add a
46
+ custom toolchain called ` stage2 ` to your rustup environment. After
47
+ running that, ` cargo +stage2 doc ` in any directory will build with
48
+ your locally-compiled rustdoc.
45
49
* Use ` ./x.py doc library/std ` to use this rustdoc to generate the
46
50
standard library docs.
47
- * The completed docs will be available in ` build/$TARGET/doc/std ` , though the
48
- bundle is meant to be used as though you would copy out the ` doc ` folder to
49
- a web server, since that's where the CSS/JS and landing page are.
51
+ * The completed docs will be available in ` build/$TARGET/doc/std ` .
52
+ * If you want to copy those docs to a webserver, copy all of
53
+ ` build/$TARGET/doc ` , since that's where the CSS, JS, fonts, and landing
54
+ page are.
50
55
* Use ` ./x.py test src/test/rustdoc* ` to run the tests using a stage1 rustdoc.
51
56
* See [ Rustdoc internals] for more information about tests.
52
- * Most of the HTML printing code is in ` html/format.rs ` and ` html/render.rs ` .
57
+
58
+ ## Code structure
59
+
60
+ * All paths in this section are relative to ` src/librustdoc ` in the rust-lang/rust repository.
61
+ * Most of the HTML printing code is in ` html/format.rs ` and ` html/render/mod.rs ` .
53
62
It's in a bunch of ` fmt::Display ` implementations and supplementary
54
63
functions.
55
64
* The types that got ` Display ` impls above are defined in ` clean/mod.rs ` , right
56
65
next to the custom ` Clean ` trait used to process them out of the rustc HIR.
57
- * The bits specific to using rustdoc as a test harness are in ` test.rs ` .
66
+ * The bits specific to using rustdoc as a test harness are in
67
+ ` doctest.rs ` .
58
68
* The Markdown renderer is loaded up in ` html/markdown.rs ` , including functions
59
69
for extracting doctests from a given block of Markdown.
60
- * The tests on rustdoc * output* are located in ` src/test/rustdoc ` , where
70
+ * The tests on the structure of rustdoc HTML output are located in ` src/test/rustdoc ` , where
61
71
they're handled by the test runner of rustbuild and the supplementary script
62
72
` src/etc/htmldocck.py ` .
63
- * Tests on search index generation are located in ` src/test/rustdoc-js ` , as a
73
+
74
+ ## Tests
75
+
76
+ * All paths in this section are relative to ` src/test ` in the rust-lang/rust repository.
77
+ * Tests on search index generation are located in ` rustdoc-js ` , as a
64
78
series of JavaScript files that encode queries on the standard library search
65
79
index and expected results.
80
+ * Tests on the "UI" of rustdoc (the terminal output it produces when run) are in
81
+ ` rustdoc-ui `
82
+ * Tests on the "GUI" of rustdoc (the HTML, JS, and CSS as rendered in a browser)
83
+ are in ` rustdoc-gui ` . These use a [ NodeJS tool called
84
+ browser-UI-test] ( https://github.com/GuillaumeGomez/browser-UI-test/ ) that uses
85
+ puppeteer to run tests in a headless browser and check rendering and
86
+ interactivity.
87
+
88
+ ## Constraints
89
+
90
+ We try to make rustdoc work reasonably well with JavaScript disabled, and when
91
+ browsing local files. We support
92
+ [ these browsers] ( https://rust-lang.github.io/rfcs/1985-tiered-browser-support.html#supported-browsers ) .
93
+
94
+ Supporting local files (` file:/// ` URLs) brings some surprising restrictions.
95
+ Certain browser features that require secure origins, like ` localStorage ` and
96
+ Service Workers, don't work reliably. We can still use such features but we
97
+ should make sure pages are still usable without them.
98
+
99
+ ## Multiple runs, same output directory
100
+
101
+ Rustdoc can be run multiple times for varying inputs, with its output set to the
102
+ same directory. That's how cargo produces documentation for dependencies of the
103
+ current crate. It can also be done manually if a user wants a big
104
+ documentation bundle with all of the docs they care about.
105
+
106
+ HTML is generated independently for each crate, but there is some cross-crate
107
+ information that we update as we add crates to the output directory:
108
+
109
+ - ` crates<SUFFIX>.js ` holds a list of all crates in the output directory.
110
+ - ` search-index<SUFFIX>.js ` holds a list of all searchable items.
111
+ - For each trait, there is a file under ` implementors/.../trait.TraitName.js `
112
+ containing a list of implementors of that trait. The implementors may be in
113
+ different crates than the trait, and the JS file is updated as we discover
114
+ new ones.
115
+
116
+ ## Use cases
117
+
118
+ There are a few major use cases for rustdoc that you should keep in mind when
119
+ working on it:
120
+
121
+ ### Standard library docs
122
+
123
+ These are published at < https://doc.rust-lang.org/std > as part of the Rust release
124
+ process. Stable releases are also uploaded to specific versioned URLs like
125
+ < https://doc.rust-lang.org/1.57.0/std/ > . Beta and nightly docs are published to
126
+ < https://doc.rust-lang.org/beta/std/ > and < https://doc.rust-lang.org/nightly/std/ > .
127
+ The docs are uploaded with the [ promote-release
128
+ tool] ( https://github.com/rust-lang/promote-release ) and served from S3 with
129
+ CloudFront.
130
+
131
+ The standard library docs contain five crates: alloc, core, proc_macro, std, and
132
+ test.
133
+
134
+ ### docs.rs
135
+
136
+ When crates are published to crates.io, docs.rs automatically builds
137
+ and publishes their documentation, for instance at
138
+ < https://docs.rs/serde/latest/serde/ > . It always builds with the current nightly
139
+ rustdoc, so any changes you land in rustdoc are "insta-stable" in that they will
140
+ have an immediate public effect on docs.rs. Old documentation is not rebuilt, so
141
+ you will see some variation in UI when browsing old releases in docs.rs. Crate
142
+ authors can request rebuilds, which will be run with the latest rustdoc.
143
+
144
+ Docs.rs performs some transformations on rustdoc's output in order to save
145
+ storage and display a navigation bar at the top. In particular, certain static
146
+ files (like main.js and rustdoc.css may be shared across multiple invocations
147
+ of the same version of rustdoc. Others, like crates.js and sidebar-items.js, are
148
+ different for different invocations. Still others, like fonts, will never
149
+ change. These categories are distinguished using the ` SharedResource ` enum in
150
+ ` src/librustdoc/html/render/write_shared.rs `
151
+
152
+ Documentation on docs.rs is always generated for a single crate at a time, so
153
+ the search and sidebar functionality don't include dependencies of the current
154
+ crate.
155
+
156
+ ### Locally generated docs
157
+
158
+ Crate authors can run ` cargo doc --open ` in crates they have checked
159
+ out locally to see the docs. This is useful to check that the docs they
160
+ are writing are useful and display correctly. It can also be useful for
161
+ people to view documentation on crates they aren't authors of, but want to
162
+ use. In both cases, people may use ` --document-private-items ` Cargo flag to
163
+ see private methods, fields, and so on, which are normally not displayed.
164
+
165
+ By default ` cargo doc ` will generate documentation for a crate and all of its
166
+ dependencies. That can result in a very large documentation bundle, with a large
167
+ (and slow) search corpus. The Cargo flag ` --no-deps ` inhibits that behavior and
168
+ generates docs for just the crate.
169
+
170
+ ### Self-hosted project docs
171
+
172
+ Some projects like to host their own documentation. For example:
173
+ < https://docs.serde.rs/ > . This is easy to do by locally generating docs, and
174
+ simply copying them to a web server. Rustdoc's HTML output can be extensively
175
+ customized by flags. Users can add a theme, set the default theme, and inject
176
+ arbitrary HTML. See ` rustdoc --help ` for details.
0 commit comments