Expose stardoc() output files as runfiles (#139)
* Expose stardoc() output files as runfiles
There's currently a nuisance with the `stardoc()` rule that presents
itself in `rules_python`:
$ git clone https://github.com/bazelbuild/rules_python.git
$ cd rules_python
$ git checkout d314e96aaab18f60df50400d61214f7c1d71b8e6
$ bazel run //docs:update
cp: cannot stat 'bazel-bin/docs/packaging.md_': No such file or directory
cp: cannot stat 'bazel-bin/docs/pip.md_': No such file or directory
cp: cannot stat 'bazel-bin/docs/pip_repository.md_': No such file or directory
cp: cannot stat 'bazel-bin/docs/python.md_': No such file or directory
A sample of the targets involved look like so:
$ bazel cquery --output=build //docs:update + //docs:packaging-docs
INFO: Invocation ID: 5fd7a652-0b0d-4827-98f5-c345b38b2178
INFO: Analyzed 2 targets (0 packages loaded, 0 targets configured).
INFO: Found 2 targets...
# /home/jenkins/repos/rules_python/docs/BUILD:153:10
sh_binary(
name = "update",
target_compatible_with = [],
data = ["//docs:packaging-docs", "//docs:pip-docs", "//docs:pip-repository", "//docs:core-docs"],
srcs = ["//docs:update.sh"],
)
# Rule update instantiated at (most recent call last):
# /home/jenkins/repos/rules_python/docs/BUILD:153:10 in <toplevel>
# /home/jenkins/repos/rules_python/docs/BUILD:121:8
stardoc(
name = "packaging-docs",
target_compatible_with = [],
input = "//python:packaging.bzl",
deps = ["//docs:packaging_bzl"],
out = "//docs:packaging.md_",
)
# Rule packaging-docs instantiated at (most recent call last):
# /home/jenkins/repos/rules_python/docs/BUILD:121:8 in <toplevel>
# Rule stardoc defined at (most recent call last):
# /bazel-cache/phil/bazel/_bazel_phil/adc54b5b09500e464f8a73095f3bd8e3/external/io_bazel_stardoc/stardoc/stardoc.bzl:110:15 in <toplevel>
The `update` target could instead reference the `*.md_` files directly
instead of referencing the `stardoc()` targets. But it's not obvious
that this is the desired work flow. It feels like users should be able
to depend on the `stardoc()` target instead of its predeclared output.
This patch fixes this by adding the predeclared outputs to the
target's runfiles. That lets the `rules_python` doc update target work
again.
$ bazel run //docs:update
'bazel-bin/docs/packaging.md_' -> 'docs/packaging.md'
'bazel-bin/docs/pip.md_' -> 'docs/pip.md'
'bazel-bin/docs/pip_repository.md_' -> 'docs/pip_repository.md'
'bazel-bin/docs/python.md_' -> 'docs/python.md'
diff --git a/stardoc/stardoc.bzl b/stardoc/stardoc.bzl
index f5693fc..61848d7 100644
--- a/stardoc/stardoc.bzl
+++ b/stardoc/stardoc.bzl
@@ -109,6 +109,12 @@
(ctx.label.name)),
)
+ # Work around default outputs not getting captured by sh_binary:
+ # https://github.com/bazelbuild/bazel/issues/15043.
+ # See discussion in https://github.com/bazelbuild/stardoc/pull/139.
+ outputs = [out_file]
+ return [DefaultInfo(files = depset(outputs), runfiles = ctx.runfiles(files = outputs))]
+
stardoc = rule(
_stardoc_impl,
doc = """