Autobazel

Autobazel-directives allow the automatic documentation of Bazel workspaces, packages, targets, rules, marcos, implementations and rule attributes.

All showed examples are based on the same Bazel example workspace, which structure and content is explained at the end of this page: Example project structure.

autobazel-workspace

Documents a whole Bazel workspace:

.. autobazel-workspace:: ./bazel_example

Result

hello_world_workspace (bazel_example)

My workspace description

# Some python code
print("awesome")

If the given path is relative, the sphinx configuration folder is taken as basedir (the one which contains your conf.py file)

autobazel-package

Documents a single Bazel package:

.. autobazel-package:: //lib

Result

//lib

LIB package: provides awesome stuff.

Sphinx-Bazel links all packages internally to a defined workspace, so that it is able to calculate needed folder and file paths of the package. Please be sure you use autobazel-workspace, .. bazel:workspace:: or path to define the location of the workspace to use.

autobazel-target

Documents a single Bazel target:

.. autobazel-target:: //main:hello-world.bzl

Result

//main:hello-world.bzl

An example .bzl file.

You will find here a rule, a macro and the implementation function for the rule.

Like in autobazel-package please make sure that a workspace got defined.

autobazel-target searches for docstrings in files with extension .bzl and use this as target-description. Other file-extension are not supported, as they normally do not follow the Python syntax.

autobazel-rule

Documents a single Bazel rule:

.. autobazel-rule:: //main:hello-world.bzl:custom_build_rule

Result

//main:hello-world.bzl:custom_build_rule

Explanation of custom_build_rule. Taken from doc attribute of rule definition.

Like in autobazel-package please make sure that a workspace got defined.

autobazel-rule searches for docstrings in the doc-attribute of a rule defined in files with extension .bzl. This is then used as rule description.

autobazel-macro

Documents a single Bazel macro:

.. autobazel-macro:: //main:hello-world.bzl:custom_macro

Result

//main:hello-world.bzl:custom_macro

Custom macro documentation example. Args:

Param format:The format to write check report in.
Param srcs:Source files to run the checks against.

Like in autobazel-package please make sure that a workspace got defined.

autobazel-macro uses the docstring of the function/macro as macro description.

autobazel-implementation

Documents a Bazel implementation of a rule:

.. autobazel-implementation:: //main:hello-world.bzl:__impl_custom_build_rule

Result

//main:hello-world.bzl:__impl_custom_build_rule

Documentation of the custom_build_rule implementation.

Like in autobazel-package please make sure that a workspace got defined.

autobazel-implementation uses the docstring of the implementation as implementation description.

autobazel-attribute

Documents a specific Bazel rule attribute:

.. autobazel-attribute:: //main:hello-world.bzl:custom_build_rule:package_script

Result

//main:hello-world.bzl:custom_build_rule:package_script

Python script for simple file packaging

autobazel-attribute searches for docstrings in the doc-attribute of an attribute.

Options

Most options are supported by the above directives, as they are very common. However, some are not. So here is an overview about which autobazel directive supports what kind of options.

Used abbreviations: ws=workspace, pack=package, targ=target, impl=implementation, attr=attribute

Option/autobazel-… ws pack targ rule macro impl attr
path 👍 👍 👍 👍 👍 👍
name 👍
packages 👍 👍
targets 👍 👍
rules 👍 👍 👍
macros 👍 👍 👍
implementations 👍 👍 👍
attributes 👍 👍 👍 👍
hide 👍 👍 👍 👍 👍 👍 👍
show_implementation 👍 👍 👍 👍
show_invocation 👍 👍 👍 👍
show_workspace 👍 👍 👍 👍 👍 👍 👍
show_workspace_path 👍 👍 👍 👍 👍 👍 👍
raw 👍 👍 👍 👍 👍 👍 👍
show_type 👍 👍 👍 👍 👍 👍 👍

path

ws pack targ rule macro impl. attr
👍 👍 👍 👍 👍 👍

If :path: is set, Sphinx-Bazel checks this folder directly without the need of a valid or existing Bazel workspace.

The following example package path is created from path + autobazel_package argument:

.. autobazel-package:: //main
   :path: ./bazel_example/
   :show_workspace_path:

This will look for a BUILD file in ./bazel_examples/main.

Result

//main
workspace path: /home/docs/checkouts/readthedocs.org/user_builds/sphinx-bazel/checkouts/latest/docs/source/./bazel_example/

MAIN package: does awesome things.

Usage

The normal way is to not use this option and use autobazel-workspace or bazel:workspace instead. These directives will create a workspace internally and all following directives like autobazel-target or bazel:rule: will use this workspace as reference automatically.

However, there may be use cases where a workspace does not exist (e.g. single .bzl. files in a git submodule). In this cases this option can help.

name

ws pack targ rule macro impl. attr
👍

:name: can be used to define a specific name of a workspace.

Normally the name gets read from the WORKSPACE file. If no name is defined or there are reasons to document workspaces with similar names, use :name:

.. autobazel-workspace:: ./bazel_example/
   :name: my custom workspace name
   :show_workspace_path:
   :show_workspace:

Result

my custom workspace name (./bazel_example/)

My workspace description

# Some python code
print("awesome")

Note

This documentation uses the same workspace bazel_example several times on the same page. To avoid warnings like WARNING: Duplicate ID: "workspace-hello_world_workspace", we use :name: to import the same workspace multiple times under different names.

packages

ws pack targ rule macro impl. attr
👍

If :packages: is set, all found Bazel packages inside workspace will be printed as well:

.. autobazel-workspace:: ./bazel_example
   :packages:

Result

ws_package_example (./bazel_example)

My workspace description

# Some python code
print("awesome")
//main

MAIN package: does awesome things.

//lib

LIB package: provides awesome stuff.

regular expression

:packages: can also contain a regular expression which documents only packages, which match the given expression:

.. autobazel-workspace:: ./bazel_example
   :packages: .*lib.*

The above regular expression searches for all packages, which have lib in their name.

Result

ws_package_example2 (./bazel_example)

My workspace description

# Some python code
print("awesome")
//lib

LIB package: provides awesome stuff.

targets

ws pack targ rule macro impl. attr
👍 👍

If :targets: is set, all found Bazel targets inside found packages will be printed as well:

.. autobazel-package:: //main
   :path: ./bazel_example
   :targets:

Result

//main

MAIN package: does awesome things.

//main:hello-world.cc
//main:hello-world.bzl

An example .bzl file.

You will find here a rule, a macro and the implementation function for the rule.

//main:hello-greet.cc
//main:hello-greet.h

With the above given regular expression sphinx-bazel will only care about targets, which have .cc as file ending.

regular expression

:targets: can also contain a regular expression which documents only targets, which match the given expression:

.. autobazel-package:: //main
   :path: ./bazel_example
   :targets: .*.cc

With the above given regular expression sphinx-bazel will only care about targets, which have .cc as file ending.

Result

//main

MAIN package: does awesome things.

//main:hello-world.cc
//main:hello-greet.cc

rules

ws pack targ rule macro impl. attr
👍 👍 👍

If :rules: is set, all found rules inside targets with extension .bzl files will be printed

.. autobazel-target:: //main:hello-world.bzl
   :path: ./bazel_example
   :rules:

Result

//main:hello-world.bzl

An example .bzl file.

You will find here a rule, a macro and the implementation function for the rule.

//main:hello-world.bzl:custom_build_rule

Explanation of custom_build_rule. Taken from doc attribute of rule definition.

macros

ws pack targ rule macro impl. attr
👍 👍 👍

If :macros: is set, all found macros inside targets with extension .bzl files will be printed

.. autobazel-target:: //main:hello-world.bzl
   :path: ./bazel_example
   :macros:

Is only used, if :packages: and :targets: are provided as well!

Result

//main:hello-world.bzl

An example .bzl file.

You will find here a rule, a macro and the implementation function for the rule.

//main:hello-world.bzl:custom_macro

Custom macro documentation example. Args:

Param format:The format to write check report in.
Param srcs:Source files to run the checks against.

implementations

ws pack targ rule macro impl. attr
👍 👍 👍

If :implementations: is set, all found implementations inside targets with extension .bzl files will be printed

.. autobazel-target:: //main:hello-world.bzl
   :path: ./bazel_example
   :implementations:

Result

//main:hello-world.bzl

An example .bzl file.

You will find here a rule, a macro and the implementation function for the rule.

//main:hello-world.bzl:__impl_custom_build_rule

Documentation of the custom_build_rule implementation.

attributes

ws pack targ rule macro impl. attr
👍 👍 👍 👍

If :attributes: is set, all found attributes of a rule will be printed

.. autobazel-rule:: //main:hello-world.bzl:custom_build_rule
   :path: ./bazel_example
   :attributes:

Result

//main:hello-world.bzl:custom_build_rule

Explanation of custom_build_rule. Taken from doc attribute of rule definition.

//main:hello-world.bzl:custom_build_rule:targets

List of dependency rules which are building libraries

//main:hello-world.bzl:custom_build_rule:package_name

Test string

//main:hello-world.bzl:custom_build_rule:package_script

Python script for simple file packaging

hide

ws pack targ rule macro impl. attr
👍 👍 👍 👍 👍 👍 👍

If :hide: is set, information about the workspace itself will not be printed. But packages and co, if requested:

.. autobazel-workspace:: ./bazel_example
    :hide:
    :packages:

Result

//main

MAIN package: does awesome things.

//lib

LIB package: provides awesome stuff.

show_implementation

ws pack targ rule macro impl. attr
👍 👍 👍 👍

If show_implementation is given, the name of the implementation function of found rules gets printed:

.. autobazel-rule:: //main:hello-world.bzl:custom_build_rule
   :path: ./bazel_example
   :show_implementation:

Result

//main:hello-world.bzl:custom_build_rule
implementation: __impl_custom_build_rule

Explanation of custom_build_rule. Taken from doc attribute of rule definition.

show_invocation

ws pack targ rule macro impl. attr
👍 👍 👍 👍

If show_invocation is given, a generated invocation string based on name an attribute names gets printed:

.. autobazel-rule:: //main:hello-world.bzl:custom_build_rule
   :path: ./bazel_example
   :show_invocation:

Result

//main:hello-world.bzl:custom_build_rule
invocation: custom_build_rule(targets, package_name, package_script)

Explanation of custom_build_rule. Taken from doc attribute of rule definition.

show_workspace

ws pack targ rule macro impl. attr
👍 👍 👍 👍 👍 👍 👍

If :show_workspace is given, the workspace name will get added:

.. autobazel-workspace:: ./bazel_example
   :show_workspace:
   :packages:

Result

ws_show_workspace_example (./bazel_example)

My workspace description

# Some python code
print("awesome")
//main
workspace: ws_show_workspace_example

MAIN package: does awesome things.

//lib
workspace: ws_show_workspace_example

LIB package: provides awesome stuff.

show_workspace_path

ws pack targ rule macro impl. attr
👍 👍 👍 👍 👍 👍 👍

If :workspace_path is given, the workspace path will get added packages and targets:

.. autobazel-attribute:: //main:hello-world.bzl:custom_build_rule:package_script
   :path: ./bazel_example
   :show_workspace_path:

Result

//main:hello-world.bzl:custom_build_rule:package_script
workspace path: /home/docs/checkouts/readthedocs.org/user_builds/sphinx-bazel/checkouts/latest/docs/source/./bazel_example

Python script for simple file packaging

raw

ws pack targ rule macro impl. attr
👍 👍 👍 👍 👍 👍 👍

Deactivates the rendering of imported doc-string / doc-attributes. Instead the content will be shown in a code-block.

This may be needed, if a bazel element gets documented multiple times and its rst-based doc-string contains elements, which should only get rendered once. For instance a sphinx needs requirement, which must be unique.

.. autobazel-package:: //lib
   :raw:

Result

//lib
LIB package: provides **awesome** stuff.

show_type

ws pack targ rule macro impl. attr
👍 👍 👍 👍 👍 👍 👍

Adds a prefix like package: to show the type.

If using HTML as builder, the prefix will have the css classes: bazel , type and one of the following types: workspace, package, rule, implementation, macro or attribute.

.. autobazel-package:: //main
   :targets:
   :rule:
   :show_type:

Result

package: //main

MAIN package: does awesome things.

target: //main:hello-world.cc
target: //main:hello-world.bzl

An example .bzl file.

You will find here a rule, a macro and the implementation function for the rule.

rule: //main:hello-world.bzl:custom_build_rule

Explanation of custom_build_rule. Taken from doc attribute of rule definition.

target: //main:hello-greet.cc
target: //main:hello-greet.h

Example project structure

The following project structure was used for the above examples:

./bazel_example
├── lib
│   ├── BUILD
│   ├── hello-time.cc
│   └── hello-time.h
├── main
│   ├── BUILD
│   ├── hello-greet.cc
│   ├── hello-greet.h
│   ├── hello-world.bzl
│   └── hello-world.cc
└── WORKSPACE

This structure is coming from the original Bazel examples repository and was updated to provide more internal documentation (e.g. docstrings): https://github.com/bazelbuild/examples/

WORKSPACE content

"""
**My workspace description**

.. code-block:: python

   # Some python code
   print("awesome")
"""

workspace(name = "hello_world_workspace")

lib/BUILD content

"""
LIB package: provides **awesome** stuff.
"""

cc_library(
    name = "hello-time",
    srcs = ["hello-time.cc"],
    hdrs = ["hello-time.h"],
    visibility = ["//main:__pkg__"],
)

main/BUILD content

"""
MAIN package: does **awesome** things.
"""

cc_library(
    name = "hello-greet",
    srcs = ["hello-greet.cc"],
    hdrs = ["hello-greet.h"],
)

cc_binary(
    name = "hello-world",
    srcs = ["hello-world.cc"],
    deps = [
        ":hello-greet",
        "//lib:hello-time",
    ],
)

main/hello-world.bzl content

"""
An *example* .bzl file.

You will find here a rule, a macro and the implementation function for the rule.
"""


def custom_macro(name, format, srcs=[]):
    '''Custom macro documentation example.
    Args:

    :param format: The format to write check report in.
    :param srcs: Source files to run the checks against.

    '''
    pass


def __impl_custom_build_rule(ctx):
    """Documentation of the custom_build_rule implementation."""

    filesd = None
    return [DefaultInfo(files=filesd)]


custom_build_rule = rule(
    implementation = __impl_custom_build_rule,
    doc = """Explanation of **custom_build_rule**. Taken from `doc` attribute of rule definition.
""",
    attrs = {
        "targets": attr.label(
            mandatory=True,
            allow_files=True,
            doc="List of dependency rules which are building libraries"),
        "package_name": attr.string(
            mandatory=True,
            doc="Test string"),
        "package_script": attr.label(
            mandatory=False,
            default="//scripts:doc_gen_logger.py",
            allow_single_file=True,
            doc="Python script for simple file packaging"),
    }
)

Complete documentation

The following documentation of the complete Bazel Workspace uses nearly every available option:

.. autobazel-workspace:: ./bazel_example
   :name: ws_full_example
   :packages:               // from here content options
   :targets:
   :rules:
   :macros:
   :implementations:
   :attributes:
   :show_workspace:         // from here layout options only
   :show_workspace_path:
   :show_implementation:
   :show_invocation:
   :show_type:

Result

workspace: ws_full_example (./bazel_example)

My workspace description

# Some python code
print("awesome")
package: //main
workspace: ws_full_example
workspace path: ./bazel_example

MAIN package: does awesome things.

target: //main:hello-world.cc
workspace: ws_full_example
workspace path: ./bazel_example
target: //main:hello-world.bzl
workspace: ws_full_example
workspace path: ./bazel_example

An example .bzl file.

You will find here a rule, a macro and the implementation function for the rule.

rule: //main:hello-world.bzl:custom_build_rule
workspace: ws_full_example
workspace path: ./bazel_example
implementation: __impl_custom_build_rule
invocation: custom_build_rule(targets, package_name, package_script)

Explanation of custom_build_rule. Taken from doc attribute of rule definition.

attribute: //main:hello-world.bzl:custom_build_rule:targets
workspace: ws_full_example
workspace path: ./bazel_example

List of dependency rules which are building libraries

attribute: //main:hello-world.bzl:custom_build_rule:package_name
workspace: ws_full_example
workspace path: ./bazel_example

Test string

attribute: //main:hello-world.bzl:custom_build_rule:package_script
workspace: ws_full_example
workspace path: ./bazel_example

Python script for simple file packaging

macro: //main:hello-world.bzl:custom_macro
workspace: ws_full_example
workspace path: ./bazel_example

Custom macro documentation example. Args:

Param format:The format to write check report in.
Param srcs:Source files to run the checks against.
implementation: //main:hello-world.bzl:__impl_custom_build_rule
workspace: ws_full_example
workspace path: ./bazel_example

Documentation of the custom_build_rule implementation.

target: //main:hello-greet.cc
workspace: ws_full_example
workspace path: ./bazel_example
target: //main:hello-greet.h
workspace: ws_full_example
workspace path: ./bazel_example
package: //lib
workspace: ws_full_example
workspace path: ./bazel_example

LIB package: provides awesome stuff.

target: //lib:hello-time.cc
workspace: ws_full_example
workspace path: ./bazel_example
target: //lib:hello-time.h
workspace: ws_full_example
workspace path: ./bazel_example