blob: 7f3b3fc011e563fc25b04e46a6f3529c12faf4a9 [file] [log] [blame]
# Copyright 2019 The Pigweed Authors
#
# Licensed 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
#
# https://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.
import("//build_overrides/pigweed.gni")
import("$dir_pw_build/input_group.gni")
import("$dir_pw_build/python_action.gni")
declare_args() {
# Whether or not the current target should build docs.
pw_docgen_BUILD_DOCS = false
# Set to enable Google Analytics tracking of generated docs.
pw_docgen_GOOGLE_ANALYTICS_ID = ""
}
# Defines a group of documentation files and assets.
#
# Args:
# sources: Source files for the documentation (.rst or .md).
# inputs: Additional resource files for the docs, such as images.
# group_deps: Other pw_doc_group targets on which this group depends.
# report_deps: Report card targets on which documentation depends.
# other_deps: Dependencies on any other types of targets.
template("pw_doc_group") {
assert(defined(invoker.sources) || defined(invoker.inputs),
"pw_doc_group requires at least one of sources or inputs")
# Create a group containing the source and input files so that docs are
# rebuilt on file modifications.
pw_input_group(target_name) {
_sources = []
if (defined(invoker.sources)) {
_sources = invoker.sources
}
_inputs = []
if (defined(invoker.inputs)) {
_inputs = invoker.inputs
}
metadata = {
pw_doc_sources = rebase_path(_sources, root_build_dir)
pw_doc_inputs = rebase_path(_inputs, root_build_dir)
}
deps = []
if (defined(invoker.group_deps)) {
deps += invoker.group_deps
}
if (defined(invoker.report_deps)) {
deps += invoker.report_deps
}
if (defined(invoker.other_deps)) {
deps += invoker.other_deps
}
inputs = _sources + _inputs
}
}
# Creates a target to build HTML documentation from groups of sources.
#
# Args:
# deps: List of pw_doc_group targets.
# python_metadata_deps: Python-related dependencies that are only used as deps
# for generating Python package metadata list, not the
# overall documentation generation. This should rarely
# be used by non-Pigweed code.
# sources: Top-level documentation .rst source files.
# conf: Configuration script (conf.py) for Sphinx.
# output_directory: Path to directory to which HTML output is rendered.
template("pw_doc_gen") {
assert(defined(invoker.deps),
"pw_doc_gen requires doc groups as dependencies")
assert(defined(invoker.sources) && invoker.sources != [],
"pw_doc_gen requires a 'sources' list with at least one .rst source")
assert(defined(invoker.conf),
"pw_doc_gen requires a 'conf' argument pointing a top-level conf.py")
assert(defined(invoker.output_directory),
"pw_doc_gen requires an 'output_directory' argument")
if (pw_docgen_BUILD_DOCS) {
# Collects all dependency metadata into a single JSON file.
_metadata_file_target = "${target_name}_metadata"
generated_file(_metadata_file_target) {
outputs = [ "$target_gen_dir/$target_name.json" ]
data_keys = [
"pw_doc_sources",
"pw_doc_inputs",
]
output_conversion = "json"
deps = invoker.deps
}
pw_python_action(target_name) {
module = "pw_docgen.docgen"
args = [
"--gn-root",
rebase_path("//", root_build_dir),
"--gn-gen-root",
rebase_path(root_gen_dir, root_build_dir) + "/",
"--sphinx-build-dir",
rebase_path("$target_gen_dir/pw_docgen_tree", root_build_dir),
"--conf",
rebase_path(invoker.conf, root_build_dir),
"--out-dir",
rebase_path(invoker.output_directory, root_build_dir),
]
# Enable Google Analytics if a measurement ID is provided
if (pw_docgen_GOOGLE_ANALYTICS_ID != "") {
args += [
"--google-analytics-id",
pw_docgen_GOOGLE_ANALYTICS_ID,
]
}
# Metadata JSON file path.
args += [ "--metadata" ] +
rebase_path(get_target_outputs(":$_metadata_file_target"),
root_build_dir)
args += rebase_path(invoker.sources, root_build_dir)
python_deps = [ "$dir_pw_docgen/py" ]
deps = [ ":$_metadata_file_target" ]
# Required to set the PYTHONPATH for any automodule/class/function RST
# directives.
python_metadata_deps = [ "$dir_pw_docgen/py" ]
if (defined(invoker.python_metadata_deps)) {
python_metadata_deps += invoker.python_metadata_deps
}
inputs = [ invoker.conf ] + invoker.sources
stamp = true
}
} else {
group(target_name) {
}
}
}