xref: /aosp_15_r20/external/pigweed/pw_docgen/docs.gni (revision 61c4878ac05f98d0ceed94b57d316916de578985)
1*61c4878aSAndroid Build Coastguard Worker# Copyright 2019 The Pigweed Authors
2*61c4878aSAndroid Build Coastguard Worker#
3*61c4878aSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); you may not
4*61c4878aSAndroid Build Coastguard Worker# use this file except in compliance with the License. You may obtain a copy of
5*61c4878aSAndroid Build Coastguard Worker# the License at
6*61c4878aSAndroid Build Coastguard Worker#
7*61c4878aSAndroid Build Coastguard Worker#     https://www.apache.org/licenses/LICENSE-2.0
8*61c4878aSAndroid Build Coastguard Worker#
9*61c4878aSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
10*61c4878aSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11*61c4878aSAndroid Build Coastguard Worker# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12*61c4878aSAndroid Build Coastguard Worker# License for the specific language governing permissions and limitations under
13*61c4878aSAndroid Build Coastguard Worker# the License.
14*61c4878aSAndroid Build Coastguard Worker
15*61c4878aSAndroid Build Coastguard Workerimport("//build_overrides/pigweed.gni")
16*61c4878aSAndroid Build Coastguard Worker
17*61c4878aSAndroid Build Coastguard Workerimport("$dir_pw_build/input_group.gni")
18*61c4878aSAndroid Build Coastguard Workerimport("$dir_pw_build/python_action.gni")
19*61c4878aSAndroid Build Coastguard Worker
20*61c4878aSAndroid Build Coastguard Workerdeclare_args() {
21*61c4878aSAndroid Build Coastguard Worker  # Whether or not the current target should build docs.
22*61c4878aSAndroid Build Coastguard Worker  pw_docgen_BUILD_DOCS = false
23*61c4878aSAndroid Build Coastguard Worker
24*61c4878aSAndroid Build Coastguard Worker  # Set to enable Google Analytics tracking of generated docs.
25*61c4878aSAndroid Build Coastguard Worker  pw_docgen_GOOGLE_ANALYTICS_ID = ""
26*61c4878aSAndroid Build Coastguard Worker
27*61c4878aSAndroid Build Coastguard Worker  # Set to define the number of parallel threads to use during the Sphinx build.
28*61c4878aSAndroid Build Coastguard Worker  pw_docgen_THREADS = ""
29*61c4878aSAndroid Build Coastguard Worker}
30*61c4878aSAndroid Build Coastguard Worker
31*61c4878aSAndroid Build Coastguard Worker# Defines a group of documentation files and assets.
32*61c4878aSAndroid Build Coastguard Worker#
33*61c4878aSAndroid Build Coastguard Worker# Args:
34*61c4878aSAndroid Build Coastguard Worker#   sources: Source files for the documentation (.rst or .md).
35*61c4878aSAndroid Build Coastguard Worker#   inputs: Additional resource files for the docs, such as images.
36*61c4878aSAndroid Build Coastguard Worker#   group_deps: Other pw_doc_group targets on which this group depends.
37*61c4878aSAndroid Build Coastguard Worker#   report_deps: Report card targets on which documentation depends.
38*61c4878aSAndroid Build Coastguard Worker#   other_deps: Dependencies on any other types of targets.
39*61c4878aSAndroid Build Coastguard Workertemplate("pw_doc_group") {
40*61c4878aSAndroid Build Coastguard Worker  assert(defined(invoker.sources) || defined(invoker.inputs),
41*61c4878aSAndroid Build Coastguard Worker         "pw_doc_group requires at least one of sources or inputs")
42*61c4878aSAndroid Build Coastguard Worker
43*61c4878aSAndroid Build Coastguard Worker  # Create a group containing the source and input files so that docs are
44*61c4878aSAndroid Build Coastguard Worker  # rebuilt on file modifications.
45*61c4878aSAndroid Build Coastguard Worker  pw_input_group(target_name) {
46*61c4878aSAndroid Build Coastguard Worker    _sources = []
47*61c4878aSAndroid Build Coastguard Worker    if (defined(invoker.sources)) {
48*61c4878aSAndroid Build Coastguard Worker      _sources = invoker.sources
49*61c4878aSAndroid Build Coastguard Worker    }
50*61c4878aSAndroid Build Coastguard Worker
51*61c4878aSAndroid Build Coastguard Worker    _inputs = []
52*61c4878aSAndroid Build Coastguard Worker    if (defined(invoker.inputs)) {
53*61c4878aSAndroid Build Coastguard Worker      _inputs = invoker.inputs
54*61c4878aSAndroid Build Coastguard Worker    }
55*61c4878aSAndroid Build Coastguard Worker
56*61c4878aSAndroid Build Coastguard Worker    metadata = {
57*61c4878aSAndroid Build Coastguard Worker      pw_doc_sources = rebase_path(_sources, root_build_dir)
58*61c4878aSAndroid Build Coastguard Worker      pw_doc_inputs = rebase_path(_inputs, root_build_dir)
59*61c4878aSAndroid Build Coastguard Worker    }
60*61c4878aSAndroid Build Coastguard Worker
61*61c4878aSAndroid Build Coastguard Worker    deps = []
62*61c4878aSAndroid Build Coastguard Worker    if (defined(invoker.group_deps)) {
63*61c4878aSAndroid Build Coastguard Worker      deps += invoker.group_deps
64*61c4878aSAndroid Build Coastguard Worker    }
65*61c4878aSAndroid Build Coastguard Worker    if (defined(invoker.report_deps)) {
66*61c4878aSAndroid Build Coastguard Worker      deps += invoker.report_deps
67*61c4878aSAndroid Build Coastguard Worker    }
68*61c4878aSAndroid Build Coastguard Worker    if (defined(invoker.other_deps)) {
69*61c4878aSAndroid Build Coastguard Worker      deps += invoker.other_deps
70*61c4878aSAndroid Build Coastguard Worker    }
71*61c4878aSAndroid Build Coastguard Worker
72*61c4878aSAndroid Build Coastguard Worker    inputs = _sources + _inputs
73*61c4878aSAndroid Build Coastguard Worker  }
74*61c4878aSAndroid Build Coastguard Worker}
75*61c4878aSAndroid Build Coastguard Worker
76*61c4878aSAndroid Build Coastguard Worker# Creates a target to build HTML documentation from groups of sources.
77*61c4878aSAndroid Build Coastguard Worker#
78*61c4878aSAndroid Build Coastguard Worker# Args:
79*61c4878aSAndroid Build Coastguard Worker#   deps: List of pw_doc_group targets.
80*61c4878aSAndroid Build Coastguard Worker#   python_deps: Additional Python package dependencies that must be
81*61c4878aSAndroid Build Coastguard Worker#                fully built before sphinx can run. This will set the
82*61c4878aSAndroid Build Coastguard Worker#                PYTHONPATH when sphinx is run so automodule,
83*61c4878aSAndroid Build Coastguard Worker#                autoclass or autofunction RST directives work for
84*61c4878aSAndroid Build Coastguard Worker#                in-tree pw_python_package targets.
85*61c4878aSAndroid Build Coastguard Worker#   python_metadata_deps: Python-related dependencies that are only
86*61c4878aSAndroid Build Coastguard Worker#                         used as deps for generating Python package
87*61c4878aSAndroid Build Coastguard Worker#                         metadata list, not the overall documentation
88*61c4878aSAndroid Build Coastguard Worker#                         generation. This only modifies PYTHONPATH so
89*61c4878aSAndroid Build Coastguard Worker#                         sphinx can import in-tree Python files. This
90*61c4878aSAndroid Build Coastguard Worker#                         should rarely be used by non-Pigweed code.
91*61c4878aSAndroid Build Coastguard Worker#   sources: Top-level documentation .rst source files.
92*61c4878aSAndroid Build Coastguard Worker#   conf: Configuration script (conf.py) for Sphinx.
93*61c4878aSAndroid Build Coastguard Worker#   output_directory: Path to directory to which HTML output is rendered.
94*61c4878aSAndroid Build Coastguard Workertemplate("pw_doc_gen") {
95*61c4878aSAndroid Build Coastguard Worker  assert(defined(invoker.deps),
96*61c4878aSAndroid Build Coastguard Worker         "pw_doc_gen requires doc groups as dependencies")
97*61c4878aSAndroid Build Coastguard Worker  assert(defined(invoker.sources) && invoker.sources != [],
98*61c4878aSAndroid Build Coastguard Worker         "pw_doc_gen requires a 'sources' list with at least one .rst source")
99*61c4878aSAndroid Build Coastguard Worker  assert(defined(invoker.conf),
100*61c4878aSAndroid Build Coastguard Worker         "pw_doc_gen requires a 'conf' argument pointing a top-level conf.py")
101*61c4878aSAndroid Build Coastguard Worker  assert(defined(invoker.output_directory),
102*61c4878aSAndroid Build Coastguard Worker         "pw_doc_gen requires an 'output_directory' argument")
103*61c4878aSAndroid Build Coastguard Worker
104*61c4878aSAndroid Build Coastguard Worker  if (pw_docgen_BUILD_DOCS) {
105*61c4878aSAndroid Build Coastguard Worker    # Collects all dependency metadata into a single JSON file.
106*61c4878aSAndroid Build Coastguard Worker    _metadata_file_target = "${target_name}_metadata"
107*61c4878aSAndroid Build Coastguard Worker    generated_file(_metadata_file_target) {
108*61c4878aSAndroid Build Coastguard Worker      outputs = [ "$target_gen_dir/$target_name.json" ]
109*61c4878aSAndroid Build Coastguard Worker      data_keys = [
110*61c4878aSAndroid Build Coastguard Worker        "pw_doc_sources",
111*61c4878aSAndroid Build Coastguard Worker        "pw_doc_inputs",
112*61c4878aSAndroid Build Coastguard Worker      ]
113*61c4878aSAndroid Build Coastguard Worker      output_conversion = "json"
114*61c4878aSAndroid Build Coastguard Worker      deps = invoker.deps
115*61c4878aSAndroid Build Coastguard Worker    }
116*61c4878aSAndroid Build Coastguard Worker
117*61c4878aSAndroid Build Coastguard Worker    pw_python_action(target_name) {
118*61c4878aSAndroid Build Coastguard Worker      module = "pw_docgen.docgen"
119*61c4878aSAndroid Build Coastguard Worker      args = [
120*61c4878aSAndroid Build Coastguard Worker        "--gn-root",
121*61c4878aSAndroid Build Coastguard Worker        rebase_path("//", root_build_dir),
122*61c4878aSAndroid Build Coastguard Worker        "--gn-gen-root",
123*61c4878aSAndroid Build Coastguard Worker        rebase_path(root_gen_dir, root_build_dir) + "/",
124*61c4878aSAndroid Build Coastguard Worker        "--sphinx-build-dir",
125*61c4878aSAndroid Build Coastguard Worker        rebase_path("$target_gen_dir/pw_docgen_tree", root_build_dir),
126*61c4878aSAndroid Build Coastguard Worker        "--conf",
127*61c4878aSAndroid Build Coastguard Worker        rebase_path(invoker.conf, root_build_dir),
128*61c4878aSAndroid Build Coastguard Worker        "--out-dir",
129*61c4878aSAndroid Build Coastguard Worker        rebase_path(invoker.output_directory, root_build_dir),
130*61c4878aSAndroid Build Coastguard Worker      ]
131*61c4878aSAndroid Build Coastguard Worker
132*61c4878aSAndroid Build Coastguard Worker      # Enable Google Analytics if a measurement ID is provided
133*61c4878aSAndroid Build Coastguard Worker      if (pw_docgen_GOOGLE_ANALYTICS_ID != "") {
134*61c4878aSAndroid Build Coastguard Worker        args += [
135*61c4878aSAndroid Build Coastguard Worker          "--google-analytics-id",
136*61c4878aSAndroid Build Coastguard Worker          pw_docgen_GOOGLE_ANALYTICS_ID,
137*61c4878aSAndroid Build Coastguard Worker        ]
138*61c4878aSAndroid Build Coastguard Worker      }
139*61c4878aSAndroid Build Coastguard Worker
140*61c4878aSAndroid Build Coastguard Worker      # Override the default number of threads for the Sphinx build.
141*61c4878aSAndroid Build Coastguard Worker      if (pw_docgen_THREADS != "") {
142*61c4878aSAndroid Build Coastguard Worker        args += [
143*61c4878aSAndroid Build Coastguard Worker          "-j",
144*61c4878aSAndroid Build Coastguard Worker          pw_docgen_THREADS,
145*61c4878aSAndroid Build Coastguard Worker        ]
146*61c4878aSAndroid Build Coastguard Worker      }
147*61c4878aSAndroid Build Coastguard Worker
148*61c4878aSAndroid Build Coastguard Worker      # Metadata JSON file path.
149*61c4878aSAndroid Build Coastguard Worker      args += [ "--metadata" ] +
150*61c4878aSAndroid Build Coastguard Worker              rebase_path(get_target_outputs(":$_metadata_file_target"),
151*61c4878aSAndroid Build Coastguard Worker                          root_build_dir)
152*61c4878aSAndroid Build Coastguard Worker
153*61c4878aSAndroid Build Coastguard Worker      args += rebase_path(invoker.sources, root_build_dir)
154*61c4878aSAndroid Build Coastguard Worker
155*61c4878aSAndroid Build Coastguard Worker      python_deps = [ "$dir_pw_docgen/py" ]
156*61c4878aSAndroid Build Coastguard Worker      deps = [ ":$_metadata_file_target" ]
157*61c4878aSAndroid Build Coastguard Worker
158*61c4878aSAndroid Build Coastguard Worker      # Additional Python deps that may be required for sphinx to run
159*61c4878aSAndroid Build Coastguard Worker      # successfully. These deps will be fully built.
160*61c4878aSAndroid Build Coastguard Worker      if (defined(invoker.python_deps)) {
161*61c4878aSAndroid Build Coastguard Worker        python_deps += invoker.python_deps
162*61c4878aSAndroid Build Coastguard Worker      }
163*61c4878aSAndroid Build Coastguard Worker
164*61c4878aSAndroid Build Coastguard Worker      # Required to set the PYTHONPATH for any automodule, autoclass,
165*61c4878aSAndroid Build Coastguard Worker      # and autofunction RST directives. These deps will have their
166*61c4878aSAndroid Build Coastguard Worker      # in-tree directories added to PYTHONPATH only. They will not be
167*61c4878aSAndroid Build Coastguard Worker      # generated or built in the out directory first.
168*61c4878aSAndroid Build Coastguard Worker      python_metadata_deps = [ "$dir_pw_docgen/py" ]
169*61c4878aSAndroid Build Coastguard Worker      if (defined(invoker.python_metadata_deps)) {
170*61c4878aSAndroid Build Coastguard Worker        python_metadata_deps += invoker.python_metadata_deps
171*61c4878aSAndroid Build Coastguard Worker      }
172*61c4878aSAndroid Build Coastguard Worker
173*61c4878aSAndroid Build Coastguard Worker      inputs = [ invoker.conf ] + invoker.sources
174*61c4878aSAndroid Build Coastguard Worker      stamp = true
175*61c4878aSAndroid Build Coastguard Worker    }
176*61c4878aSAndroid Build Coastguard Worker  } else {
177*61c4878aSAndroid Build Coastguard Worker    group(target_name) {
178*61c4878aSAndroid Build Coastguard Worker    }
179*61c4878aSAndroid Build Coastguard Worker  }
180*61c4878aSAndroid Build Coastguard Worker}
181