Skip to content

Commit

Permalink
Move docs generations to bazel distribution (#393)
Browse files Browse the repository at this point in the history
## What is the goal of this PR?
Moves bazel rules used for generating documentation into the
vaticle/bazel-distribution repository

## What are the changes implemented in this PR?
* Moves bazel rules & targets for converters of {doxygen, javadoc,
sphinx (python), rustdocs} into bazel-distribution. **Note:** nodejs
typedocs hasn't been migrated

PR chain: typedb/typedb-driver#552 > typedb/typedb-dependencies#491 >
#393
  • Loading branch information
krishnangovindraj authored Jan 12, 2024
1 parent bc2fcd5 commit c63720a
Show file tree
Hide file tree
Showing 13 changed files with 540 additions and 1 deletion.
5 changes: 5 additions & 0 deletions BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ stardoc(
"//brew:lib",
"//common:lib",
"//crates:lib",
"//docs:lib",
"//gcp:lib",
"//github:lib",
"//maven:lib",
Expand Down Expand Up @@ -77,6 +78,10 @@ stardoc(
"assemble_crate",
"deploy_crate",

# From: //docs:*/rules.bzl
"doxygen_docs",
"sphinx_docs",

# From: //gcp:rules.bzl
"assemble_gcp",

Expand Down
56 changes: 55 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -345,6 +345,32 @@ Deploy package built with `assemble_rpm` to RPM repository.
| <a id="deploy_rpm-target"></a>target | <code>assemble_rpm</code> target to deploy | <a href="https://bazel.build/concepts/labels">Label</a> | optional | <code>None</code> |


<a id="doxygen_docs"></a>

## doxygen_docs

<pre>
doxygen_docs(<a href="#doxygen_docs-name">name</a>, <a href="#doxygen_docs-desc">desc</a>, <a href="#doxygen_docs-main_page_md">main_page_md</a>, <a href="#doxygen_docs-project_name">project_name</a>, <a href="#doxygen_docs-sources">sources</a>, <a href="#doxygen_docs-strip_prefix">strip_prefix</a>, <a href="#doxygen_docs-version">version</a>)
</pre>


Creates HTML documentation for C++ projects using Doxygen.

**ATTRIBUTES**


| Name | Description | Type | Mandatory | Default |
| :------------- | :------------- | :------------- | :------------- | :------------- |
| <a id="doxygen_docs-name"></a>name | A unique name for this target. | <a href="https://bazel.build/concepts/labels#target-names">Name</a> | required | |
| <a id="doxygen_docs-desc"></a>desc | A description for the project | String | optional | <code>""</code> |
| <a id="doxygen_docs-main_page_md"></a>main_page_md | The file to use as main page for the generate docs | <a href="https://bazel.build/concepts/labels">Label</a> | optional | <code>None</code> |
| <a id="doxygen_docs-project_name"></a>project_name | The project name for the doxygen docs | String | required | |
| <a id="doxygen_docs-sources"></a>sources | A list of files made available to doxygen. This is NOT automatically included in the doxyfile | <a href="https://bazel.build/concepts/labels">List of labels</a> | required | |
| <a id="doxygen_docs-strip_prefix"></a>strip_prefix | Prefix to strip from path of files being processed | String | optional | <code>""</code> |
| <a id="doxygen_docs-version"></a>version | The version of the project being documented | String | optional | <code>""</code> |


<a id="generate_json_config"></a>

## generate_json_config
Expand All @@ -370,7 +396,8 @@ Fills in JSON template with provided values
## java_deps

<pre>
java_deps(<a href="#java_deps-name">name</a>, <a href="#java_deps-java_deps_root">java_deps_root</a>, <a href="#java_deps-java_deps_root_overrides">java_deps_root_overrides</a>, <a href="#java_deps-maven_name">maven_name</a>, <a href="#java_deps-target">target</a>, <a href="#java_deps-version_file">version_file</a>)
java_deps(<a href="#java_deps-name">name</a>, <a href="#java_deps-allowed_conflicting_jars">allowed_conflicting_jars</a>, <a href="#java_deps-ignore_missing_maven_name">ignore_missing_maven_name</a>, <a href="#java_deps-java_deps_root">java_deps_root</a>,
<a href="#java_deps-java_deps_root_overrides">java_deps_root_overrides</a>, <a href="#java_deps-maven_name">maven_name</a>, <a href="#java_deps-target">target</a>, <a href="#java_deps-version_file">version_file</a>)
</pre>

Packs Java library alongside with its dependencies into archive
Expand All @@ -381,13 +408,40 @@ Packs Java library alongside with its dependencies into archive
| Name | Description | Type | Mandatory | Default |
| :------------- | :------------- | :------------- | :------------- | :------------- |
| <a id="java_deps-name"></a>name | A unique name for this target. | <a href="https://bazel.build/concepts/labels#target-names">Name</a> | required | |
| <a id="java_deps-allowed_conflicting_jars"></a>allowed_conflicting_jars | List of allowed JAR names that can conflict (ie. the same JAR name produced by two different dependencies). | List of strings | optional | <code>[]</code> |
| <a id="java_deps-ignore_missing_maven_name"></a>ignore_missing_maven_name | Don't fail if bundling using maven names when encountering a target that is missing a maven name | Boolean | optional | <code>False</code> |
| <a id="java_deps-java_deps_root"></a>java_deps_root | Folder inside archive to put JARs into | String | optional | <code>""</code> |
| <a id="java_deps-java_deps_root_overrides"></a>java_deps_root_overrides | JARs with filenames matching the given patterns will be placed into the specified folders inside the archive, instead of the default folder. Patterns can be either the full name of a JAR, or a prefix followed by a '*'. | <a href="https://bazel.build/rules/lib/dict">Dictionary: String -> String</a> | optional | <code>{}</code> |
| <a id="java_deps-maven_name"></a>maven_name | Name JAR files inside archive based on Maven coordinates | Boolean | optional | <code>False</code> |
| <a id="java_deps-target"></a>target | Java target to pack into archive | <a href="https://bazel.build/concepts/labels">Label</a> | required | |
| <a id="java_deps-version_file"></a>version_file | File containing version string. Alternatively, pass --define version=VERSION to Bazel invocation. Not specifying version at all defaults to '0.0.0' | <a href="https://bazel.build/concepts/labels">Label</a> | optional | <code>None</code> |


<a id="sphinx_docs"></a>

## sphinx_docs

<pre>
sphinx_docs(<a href="#sphinx_docs-name">name</a>, <a href="#sphinx_docs-out">out</a>, <a href="#sphinx_docs-package_subdir">package_subdir</a>, <a href="#sphinx_docs-sphinx_conf">sphinx_conf</a>, <a href="#sphinx_docs-sphinx_rst">sphinx_rst</a>, <a href="#sphinx_docs-target">target</a>)
</pre>


Creates an HTML documentation for python module using Sphinx.

**ATTRIBUTES**


| Name | Description | Type | Mandatory | Default |
| :------------- | :------------- | :------------- | :------------- | :------------- |
| <a id="sphinx_docs-name"></a>name | A unique name for this target. | <a href="https://bazel.build/concepts/labels#target-names">Name</a> | required | |
| <a id="sphinx_docs-out"></a>out | Output directory | <a href="https://bazel.build/concepts/labels">Label</a> | required | |
| <a id="sphinx_docs-package_subdir"></a>package_subdir | Directory with the module files in the package archive | String | required | |
| <a id="sphinx_docs-sphinx_conf"></a>sphinx_conf | Configuration file for the Sphinx documentation builder | <a href="https://bazel.build/concepts/labels">Label</a> | required | |
| <a id="sphinx_docs-sphinx_rst"></a>sphinx_rst | Sphinx documentation master file for the package | <a href="https://bazel.build/concepts/labels">Label</a> | required | |
| <a id="sphinx_docs-target"></a>target | Package including .tar.gz archive | <a href="https://bazel.build/concepts/labels">Label</a> | required | |


<a id="tgz2zip"></a>

## tgz2zip
Expand Down
6 changes: 6 additions & 0 deletions WORKSPACE
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,12 @@ pip_deps()
load("@vaticle_bazel_distribution_pip//:requirements.bzl", "install_deps")
install_deps()

# Load //docs
load("//docs:python/deps.bzl", python_docs_deps = "deps")
python_docs_deps()
load("@vaticle_dependencies_tool_docs//:requirements.bzl", install_doc_deps = "install_deps")
install_doc_deps()

# TODO: remove this declaration once we upgrade to @io_bazel_stardoc with Bazel 5 support
# Load @bazel_skylib
http_archive(
Expand Down
6 changes: 6 additions & 0 deletions doc_hub.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,9 @@ load("//common/tgz2zip:rules.bzl", _tgz2zip = "tgz2zip")

load("//crates:rules.bzl", _assemble_crate = "assemble_crate", _deploy_crate = "deploy_crate")

load("//docs/cpp:rules.bzl", _doxygen_docs = "doxygen_docs")
load("//docs/python:rules.bzl", _sphinx_docs = "sphinx_docs")

load("//gcp:rules.bzl", _assemble_gcp = "assemble_gcp")

load('//github:rules.bzl', _deploy_github = "deploy_github")
Expand Down Expand Up @@ -94,6 +97,9 @@ tgz2zip = _tgz2zip
assemble_crate = _assemble_crate
deploy_crate = _deploy_crate

doxygen_docs = _doxygen_docs
sphinx_docs = _sphinx_docs

assemble_gcp = _assemble_gcp

deploy_github = _deploy_github
Expand Down
45 changes: 45 additions & 0 deletions docs/BUILD
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
#
# Copyright (C) 2022 Vaticle
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#

exports_files(["cpp/doxyfile.template"])

load("@bazel_skylib//:bzl_library.bzl", "bzl_library")
load("@vaticle_dependencies_tool_docs//:requirements.bzl", docs_requirement = "requirement")

py_binary(
name = "sphinx_runner",
srcs = [
"python/sphinx_html_builder.py",
],
main = "sphinx_html_builder.py",
deps = [docs_requirement("sphinx")],
visibility = ["//visibility:public"]
)

bzl_library(
name = "lib",
srcs = [
"cpp/rules.bzl",
"python/rules.bzl",
],
deps = [],
visibility = ["//visibility:public"],
)
100 changes: 100 additions & 0 deletions docs/cpp/doxyfile.template
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
# Doxyfile 1.9.8

# This file describes the settings to be used by the documentation system
# doxygen (www.doxygen.org) for a project.
#
# All text after a double hash (##) is considered a comment and is placed in
# front of the TAG it is preceding.
#
# All text after a single hash (#) is considered a comment and will be ignored.
# The format is:
# TAG = value [value, ...]
# For lists, items can also be appended using:
# TAG += value [value, ...]
# Values that contain spaces should be placed between quotes (\" \").
#---------------------------------------------------------------------------
# NOTE:
# This file has been cleaned up for doxygen doc generation via bazel
# To see all the options, generate a fresh one with
# `doxygen -g <output-path>`

#---------------------------------------------------------------------------
# Project related configuration options
#---------------------------------------------------------------------------
DOXYFILE_ENCODING = UTF-8
PROJECT_NAME = ##{{PROJECT_NAME}}
PROJECT_NUMBER = ##{{PROJECT_NUMBER}}
PROJECT_BRIEF = ##{{PROJECT_BRIEF}}
OUTPUT_DIRECTORY = ##{{OUTPUT_DIRECTORY}}
CREATE_SUBDIRS = NO
ALLOW_UNICODE_NAMES = NO
OUTPUT_LANGUAGE = English

BRIEF_MEMBER_DESC = YES
ALWAYS_DETAILED_SEC = YES
REPEAT_BRIEF = YES
STRIP_FROM_PATH = ##{{STRIP_FROM_PATH}}
INHERIT_DOCS = YES
INLINE_INHERITED_MEMB = NO

MARKDOWN_SUPPORT = YES
AUTOLINK_SUPPORT = YES
FILE_PATTERNS = *.h *.hpp *.md *.html
CASE_SENSE_NAMES = NO

#---------------------------------------------------------------------------
# Build related configuration options
#---------------------------------------------------------------------------
HIDE_FRIEND_COMPOUNDS = YES
SHOW_HEADERFILE = NO ## Show which header to include
SHOW_INCLUDE_FILES = NO
SORT_BRIEF_DOCS = NO ## NO: The short description at the top is in declaration order
SORT_MEMBER_DOCS = YES ## YES: The longer description which follows is sorted alphabetically
SORT_BY_SCOPE_NAME = NO

#---------------------------------------------------------------------------
# Configuration options related to warning and progress messages
#---------------------------------------------------------------------------
QUIET = NO
WARNINGS = YES
WARN_IF_UNDOCUMENTED = YES
WARN_IF_DOC_ERROR = YES
WARN_IF_INCOMPLETE_DOC = YES
WARN_NO_PARAMDOC = YES
WARN_IF_UNDOC_ENUM_VAL = YES
WARN_AS_ERROR = NO

#---------------------------------------------------------------------------
# Configuration options related to the input files
#---------------------------------------------------------------------------
INPUT = ##{{INPUT}}
INPUT_ENCODING = UTF-8
RECURSIVE = NO ## bazel explicitly specifies files
EXCLUDE_SYMLINKS = NO ## bazel needs NO
USE_MDFILE_AS_MAINPAGE = ##{{USE_MDFILE_AS_MAINPAGE}}
VERBATIM_HEADERS = YES

#---------------------------------------------------------------------------
# Configuration options related to the alphabetical class index
#---------------------------------------------------------------------------
ALPHABETICAL_INDEX = YES

#---------------------------------------------------------------------------
# Configuration options related to the HTML output
#---------------------------------------------------------------------------
GENERATE_HTML = YES
HTML_OUTPUT = html
HTML_FILE_EXTENSION = .html
HTML_COLORSTYLE = AUTO_LIGHT
ENUM_VALUES_PER_LINE = 4
OBFUSCATE_EMAILS = YES
SEARCHENGINE = YES

GENERATE_LATEX = NO

#---------------------------------------------------------------------------
# Configuration options related to diagram generator tools
#---------------------------------------------------------------------------
HIDE_UNDOC_RELATIONS = YES
CLASS_GRAPH = YES
HAVE_DOT = NO ## Disables many details
104 changes: 104 additions & 0 deletions docs/cpp/rules.bzl
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
#
# Copyright (C) 2022 Vaticle
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#

def _doxygen_docs_impl(ctx):
output_directory = ctx.actions.declare_directory(ctx.attr._output_directory)
files = []
for target in ctx.attr.sources:
files.extend(target.files.to_list())

replacements = {
"PROJECT_NAME": ctx.attr.project_name,
"PROJECT_NUMBER" : ctx.attr.version,
"PROJECT_BRIEF" : ctx.attr.desc,
"OUTPUT_DIRECTORY" : output_directory.path,
"STRIP_FROM_PATH": ctx.attr.strip_prefix,
}
if ctx.file.main_page_md != None:
files.append(ctx.file.main_page_md)
replacements["USE_MDFILE_AS_MAINPAGE"] = ctx.file.main_page_md.path

replacements["INPUT"] = " ".join([f.path for f in files])

# Prepare doxyfile
doxyfile = ctx.actions.declare_file("%s.doxyfile" % ctx.attr.name)
ctx.actions.expand_template(
template = ctx.file._doxyfile_template,
output = doxyfile,
substitutions = {"##{{%s}}"%k : replacements[k] for k in replacements}
)

files = [doxyfile] + files
print(doxyfile.path)
ctx.actions.run(
inputs = files,
outputs = [output_directory],
arguments = [doxyfile.path],
executable = "doxygen",
use_default_shell_env = True
)

return DefaultInfo(files = depset([output_directory]))

doxygen_docs = rule(
implementation = _doxygen_docs_impl,
test = False,
attrs = {
"project_name" : attr.string(
doc = "The project name for the doxygen docs",
mandatory = True,
),
"version" : attr.string(
doc = "The version of the project being documented",
default = ""
),
"desc" : attr.string(
doc = "A description for the project",
default = ""
),
"sources" : attr.label_list(
doc = "A list of files made available to doxygen. This is NOT automatically included in the doxyfile",
mandatory = True,
allow_files = True,
),
"strip_prefix" : attr.string(
doc = "Prefix to strip from path of files being processed",
default = ""
),
"main_page_md" : attr.label(
doc = "The file to use as main page for the generate docs",
allow_single_file = True,
mandatory = False
),
"_doxyfile_template" : attr.label(
allow_single_file = True,
default = "//docs:cpp/doxyfile.template"
),
"_output_directory" : attr.string(
doc = "The output directory for the doxygen docs",
default = "doxygen_docs"
)
},
doc = """
Creates HTML documentation for C++ projects using Doxygen.
This rule is not hermetic, and requires doxygen to be installed on the host.
"""
)
Loading

0 comments on commit c63720a

Please sign in to comment.