xref: /aosp_15_r20/external/libaom/docs.cmake (revision 77c1e3ccc04c968bd2bc212e87364f250e820521)
1#
2# Copyright (c) 2017, Alliance for Open Media. All rights reserved.
3#
4# This source code is subject to the terms of the BSD 2 Clause License and the
5# Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License was
6# not distributed with this source code in the LICENSE file, you can obtain it
7# at www.aomedia.org/license/software. If the Alliance for Open Media Patent
8# License 1.0 was not distributed with this source code in the PATENTS file, you
9# can obtain it at www.aomedia.org/license/patent.
10#
11if(AOM_DOCS_CMAKE_)
12  return()
13endif() # AOM_DOCS_CMAKE_
14set(AOM_DOCS_CMAKE_ 1)
15
16cmake_minimum_required(VERSION 3.5)
17
18set(AOM_DOXYFILE "${AOM_CONFIG_DIR}/doxyfile")
19set(AOM_DOXYGEN_CONFIG_TEMPLATE "libs.doxy_template")
20set(AOM_DOXYGEN_OUTPUT_DIR "${AOM_CONFIG_DIR}/dox")
21set(AOM_DOXYGEN_SECTIONS "av1")
22
23set(AOM_DOXYGEN_SOURCES
24    "${AOM_ROOT}/aom/aom.h"
25    "${AOM_ROOT}/aom/aom_codec.h"
26    "${AOM_ROOT}/aom/aom_decoder.h"
27    "${AOM_ROOT}/aom/aom_encoder.h"
28    "${AOM_ROOT}/aom/aom_external_partition.h"
29    "${AOM_ROOT}/aom/aom_frame_buffer.h"
30    "${AOM_ROOT}/aom/aom_image.h"
31    "${AOM_ROOT}/aom/aom_integer.h"
32    "${AOM_ROOT}/av1/common/av1_common_int.h"
33    "${AOM_ROOT}/av1/common/av1_loopfilter.h"
34    "${AOM_ROOT}/av1/common/blockd.h"
35    "${AOM_ROOT}/av1/common/cdef.h"
36    "${AOM_ROOT}/av1/common/enums.h"
37    "${AOM_ROOT}/av1/common/restoration.h"
38    "${AOM_ROOT}/keywords.dox"
39    "${AOM_ROOT}/mainpage.dox"
40    "${AOM_ROOT}/usage.dox")
41
42if(CONFIG_AV1_DECODER)
43  set(AOM_DOXYGEN_EXAMPLE_SOURCES ${AOM_DOXYGEN_EXAMPLE_SOURCES}
44                                  "${AOM_ROOT}/apps/aomdec.c"
45                                  "${AOM_ROOT}/examples/decode_to_md5.c"
46                                  "${AOM_ROOT}/examples/decode_with_drops.c"
47                                  "${AOM_ROOT}/examples/simple_decoder.c")
48
49  set(AOM_DOXYGEN_EXAMPLE_DESCRIPTIONS ${AOM_DOXYGEN_EXAMPLE_DESCRIPTIONS}
50                                       "Full featured decoder."
51                                       "Frame by frame MD5 checksum."
52                                       "Drops frames while decoding."
53                                       "Simplified decoder loop.")
54
55  set(AOM_DOXYGEN_SECTIONS ${AOM_DOXYGEN_SECTIONS} "av1_decoder decoder")
56
57  set(AOM_DOXYGEN_SOURCES ${AOM_DOXYGEN_SOURCES} "${AOM_ROOT}/aom/aomdx.h"
58                          "${AOM_ROOT}/usage_dx.dox"
59                          "${AOM_ROOT}/av1/decoder/decoder.h")
60
61  if(CONFIG_ANALYZER)
62    set(AOM_DOXYGEN_EXAMPLE_SOURCES ${AOM_DOXYGEN_EXAMPLE_SOURCES}
63                                    "${AOM_ROOT}/examples/analyzer.cc")
64
65    set(AOM_DOXYGEN_EXAMPLE_DESCRIPTIONS ${AOM_DOXYGEN_EXAMPLE_DESCRIPTIONS}
66                                         "Bitstream analyzer.")
67  endif()
68
69  if(CONFIG_INSPECTION)
70    set(AOM_DOXYGEN_EXAMPLE_SOURCES ${AOM_DOXYGEN_EXAMPLE_SOURCES}
71                                    "${AOM_ROOT}/examples/inspect.c")
72
73    set(AOM_DOXYGEN_EXAMPLE_DESCRIPTIONS ${AOM_DOXYGEN_EXAMPLE_DESCRIPTIONS}
74                                         "Bitstream inspector.")
75  endif()
76
77  set(AOM_DOXYGEN_SOURCES ${AOM_DOXYGEN_SOURCES}
78                          "${AOM_ROOT}/doc/dev_guide/av1_decoder.dox")
79endif()
80
81if(CONFIG_AV1_ENCODER)
82  set(AOM_DOXYGEN_EXAMPLE_SOURCES ${AOM_DOXYGEN_EXAMPLE_SOURCES}
83                                  "${AOM_ROOT}/apps/aomenc.c"
84                                  "${AOM_ROOT}/examples/lossless_encoder.c"
85                                  "${AOM_ROOT}/examples/set_maps.c"
86                                  "${AOM_ROOT}/examples/simple_encoder.c"
87                                  "${AOM_ROOT}/examples/twopass_encoder.c")
88
89  set(AOM_DOXYGEN_EXAMPLE_DESCRIPTIONS ${AOM_DOXYGEN_EXAMPLE_DESCRIPTIONS}
90                                       "Full featured encoder."
91                                       "Simplified lossless encoder."
92                                       "Set active and ROI maps."
93                                       "Simplified encoder loop."
94                                       "Two-pass encoder loop.")
95
96  set(AOM_DOXYGEN_EXAMPLE_SOURCES ${AOM_DOXYGEN_EXAMPLE_SOURCES}
97                                  "${AOM_ROOT}/examples/scalable_encoder.c")
98
99  set(AOM_DOXYGEN_EXAMPLE_DESCRIPTIONS ${AOM_DOXYGEN_EXAMPLE_DESCRIPTIONS}
100                                       "Scalable encoder loop.")
101
102  set(AOM_DOXYGEN_EXAMPLE_SOURCES ${AOM_DOXYGEN_EXAMPLE_SOURCES}
103                                  "${AOM_ROOT}/examples/svc_encoder_rtc.cc")
104
105  set(AOM_DOXYGEN_EXAMPLE_DESCRIPTIONS ${AOM_DOXYGEN_EXAMPLE_DESCRIPTIONS}
106                                       "Layered encoder for RTC.")
107
108  set(AOM_DOXYGEN_SECTIONS ${AOM_DOXYGEN_SECTIONS} "av1_encoder encoder")
109
110  set(AOM_DOXYGEN_SOURCES ${AOM_DOXYGEN_SOURCES} "${AOM_ROOT}/aom/aomcx.h"
111                          "${AOM_ROOT}/usage_cx.dox")
112  set(AOM_DOXYGEN_SOURCES ${AOM_DOXYGEN_SOURCES}
113                          "${AOM_ROOT}/doc/dev_guide/av1_encoder.dox")
114  set(AOM_DOXYGEN_SOURCES
115      ${AOM_DOXYGEN_SOURCES}
116      "${AOM_ROOT}/aom_scale/yv12config.h"
117      "${AOM_ROOT}/av1/encoder/bitstream.h"
118      "${AOM_ROOT}/av1/encoder/block.h"
119      "${AOM_ROOT}/av1/encoder/aq_cyclicrefresh.h"
120      "${AOM_ROOT}/av1/encoder/encode_strategy.c"
121      "${AOM_ROOT}/av1/encoder/encode_strategy.h"
122      "${AOM_ROOT}/av1/encoder/encodeframe.c"
123      "${AOM_ROOT}/av1/encoder/encoder.c"
124      "${AOM_ROOT}/av1/encoder/encoder.h"
125      "${AOM_ROOT}/av1/encoder/encodetxb.h"
126      "${AOM_ROOT}/av1/encoder/firstpass.h"
127      "${AOM_ROOT}/av1/encoder/gop_structure.h"
128      "${AOM_ROOT}/av1/encoder/interp_search.c"
129      "${AOM_ROOT}/av1/encoder/intra_mode_search.h"
130      "${AOM_ROOT}/av1/encoder/intra_mode_search.c"
131      "${AOM_ROOT}/av1/encoder/intra_mode_search_utils.h"
132      "${AOM_ROOT}/av1/encoder/lookahead.h"
133      "${AOM_ROOT}/av1/encoder/palette.h"
134      "${AOM_ROOT}/av1/encoder/palette.c"
135      "${AOM_ROOT}/av1/encoder/partition_search.h"
136      "${AOM_ROOT}/av1/encoder/partition_search.c"
137      "${AOM_ROOT}/av1/encoder/pass2_strategy.h"
138      "${AOM_ROOT}/av1/encoder/pass2_strategy.c"
139      "${AOM_ROOT}/av1/encoder/pickcdef.h"
140      "${AOM_ROOT}/av1/encoder/picklpf.h"
141      "${AOM_ROOT}/av1/encoder/pickrst.h"
142      "${AOM_ROOT}/av1/encoder/ratectrl.c"
143      "${AOM_ROOT}/av1/encoder/ratectrl.h"
144      "${AOM_ROOT}/av1/encoder/rc_utils.h"
145      "${AOM_ROOT}/av1/encoder/rdopt.h"
146      "${AOM_ROOT}/av1/encoder/rdopt.c"
147      "${AOM_ROOT}/av1/encoder/speed_features.h"
148      "${AOM_ROOT}/av1/encoder/svc_layercontext.c"
149      "${AOM_ROOT}/av1/encoder/svc_layercontext.h"
150      "${AOM_ROOT}/av1/encoder/temporal_filter.h"
151      "${AOM_ROOT}/av1/encoder/temporal_filter.c"
152      "${AOM_ROOT}/av1/encoder/tpl_model.h"
153      "${AOM_ROOT}/av1/encoder/tx_search.h"
154      "${AOM_ROOT}/av1/encoder/txb_rdopt.h"
155      "${AOM_ROOT}/av1/encoder/var_based_part.h"
156      "${AOM_ROOT}/av1/encoder/nonrd_opt.h"
157      "${AOM_ROOT}/av1/encoder/nonrd_pickmode.c")
158endif()
159
160if(CONFIG_AV1_DECODER AND CONFIG_AV1_ENCODER)
161  set(AOM_DOXYGEN_EXAMPLE_SOURCES ${AOM_DOXYGEN_EXAMPLE_SOURCES}
162                                  "${AOM_ROOT}/examples/aom_cx_set_ref.c")
163
164  set(AOM_DOXYGEN_EXAMPLE_DESCRIPTIONS ${AOM_DOXYGEN_EXAMPLE_DESCRIPTIONS}
165                                       "Set encoder reference frame.")
166endif()
167
168if(CONFIG_AV1_ENCODER)
169  set(AOM_DOXYGEN_EXAMPLE_SOURCES ${AOM_DOXYGEN_EXAMPLE_SOURCES}
170                                  "${AOM_ROOT}/examples/lightfield_encoder.c")
171
172  set(AOM_DOXYGEN_EXAMPLE_DESCRIPTIONS ${AOM_DOXYGEN_EXAMPLE_DESCRIPTIONS}
173                                       "Lightfield encoder example.")
174endif()
175
176if(CONFIG_AV1_DECODER)
177  set(AOM_DOXYGEN_EXAMPLE_SOURCES
178      ${AOM_DOXYGEN_EXAMPLE_SOURCES}
179      "${AOM_ROOT}/examples/lightfield_tile_list_decoder.c")
180
181  set(AOM_DOXYGEN_EXAMPLE_DESCRIPTIONS ${AOM_DOXYGEN_EXAMPLE_DESCRIPTIONS}
182                                       "Lightfield tile list decoder example.")
183endif()
184
185if(CONFIG_AV1_DECODER)
186  set(AOM_DOXYGEN_EXAMPLE_SOURCES ${AOM_DOXYGEN_EXAMPLE_SOURCES}
187                                  "${AOM_ROOT}/examples/lightfield_decoder.c")
188
189  set(AOM_DOXYGEN_EXAMPLE_DESCRIPTIONS ${AOM_DOXYGEN_EXAMPLE_DESCRIPTIONS}
190                                       "Lightfield decoder example.")
191endif()
192
193if(CONFIG_AV1_DECODER AND CONFIG_AV1_ENCODER)
194  set(AOM_DOXYGEN_EXAMPLE_SOURCES
195      ${AOM_DOXYGEN_EXAMPLE_SOURCES}
196      "${AOM_ROOT}/examples/lightfield_bitstream_parsing.c")
197
198  set(AOM_DOXYGEN_EXAMPLE_DESCRIPTIONS ${AOM_DOXYGEN_EXAMPLE_DESCRIPTIONS}
199                                       "Lightfield bitstream parsing example.")
200endif()
201
202# Iterates over list named by $list_name and appends each item to $AOM_DOXYFILE
203# as values assigned to $var_name with no line breaks between list items.
204# Appends a new line after the entire config variable is expanded.
205function(write_cmake_list_to_doxygen_config_var var_name list_name)
206  unset(output_string)
207  foreach(list_item ${${list_name}})
208    set(output_string "${output_string} ${list_item} ")
209  endforeach()
210  string(STRIP "${output_string}" output_string)
211  file(APPEND "${AOM_DOXYFILE}" "${var_name} += ${output_string}\n")
212endfunction()
213
214function(get_name file_path name_var)
215  get_filename_component(file_basename ${file_path} NAME)
216  get_filename_component(${name_var} ${file_basename} NAME_WE)
217  set(${name_var} ${${name_var}} PARENT_SCOPE)
218endfunction()
219
220function(setup_documentation_targets)
221
222  # Sanity check: the lengths of these lists must match.
223  list(LENGTH AOM_DOXYGEN_EXAMPLE_SOURCES num_sources)
224  list(LENGTH AOM_DOXYGEN_EXAMPLE_DESCRIPTIONS num_descs)
225  if(NOT ${num_sources} EQUAL ${num_descs})
226    message(FATAL_ERROR "Unequal example and description totals.")
227  endif()
228
229  # Take the list of examples and produce example_basename.dox for each file in
230  # the list.
231  file(MAKE_DIRECTORY "${AOM_DOXYGEN_OUTPUT_DIR}")
232  foreach(example_file ${AOM_DOXYGEN_EXAMPLE_SOURCES})
233    unset(example_basename)
234    get_name("${example_file}" "example_name")
235    set(example_dox "${AOM_DOXYGEN_OUTPUT_DIR}/${example_name}.dox")
236    set(dox_string "/*!\\page example_${example_name} ${example_name}\n")
237    set(dox_string "${dox_string} \\includelineno ${example_file}\n*/\n")
238    file(WRITE "${example_dox}" ${dox_string})
239    set(AOM_DOXYGEN_SOURCES ${AOM_DOXYGEN_SOURCES} "${example_dox}")
240  endforeach()
241
242  # Generate samples.dox, an index page that refers to the example_basename.dox
243  # files that were just created.
244  set(samples_header "
245/*!\\page samples Sample Code
246This SDK includes a number of sample applications. Each sample documents a
247feature of the SDK in both prose and the associated C code. The following
248samples are included:
249")
250
251  set(utils_desc "
252In addition, the SDK contains a number of utilities. Since these utilities are
253built upon the concepts described in the sample code listed above, they are not
254documented in pieces like the samples are. Their source is included here for
255reference. The following utilities are included:
256")
257
258  # Write the description for the samples section.
259  set(samples_dox "${AOM_CONFIG_DIR}/samples.dox")
260  file(WRITE "${samples_dox}" "${samples_header}\n")
261
262  # Iterate over $AOM_DOXYGEN_EXAMPLE_SOURCES and
263  # $AOM_DOXYGEN_EXAMPLE_DESCRIPTIONS and massage example names as required by
264  # AV1's doxygen setup.
265  math(EXPR max_example_index "${num_sources} - 1")
266  foreach(NUM RANGE ${max_example_index})
267    list(GET AOM_DOXYGEN_EXAMPLE_SOURCES ${NUM} ex_name)
268    get_name("${ex_name}" "ex_name")
269
270    # AV1's doxygen lists aomdec and aomenc as utils apart from the examples.
271    # Save the indexes for another pass.
272    if("${ex_name}" MATCHES "aomdec\|aomenc")
273      set(util_indexes "${util_indexes}" "${NUM}")
274      continue()
275    endif()
276    list(GET AOM_DOXYGEN_EXAMPLE_DESCRIPTIONS ${NUM} ex_desc)
277    file(APPEND "${samples_dox}" " - \\subpage example_${ex_name} ${ex_desc}\n")
278  endforeach()
279
280  # Write the description and index for the utils.
281  file(APPEND "${samples_dox}" "${utils_desc}\n")
282  foreach(util_index ${util_indexes})
283    list(GET AOM_DOXYGEN_EXAMPLE_SOURCES ${util_index} ex_name)
284    get_name("${ex_name}" "ex_name")
285    list(GET AOM_DOXYGEN_EXAMPLE_DESCRIPTIONS ${util_index} ex_desc)
286    file(APPEND "${samples_dox}" " - \\subpage example_${ex_name} ${ex_desc}\n")
287  endforeach()
288  file(APPEND "${samples_dox}" "*/")
289
290  # Add $samples_dox to the doxygen inputs.
291  get_filename_component(samples_dox ${samples_dox} NAME)
292  set(AOM_DOXYGEN_SOURCES ${AOM_DOXYGEN_SOURCES} ${samples_dox})
293
294  # There are issues to show Markdown file for old Doxygen version. Here, only
295  # enable Markdown support for 1.8.16 or newer.
296  if(${DOXYGEN_VERSION_VALUE} GREATER_EQUAL 1008016)
297    set(AOM_DOXYGEN_SECTIONS ${AOM_DOXYGEN_SECTIONS} "av1_md_support")
298    set(AOM_DOXYGEN_SOURCES ${AOM_DOXYGEN_SOURCES} "${AOM_ROOT}/README.md")
299    # Uncomment and add AlgorithmDescription.md in result page when it is done.
300    # set(AOM_DOXYGEN_SOURCES ${AOM_DOXYGEN_SOURCES}
301    # "${AOM_ROOT}/doc/AlgorithmDescription.md")
302  endif()
303
304  # Generate libaom's doxyfile.
305  file(WRITE "${AOM_DOXYFILE}" "##\n## GENERATED FILE. DO NOT EDIT\n##\n")
306  file(READ "${AOM_ROOT}/${AOM_DOXYGEN_CONFIG_TEMPLATE}" doxygen_template_data)
307  file(APPEND "${AOM_DOXYFILE}" ${doxygen_template_data})
308  file(APPEND "${AOM_DOXYFILE}"
309       "EXAMPLE_PATH += ${AOM_ROOT} ${AOM_ROOT}/examples\n")
310  file(APPEND "${AOM_DOXYFILE}"
311       "INCLUDE_PATH += ${AOM_CONFIG_DIR} ${AOM_ROOT}\n")
312  file(APPEND "${AOM_DOXYFILE}"
313       "STRIP_FROM_PATH += ${AOM_ROOT} ${AOM_CONFIG_DIR}\n")
314  write_cmake_list_to_doxygen_config_var("INPUT" "AOM_DOXYGEN_SOURCES")
315  write_cmake_list_to_doxygen_config_var("ENABLED_SECTIONS"
316                                         "AOM_DOXYGEN_SECTIONS")
317
318  # Add AOMedia logo.
319  set(aom_logo "aomedia_logo_200.png")
320  configure_file(${AOM_ROOT}/${aom_logo} ${AOM_CONFIG_DIR}/${aom_logo} COPYONLY)
321  file(APPEND "${AOM_DOXYFILE}"
322       "PROJECT_LOGO = ${AOM_CONFIG_DIR}/${aom_logo}\n")
323
324  # Only set HAVE_DOT to YES if dot tool is found.
325  if(DOXYGEN_DOT_FOUND)
326    file(APPEND "${AOM_DOXYFILE}" "HAVE_DOT = YES\n")
327    file(APPEND "${AOM_DOXYFILE}" "DOT_GRAPH_MAX_NODES = 10000\n")
328  endif()
329
330  # Add image path.
331  file(APPEND "${AOM_DOXYFILE}" "IMAGE_PATH += ${AOM_ROOT}/doc/dev_guide\n")
332
333  # Allow banner style comments
334  file(APPEND "${AOM_DOXYFILE}" "JAVADOC_BANNER = YES")
335
336  # Add the doxygen generation rule.
337  add_custom_target(docs ALL
338                    COMMAND "${DOXYGEN_EXECUTABLE}" "${AOM_DOXYFILE}"
339                    DEPENDS "${AOM_DOXYFILE}" ${AOM_DOXYGEN_SOURCES}
340                            ${AOM_DOXYGEN_EXAMPLE_SOURCES}
341                            "${AOM_DOXYGEN_CONFIG_TEMPLATE}"
342                    SOURCES "${AOM_DOXYFILE}" ${AOM_DOXYGEN_SOURCES}
343                            ${AOM_DOXYGEN_EXAMPLE_SOURCES}
344                            "${AOM_DOXYGEN_CONFIG_TEMPLATE}")
345endfunction()
346