summaryrefslogtreecommitdiff
path: root/Documentation/meson.build
blob: 54788d6db47eb0373db13ce7b3f0909ef5715ea8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
# SPDX-License-Identifier: CC0-1.0

doc_install_dir = get_option('datadir') / 'doc' / 'libcamera-@0@'.format(libcamera_version)

#
# Doxygen
#

doxygen = find_program('doxygen', required : get_option('documentation'))
dot = find_program('dot', required : get_option('documentation'))

if doxygen.found() and dot.found()
    cdata = configuration_data()
    cdata.set('VERSION', 'v@0@'.format(libcamera_git_version))
    cdata.set('TOP_SRCDIR', meson.project_source_root())
    cdata.set('TOP_BUILDDIR', meson.project_build_root())
    cdata.set('OUTPUT_DIR', meson.current_build_dir())
    cdata.set('WARN_AS_ERROR', get_option('doc_werror') ? 'YES' : 'NO')

    doxygen_predefined = []
    foreach key : config_h.keys()
        doxygen_predefined += '@0@=@1@'.format(key, config_h.get(key))
    endforeach

    cdata.set('PREDEFINED', ' \\\n\t\t\t '.join(doxygen_predefined))

    doxyfile_common = configure_file(input : 'Doxyfile-common.in',
                                     output : 'Doxyfile-common',
                                     configuration : cdata)

    doxygen_public_input = [
        libcamera_base_public_headers,
        libcamera_base_public_sources,
        libcamera_public_headers,
        libcamera_public_sources,
    ]

    doxygen_internal_input = [
        libcamera_base_private_headers,
        libcamera_base_internal_sources,
        libcamera_internal_headers,
        libcamera_internal_sources,
        libcamera_ipa_headers,
        libcamera_ipa_interfaces,
        libipa_headers,
        libipa_sources,
    ]

    if is_variable('ipu3_ipa_sources')
        doxygen_internal_input += [ipu3_ipa_sources]
    endif

    # We run doxygen twice - the first run excludes internal API objects as it
    # is intended to document the public API only. A second run covers all of
    # the library's objects for libcamera developers. Common configuration is
    # set in an initially generated Doxyfile, which is then included by the two
    # final Doxyfiles.

    # This is the "public" run of doxygen generating an abridged version of the
    # API's documentation.

    doxyfile_tmpl = configure_file(input : 'Doxyfile-public.in',
                                   output : 'Doxyfile-public.tmpl',
                                   configuration : cdata)

    # The set of public input files stored in the doxygen_public_input array
    # needs to be set in Doxyfile public. We can't pass them through cdata
    # cdata, as some of the array members are custom_tgt instances, which
    # configuration_data.set() doesn't support. Using a separate script invoked
    # through custom_target(), which supports custom_tgt instances as inputs.

    doxyfile = custom_target('doxyfile-public',
                             input : [
                                 doxygen_public_input,
                             ],
                             output : 'Doxyfile-public',
                             command : [
                                 'gen-doxyfile.py',
                                 '-o', '@OUTPUT@',
                                 doxyfile_tmpl,
                                 '@INPUT@',
                             ])

    custom_target('doxygen-public',
                  input : [
                      doxyfile,
                      doxyfile_common,
                  ],
                  output : 'api-html',
                  command : [doxygen, doxyfile],
                  install : true,
                  install_dir : doc_install_dir,
                  install_tag : 'doc')

    # This is the internal documentation, which hard-codes a list of directories
    # to parse in its doxyfile.

    doxyfile = configure_file(input : 'Doxyfile-internal.in',
                              output : 'Doxyfile-internal',
                              configuration : cdata)

    custom_target('doxygen-internal',
                  input : [
                      doxyfile,
                      doxyfile_common,
                      doxygen_internal_input,
                  ],
                  output : 'internal-api-html',
                  command : [doxygen, doxyfile],
                  install : true,
                  install_dir : doc_install_dir,
                  install_tag : 'doc-internal')
endif

#
# Sphinx
#

sphinx = find_program('sphinx-build-3', required : false)
if not sphinx.found()
    sphinx = find_program('sphinx-build', required : get_option('documentation'))
endif

if sphinx.found()
    docs_sources = [
        'camera-sensor-model.rst',
        'code-of-conduct.rst',
        'coding-style.rst',
        'conf.py',
        'contributing.rst',
        'docs.rst',
        'documentation-contents.rst',
        'environment_variables.rst',
        'feature_requirements.rst',
        'guides/application-developer.rst',
        'guides/introduction.rst',
        'guides/ipa.rst',
        'guides/pipeline-handler.rst',
        'guides/tracing.rst',
        'index.rst',
        'lens_driver_requirements.rst',
        'libcamera_architecture.rst',
        'python-bindings.rst',
        'sensor_driver_requirements.rst',
        'software-isp-benchmarking.rst',
       '../README.rst',
    ]

    release = 'release=v' + libcamera_git_version

    custom_target('documentation',
                  command : [sphinx, '-D', release, '-q', '-W', '-b', 'html',
                             meson.current_source_dir(), '@OUTPUT@'],
                  input : docs_sources,
                  output : 'html',
                  build_by_default : true,
                  install : true,
                  install_dir : doc_install_dir,
                  install_tag : 'doc')

    custom_target('documentation-linkcheck',
                  command : [sphinx, '-W', '-b', 'linkcheck', meson.current_source_dir(), '@OUTPUT@'],
                  build_always_stale : true,
                  input : docs_sources,
                  output : 'linkcheck')
endif