xref: /aosp_15_r20/external/stardoc/docs/generating_stardoc.md (revision b2fa42943c124aa9c7163734493fc7a7559681cf)
1*b2fa4294SXin Li<nav class="toc">
2*b2fa4294SXin Li  <h2>Contents</h2>
3*b2fa4294SXin Li  <ul>
4*b2fa4294SXin Li    <li><a href="#single-file">Single File</a></li>
5*b2fa4294SXin Li    <li><a href="#files-with-deps">Files with Dependencies</a></li>
6*b2fa4294SXin Li    <li><a href="#multiple-files">Multiple Files</a></li>
7*b2fa4294SXin Li  </ul>
8*b2fa4294SXin Li</nav>
9*b2fa4294SXin Li
10*b2fa4294SXin LiThe following are some examples of how to use Stardoc.
11*b2fa4294SXin Li
12*b2fa4294SXin Li<a name="single-file"></a>
13*b2fa4294SXin Li## Single File
14*b2fa4294SXin Li
15*b2fa4294SXin LiSuppose you have a project containing Stardoc rules you want to document:
16*b2fa4294SXin Li
17*b2fa4294SXin Li```
18*b2fa4294SXin Li[workspace]/
19*b2fa4294SXin Li    WORKSPACE
20*b2fa4294SXin Li    checkstyle/
21*b2fa4294SXin Li        BUILD
22*b2fa4294SXin Li        checkstyle.bzl
23*b2fa4294SXin Li```
24*b2fa4294SXin Li
25*b2fa4294SXin LiTo generate documentation for the rules in `checkstyle.bzl`, add the
26*b2fa4294SXin Lifollowing target to `rules/BUILD`:
27*b2fa4294SXin Li
28*b2fa4294SXin Li```python
29*b2fa4294SXin Liload("@io_bazel_stardoc//stardoc:stardoc.bzl", "stardoc")
30*b2fa4294SXin Li
31*b2fa4294SXin Listardoc(
32*b2fa4294SXin Li    name = "checkstyle-docs",
33*b2fa4294SXin Li    input = "checkstyle.bzl",
34*b2fa4294SXin Li    out = "checkstyle_doc.md",
35*b2fa4294SXin Li)
36*b2fa4294SXin Li```
37*b2fa4294SXin Li
38*b2fa4294SXin LiRunning `bazel build //checkstyle:checkstyle-docs` will generate a markdown file
39*b2fa4294SXin Licontaining documentation for all Starlark rules defined in `checkstyle.bzl`.
40*b2fa4294SXin Li
41*b2fa4294SXin LiTo generate a subset of rules defined in `checkstyle.bzl`, you may specify which
42*b2fa4294SXin Lirule names you specifically want documentation for using the `symbol_names` attribute
43*b2fa4294SXin Liof the `stardoc` rule. If `symbol_names` is specified, only rules matching a name
44*b2fa4294SXin Liin `symbol_names` will be documented:
45*b2fa4294SXin Li
46*b2fa4294SXin Li```python
47*b2fa4294SXin Liload("@io_bazel_stardoc//stardoc:stardoc.bzl", "stardoc")
48*b2fa4294SXin Li
49*b2fa4294SXin Listardoc(
50*b2fa4294SXin Li    name = "checkstyle-docs",
51*b2fa4294SXin Li    input = "checkstyle.bzl",
52*b2fa4294SXin Li    out = "checkstyle_doc.md",
53*b2fa4294SXin Li    symbol_names = ["checkstyle_rule", "other_rule"],
54*b2fa4294SXin Li)
55*b2fa4294SXin Li```
56*b2fa4294SXin Li
57*b2fa4294SXin Li<a name="files-with-deps"></a>
58*b2fa4294SXin Li## Files with Dependencies
59*b2fa4294SXin Li
60*b2fa4294SXin LiIf you would like to generate documentation for a `.bzl` with dependencies on
61*b2fa4294SXin Liother `.bzl` files, use the `bzl_library` rule to create logical collections of
62*b2fa4294SXin LiStarlark sources and depend on these libraries via the `deps` attribute of your
63*b2fa4294SXin Li`stardoc` target.
64*b2fa4294SXin Li
65*b2fa4294SXin LiSuppose your project has the following structure:
66*b2fa4294SXin Li
67*b2fa4294SXin Li```
68*b2fa4294SXin Li[workspace]/
69*b2fa4294SXin Li    WORKSPACE
70*b2fa4294SXin Li    BUILD
71*b2fa4294SXin Li    checkstyle/
72*b2fa4294SXin Li        BUILD
73*b2fa4294SXin Li        checkstyle.bzl
74*b2fa4294SXin Li    lua/
75*b2fa4294SXin Li        BUILD
76*b2fa4294SXin Li        lua.bzl
77*b2fa4294SXin Li        luarocks.bzl
78*b2fa4294SXin Li```
79*b2fa4294SXin Li
80*b2fa4294SXin Li...and suppose your target `.bzl` file depends on other `.bzl` files in your workspace:
81*b2fa4294SXin Li
82*b2fa4294SXin Li`checkstyle/checkstyle.bzl`:
83*b2fa4294SXin Li
84*b2fa4294SXin Li```python
85*b2fa4294SXin Liload("//lua:lua.bzl", "lua_utility")
86*b2fa4294SXin Li
87*b2fa4294SXin Lilua_utility()
88*b2fa4294SXin Li
89*b2fa4294SXin Licheckstyle_rule = rule(
90*b2fa4294SXin Li    ...
91*b2fa4294SXin Li)
92*b2fa4294SXin Li```
93*b2fa4294SXin Li
94*b2fa4294SXin LiIn this case, you can have a `bzl_library` target in `lua/BUILD`:
95*b2fa4294SXin Li
96*b2fa4294SXin Li`lua/BUILD`:
97*b2fa4294SXin Li
98*b2fa4294SXin Li```python
99*b2fa4294SXin Liload("@bazel_skylib//:bzl_library.bzl", "bzl_library")
100*b2fa4294SXin Li
101*b2fa4294SXin Libzl_library(
102*b2fa4294SXin Li    name = "lua-rules",
103*b2fa4294SXin Li    srcs = [
104*b2fa4294SXin Li        "lua.bzl",
105*b2fa4294SXin Li        "luarocks.bzl",
106*b2fa4294SXin Li    ],
107*b2fa4294SXin Li)
108*b2fa4294SXin Li```
109*b2fa4294SXin Li
110*b2fa4294SXin LiTo build documentation for `checkstyle.bzl`, specify the `bzl_library` target
111*b2fa4294SXin Lias a dependency of the `stardoc` target:
112*b2fa4294SXin Li
113*b2fa4294SXin Li`checkstyle/BUILD`:
114*b2fa4294SXin Li
115*b2fa4294SXin Li```python
116*b2fa4294SXin Liload("@io_bazel_stardoc//stardoc:stardoc.bzl", "stardoc")
117*b2fa4294SXin Li
118*b2fa4294SXin Listardoc(
119*b2fa4294SXin Li    name = "checkstyle-docs",
120*b2fa4294SXin Li    input = "checkstyle.bzl",
121*b2fa4294SXin Li    out = "checkstyle_doc.md",
122*b2fa4294SXin Li    deps = ["//lua:lua-rules"],
123*b2fa4294SXin Li)
124*b2fa4294SXin Li```
125*b2fa4294SXin Li
126*b2fa4294SXin Li<a name="multiple-files"></a>
127*b2fa4294SXin Li## Multiple Files
128*b2fa4294SXin Li
129*b2fa4294SXin LiIf you would like to generate documentation for multiple .bzl files in various
130*b2fa4294SXin Lipackages in your workspace, you will need to create a single `.bzl` file that depends
131*b2fa4294SXin Lion all those `.bzl` files. You can then explicitly whitelist rules for which you would
132*b2fa4294SXin Lilike documentation to be generated.
133*b2fa4294SXin Li
134*b2fa4294SXin LiFor example, you may want to generate documentation for `foo_rule`, `bar_rule`, and
135*b2fa4294SXin Li`baz_rule`, all in different `.bzl` files. First, you would create a single `.bzl` file
136*b2fa4294SXin Liwhich loads these files and binds the rules to be documented as globals:
137*b2fa4294SXin Li
138*b2fa4294SXin Li`doc_hub.bzl`:
139*b2fa4294SXin Li
140*b2fa4294SXin Li```python
141*b2fa4294SXin Liload("//foo:foo.bzl", _foo_rule = "foo_rule")
142*b2fa4294SXin Liload("//bar:bar.bzl", _bar_rule = "bar_rule")
143*b2fa4294SXin Liload("//baz:baz.bzl", _baz_rule = "baz_rule")
144*b2fa4294SXin Li
145*b2fa4294SXin Lifoo_rule = _foo_rule
146*b2fa4294SXin Libar_rule = _bar_rule
147*b2fa4294SXin Libaz_rule = _baz_rule
148*b2fa4294SXin Li
149*b2fa4294SXin Li# No need for any implementation here. The rules need only be loaded.
150*b2fa4294SXin Li```
151*b2fa4294SXin Li
152*b2fa4294SXin LiA single `stardoc` target can then be used to generate their documentation:
153*b2fa4294SXin Li
154*b2fa4294SXin Li`BUILD`:
155*b2fa4294SXin Li
156*b2fa4294SXin Li```python
157*b2fa4294SXin Liload("@io_bazel_stardoc//stardoc:stardoc.bzl", "stardoc")
158*b2fa4294SXin Li
159*b2fa4294SXin Listardoc(
160*b2fa4294SXin Li    name = "my-docs",
161*b2fa4294SXin Li    input = "doc_hub.bzl",
162*b2fa4294SXin Li    out = "docs.md",
163*b2fa4294SXin Li    symbol_names = ["foo_rule", "bar_rule", "baz_rule"],
164*b2fa4294SXin Li)
165*b2fa4294SXin Li```
166*b2fa4294SXin Li
167*b2fa4294SXin Li
168