Skip to content

Commit b080834

Browse files
committed
docs: add outputs example
1 parent e0bf644 commit b080834

File tree

3 files changed

+165
-5
lines changed

3 files changed

+165
-5
lines changed

examples/substitutions/BUILD.bazel

Lines changed: 112 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,106 @@ load("@doxygen//:doxygen.bzl", "doxygen")
22
load("//substitutions:make_var_substitution.bzl", "make_var_substitution")
33
load("@bazel_skylib//rules:common_settings.bzl", "string_flag")
44

5+
genrule(
6+
name = "header",
7+
outs = ["header.html"],
8+
cmd = """echo '
9+
<!DOCTYPE html
10+
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
11+
<html xmlns="http://www.w3.org/1999/xhtml">
12+
13+
<body>
14+
<a href="https://github.com/TendTo/rules_doxygen" class="github-corner" title="View source on GitHub" target="_blank"
15+
rel="noopener noreferrer">
16+
<svg viewBox="0 0 250 250" width="40" height="40"
17+
style="position: absolute; top: 0; border: 0; right: 0; z-index: 99" aria-hidden="true">
18+
<path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path>
19+
<path
20+
d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2"
21+
fill="currentColor" style="transform-origin: 130px 106px" class="octo-arm"></path>
22+
<path
23+
d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z"
24+
fill="currentColor" class="octo-body"></path>
25+
</svg></a>
26+
<style>
27+
.github-corner:hover .octo-arm {
28+
animation: octocat-wave 560ms ease-in-out;
29+
}
30+
31+
@keyframes octocat-wave {
32+
33+
0%,
34+
100% {
35+
transform: rotate(0);
36+
}
37+
38+
20%,
39+
60% {
40+
transform: rotate(-25deg);
41+
}
42+
43+
40%,
44+
80% {
45+
transform: rotate(10deg);
46+
}
47+
}
48+
49+
@media (max-width: 500px) {
50+
.github-corner:hover .octo-arm {
51+
animation: none;
52+
}
53+
54+
.github-corner .octo-arm {
55+
animation: octocat-wave 560ms ease-in-out;
56+
}
57+
}
58+
</style>
59+
60+
<div id="top">
61+
<!-- do not remove this div, it is closed by doxygen! -->
62+
63+
<!--BEGIN TITLEAREA-->
64+
<div id="titlearea">
65+
<table cellspacing="0" cellpadding="0">
66+
<tbody>
67+
<tr style="height: 56px">
68+
<!--BEGIN PROJECT_LOGO-->
69+
<td id="projectlogo">
70+
<img alt="Logo" src="$$relpath^$$projectlogo" />
71+
</td>
72+
<!--END PROJECT_LOGO-->
73+
<!--BEGIN PROJECT_NAME-->
74+
<td id="projectalign" style="padding-left: 0.5em">
75+
<div id="projectname">
76+
$$projectname
77+
<!--BEGIN PROJECT_NUMBER-->&#160;<span id="projectnumber">$$projectnumber</span><!--END PROJECT_NUMBER-->
78+
</div>
79+
<!--BEGIN PROJECT_BRIEF-->
80+
<div id="projectbrief">$$projectbrief</div>
81+
<!--END PROJECT_BRIEF-->
82+
</td>
83+
<!--END PROJECT_NAME-->
84+
<!--BEGIN !PROJECT_NAME-->
85+
<!--BEGIN PROJECT_BRIEF-->
86+
<td style="padding-left: 0.5em">
87+
<div id="projectbrief">$$projectbrief</div>
88+
</td>
89+
<!--END PROJECT_BRIEF-->
90+
<!--END !PROJECT_NAME-->
91+
<!--BEGIN DISABLE_INDEX-->
92+
<!--BEGIN SEARCHENGINE-->
93+
<td>$$searchbox</td>
94+
<!--END SEARCHENGINE-->
95+
<!--END DISABLE_INDEX-->
96+
</tr>
97+
</tbody>
98+
</table>
99+
</div>
100+
<!--END TITLEAREA-->
101+
<!-- end header part -->
102+
' > $@""",
103+
)
104+
5105
genrule(
6106
name = "doxyfile_template",
7107
srcs = ["Doxyfile.template"],
@@ -18,6 +118,9 @@ string_flag(
18118

19119
make_var_substitution(
20120
name = "make_var_substitution",
121+
locations = {
122+
"HEADER": ":header",
123+
},
21124
variables = {
22125
"NAME": "substitutions",
23126
},
@@ -28,9 +131,17 @@ doxygen(
28131
srcs = glob([
29132
"*.h",
30133
"*.cpp",
31-
]),
134+
]) + [":header"],
32135
doxyfile_template = ":doxyfile_template",
136+
html_header = "$(HEADER)",
33137
project_brief = "$(BUILD_DESCRIPTION)",
34138
project_name = "$(NAME)",
35139
toolchains = [":make_var_substitution"],
36140
)
141+
142+
genrule(
143+
name = "doxygen_files",
144+
srcs = [":doxygen"],
145+
outs = ["doxygen_files.txt"],
146+
cmd = "ls $(location :doxygen) > $@",
147+
)

examples/substitutions/README.md

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,11 +68,15 @@ def _make_var_substitution_impl(ctx):
6868
vars["BUILD_DESCRIPTION"] = ctx.attr._build_description[BuildSettingInfo].value
6969
else: # Otherwise use the hardcoded value.
7070
vars["BUILD_DESCRIPTION"] = "no stamp"
71+
# Add the path of the label files to the variables.
72+
for key, value in ctx.attr.locations.items():
73+
vars[key] = '"%s"' % '" "'.join([file.path for file in (value[DefaultInfo].files.to_list())])
7174
return [platform_common.TemplateVariableInfo(vars)]
7275
7376
make_var_substitution = rule(
7477
implementation = _make_var_substitution_impl,
7578
attrs = dict({
79+
"locations": attr.string_keyed_label_dict(),
7680
"variables": attr.string_dict(),
7781
"_build_description": attr.label(default = "//substitutions:build_description"),
7882
}, **STAMP_ATTRS),
@@ -103,6 +107,23 @@ genrule(
103107
)
104108
```
105109
110+
### Output files
111+
112+
It is also possible to use files produced by other rules as input files for the doxygen rule.
113+
For example, we can use a `genrule` to create an `header.html` file that will be used as the header for the doxygen documentation.
114+
115+
```bzl
116+
# BUILD.bazel
117+
genrule(
118+
name = "header",
119+
srcs = ["header.html"],
120+
outs = ["header.html"],
121+
cmd = "echo '<h1>My Header</h1>' > $@",
122+
)
123+
```
124+
125+
We need to include the genrule in the `locations` attribute of a `make_var_substitution` rule, as well as including it in the `srcs` attribute of the doxygen rule and specifying the location substitution in the `doxygen` rule.
126+
106127
### Final result
107128
108129
```bzl
@@ -111,6 +132,14 @@ genrule(
111132
load("@doxygen//:doxygen.bzl", "doxygen")
112133
load("//substitutions:make_var_substitution.bzl", "make_var_substitution")
113134
135+
# Use a shell script to create a header file
136+
genrule(
137+
name = "header",
138+
srcs = ["header.html"],
139+
outs = ["header.html"],
140+
cmd = "echo '<h1>My Header</h1>' > $@",
141+
)
142+
114143
# Use a shell script to read the version from the stable-status.txt file
115144
# It will replace the pattern {{PROJECT_NUMBER}} in the Doxyfile.template file
116145
genrule(
@@ -128,17 +157,21 @@ make_var_substitution(
128157
variables = {
129158
"NAME": "substitutions",
130159
},
160+
locations = {
161+
"HEADER": ":header",
162+
},
131163
)
132164
133165
doxygen(
134166
name = "doxygen",
135167
srcs = glob([
136168
"*.h",
137169
"*.cpp",
138-
]),
139-
project_brief = "$(DESCRIPTION)", # => "no stamp" or "//substitutions:build_description" if the build is stamped
170+
]) + [":header"], # We need to indicate all the rules this doxygen rule depends on
171+
project_brief = "$(BUILD_DESCRIPTION)", # => "no stamp" or "//substitutions:build_description" if the build is stamped
140172
project_name = "$(NAME)", # => "substitutions"
141173
doxyfile_template = ":doxyfile_template",
174+
html_header = "$(HEADER)", # => "header.html"
142175
toolchains = [":make_var_substitution"],
143176
)
144177
```

examples/substitutions/make_var_substitution.bzl

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,15 @@ def _make_var_substitution_impl(ctx):
88
vars["BUILD_DESCRIPTION"] = ctx.attr._build_description[BuildSettingInfo].value
99
else: # Otherwise use the hardcoded value.
1010
vars["BUILD_DESCRIPTION"] = "no stamp"
11+
# Add the path of the label files to the variables.
12+
for key, value in ctx.attr.locations.items():
13+
vars[key] = '"%s"' % '" "'.join([file.path for file in (value[DefaultInfo].files.to_list())])
1114
return [platform_common.TemplateVariableInfo(vars)]
1215

1316
make_var_substitution = rule(
1417
implementation = _make_var_substitution_impl,
1518
attrs = dict({
19+
"locations": attr.string_keyed_label_dict(),
1620
"variables": attr.string_dict(),
1721
"_build_description": attr.label(default = "//substitutions:build_description"),
1822
}, **STAMP_ATTRS),
@@ -25,22 +29,34 @@ It provides the following substitution variables by default:
2529
Example:
2630
2731
```bzl
32+
filegroup(
33+
name = "header",
34+
srcs = ["header.html"],
35+
)
36+
2837
make_var_substitution(
2938
variables = {
3039
"MY_VARIABLE": "my_value",
3140
"VERSION": "1.0.0",
3241
},
42+
locations = {
43+
"HEADER": ":header",
44+
},
3345
)
3446
3547
doxygen(
3648
name = "doxygen",
37-
srcs = ["main.cpp"],
49+
srcs = ["main.cpp", ":header"],
3850
project_brief = "$(MY_VARIABLE)", # => "my_value"
3951
project_number = "$(VERSION)", # => "1.0.0"
52+
html_header = "$(HEADER)", # => "header.html"
4053
toolchains = [":make_var_substitution"],
4154
)
4255
```
4356
44-
This will make the variable `MY_VARIABLE` available to the template engine.
57+
This will make the variable `MY_VARIABLE` available to the template engine
58+
and replace it with the value `my_value` in the generated files.
59+
It will also make the variable `HEADER` available to the template engine
60+
and replace it with the path to the file `header.html` generated by the rule `header`.
4561
""",
4662
)

0 commit comments

Comments
 (0)