John Snow | 6f6652e | 2023-05-10 23:54:29 -0400 | [diff] [blame] | 1 | sphinx_build = find_program(fs.parent(python.full_path()) / 'sphinx-build', |
John Snow | 1b1be8d | 2023-02-20 20:24:55 -0500 | [diff] [blame] | 2 | required: get_option('docs')) |
Yonggang Luo | e366766 | 2020-10-16 06:06:25 +0800 | [diff] [blame] | 3 | |
| 4 | # Check if tools are available to build documentation. |
| 5 | build_docs = false |
| 6 | if sphinx_build.found() |
Daniel P. Berrangé | 2e88019 | 2021-08-12 11:24:27 +0100 | [diff] [blame] | 7 | SPHINX_ARGS = ['env', 'CONFDIR=' + qemu_confdir, sphinx_build, '-q'] |
Yonggang Luo | e366766 | 2020-10-16 06:06:25 +0800 | [diff] [blame] | 8 | # If we're making warnings fatal, apply this to Sphinx runs as well |
| 9 | if get_option('werror') |
Peter Maydell | 3642066 | 2023-03-14 11:44:31 +0000 | [diff] [blame] | 10 | SPHINX_ARGS += [ '-W', '-Dkerneldoc_werror=1' ] |
Yonggang Luo | e366766 | 2020-10-16 06:06:25 +0800 | [diff] [blame] | 11 | endif |
| 12 | |
Fabiano Rosas | ed8d951 | 2023-05-03 17:39:46 -0300 | [diff] [blame] | 13 | sphinx_version = run_command(SPHINX_ARGS + ['--version'], |
| 14 | check: true).stdout().split()[1] |
| 15 | if sphinx_version.version_compare('>=1.7.0') |
| 16 | SPHINX_ARGS += ['-j', 'auto'] |
| 17 | else |
| 18 | nproc = find_program('nproc') |
| 19 | if nproc.found() |
| 20 | jobs = run_command(nproc, check: true).stdout() |
| 21 | SPHINX_ARGS += ['-j', jobs] |
| 22 | endif |
| 23 | endif |
| 24 | |
Yonggang Luo | e366766 | 2020-10-16 06:06:25 +0800 | [diff] [blame] | 25 | # This is a bit awkward but works: create a trivial document and |
| 26 | # try to run it with our configuration file (which enforces a |
| 27 | # version requirement). This will fail if sphinx-build is too old. |
Paolo Bonzini | b20a7ee | 2021-12-17 09:52:03 +0100 | [diff] [blame] | 28 | run_command('mkdir', ['-p', tmpdir / 'sphinx'], check: true) |
| 29 | run_command('touch', [tmpdir / 'sphinx/index.rst'], check: true) |
Yonggang Luo | e366766 | 2020-10-16 06:06:25 +0800 | [diff] [blame] | 30 | sphinx_build_test_out = run_command(SPHINX_ARGS + [ |
| 31 | '-c', meson.current_source_dir(), |
| 32 | '-b', 'html', tmpdir / 'sphinx', |
Paolo Bonzini | b20a7ee | 2021-12-17 09:52:03 +0100 | [diff] [blame] | 33 | tmpdir / 'sphinx/out'], check: false) |
Yonggang Luo | e366766 | 2020-10-16 06:06:25 +0800 | [diff] [blame] | 34 | build_docs = (sphinx_build_test_out.returncode() == 0) |
| 35 | |
| 36 | if not build_docs |
Marc-André Lureau | 73e6aec | 2021-03-23 15:53:28 +0400 | [diff] [blame] | 37 | warning('@0@: @1@'.format(sphinx_build.full_path(), sphinx_build_test_out.stderr())) |
Yonggang Luo | e366766 | 2020-10-16 06:06:25 +0800 | [diff] [blame] | 38 | if get_option('docs').enabled() |
Marc-André Lureau | 73e6aec | 2021-03-23 15:53:28 +0400 | [diff] [blame] | 39 | error('Install a Python 3 version of python-sphinx and the readthedoc theme') |
Yonggang Luo | e366766 | 2020-10-16 06:06:25 +0800 | [diff] [blame] | 40 | endif |
| 41 | endif |
| 42 | endif |
| 43 | |
Paolo Bonzini | f8aa24e | 2020-08-05 15:49:10 +0200 | [diff] [blame] | 44 | if build_docs |
Paolo Bonzini | b0b4323 | 2022-04-20 17:33:54 +0200 | [diff] [blame] | 45 | SPHINX_ARGS += ['-Dversion=' + meson.project_version(), '-Drelease=' + get_option('pkgversion')] |
Yonggang Luo | e366766 | 2020-10-16 06:06:25 +0800 | [diff] [blame] | 46 | |
Paolo Bonzini | f8aa24e | 2020-08-05 15:49:10 +0200 | [diff] [blame] | 47 | man_pages = { |
Stefan Reiter | e0f7fc5 | 2021-01-28 15:58:01 +0100 | [diff] [blame] | 48 | 'qemu-ga.8': (have_ga ? 'man8' : ''), |
| 49 | 'qemu-ga-ref.7': (have_ga ? 'man7' : ''), |
Peter Maydell | 4ac2ee1 | 2020-09-25 17:23:04 +0100 | [diff] [blame] | 50 | 'qemu-qmp-ref.7': 'man7', |
Stefan Hajnoczi | 23c02ac | 2020-12-09 10:38:00 +0000 | [diff] [blame] | 51 | 'qemu-storage-daemon-qmp-ref.7': (have_tools ? 'man7' : ''), |
Paolo Bonzini | f8aa24e | 2020-08-05 15:49:10 +0200 | [diff] [blame] | 52 | 'qemu-img.1': (have_tools ? 'man1' : ''), |
| 53 | 'qemu-nbd.8': (have_tools ? 'man8' : ''), |
Peter Maydell | 773ee3f | 2020-11-12 14:40:40 +0000 | [diff] [blame] | 54 | 'qemu-pr-helper.8': (have_tools ? 'man8' : ''), |
Peter Maydell | fa56cf7 | 2021-01-08 16:14:15 +0000 | [diff] [blame] | 55 | 'qemu-storage-daemon.1': (have_tools ? 'man1' : ''), |
Paolo Bonzini | 9c29b74 | 2021-10-07 15:08:14 +0200 | [diff] [blame] | 56 | 'qemu-trace-stap.1': (stap.found() ? 'man1' : ''), |
Paolo Bonzini | f8aa24e | 2020-08-05 15:49:10 +0200 | [diff] [blame] | 57 | 'virtfs-proxy-helper.1': (have_virtfs_proxy_helper ? 'man1' : ''), |
Paolo Bonzini | f8aa24e | 2020-08-05 15:49:10 +0200 | [diff] [blame] | 58 | 'qemu.1': 'man1', |
| 59 | 'qemu-block-drivers.7': 'man7', |
| 60 | 'qemu-cpu-models.7': 'man7' |
Paolo Bonzini | f8aa24e | 2020-08-05 15:49:10 +0200 | [diff] [blame] | 61 | } |
| 62 | |
| 63 | sphinxdocs = [] |
| 64 | sphinxmans = [] |
Paolo Bonzini | bac35bf | 2020-08-11 09:07:04 +0200 | [diff] [blame] | 65 | |
Peter Maydell | b93f4fb | 2021-01-15 15:44:49 +0000 | [diff] [blame] | 66 | private_dir = meson.current_build_dir() / 'manual.p' |
| 67 | output_dir = meson.current_build_dir() / 'manual' |
| 68 | input_dir = meson.current_source_dir() |
| 69 | |
| 70 | this_manual = custom_target('QEMU manual', |
Paolo Bonzini | f8aa24e | 2020-08-05 15:49:10 +0200 | [diff] [blame] | 71 | build_by_default: build_docs, |
Peter Maydell | b93f4fb | 2021-01-15 15:44:49 +0000 | [diff] [blame] | 72 | output: 'docs.stamp', |
| 73 | input: files('conf.py'), |
| 74 | depfile: 'docs.d', |
Paolo Bonzini | bac35bf | 2020-08-11 09:07:04 +0200 | [diff] [blame] | 75 | command: [SPHINX_ARGS, '-Ddepfile=@DEPFILE@', |
| 76 | '-Ddepfile_stamp=@OUTPUT0@', |
| 77 | '-b', 'html', '-d', private_dir, |
| 78 | input_dir, output_dir]) |
Peter Maydell | b93f4fb | 2021-01-15 15:44:49 +0000 | [diff] [blame] | 79 | sphinxdocs += this_manual |
| 80 | install_subdir(output_dir, install_dir: qemu_docdir, strip_directory: true) |
Paolo Bonzini | f8aa24e | 2020-08-05 15:49:10 +0200 | [diff] [blame] | 81 | |
Peter Maydell | b93f4fb | 2021-01-15 15:44:49 +0000 | [diff] [blame] | 82 | these_man_pages = [] |
| 83 | install_dirs = [] |
| 84 | foreach page, section : man_pages |
| 85 | these_man_pages += page |
| 86 | install_dirs += section == '' ? false : get_option('mandir') / section |
Paolo Bonzini | f8aa24e | 2020-08-05 15:49:10 +0200 | [diff] [blame] | 87 | endforeach |
Peter Maydell | b93f4fb | 2021-01-15 15:44:49 +0000 | [diff] [blame] | 88 | |
| 89 | sphinxmans += custom_target('QEMU man pages', |
| 90 | build_by_default: build_docs, |
| 91 | output: these_man_pages, |
| 92 | input: this_manual, |
| 93 | install: build_docs, |
| 94 | install_dir: install_dirs, |
| 95 | command: [SPHINX_ARGS, '-b', 'man', '-d', private_dir, |
| 96 | input_dir, meson.current_build_dir()]) |
| 97 | |
Paolo Bonzini | f8aa24e | 2020-08-05 15:49:10 +0200 | [diff] [blame] | 98 | alias_target('sphinxdocs', sphinxdocs) |
Peter Maydell | 4ac2ee1 | 2020-09-25 17:23:04 +0100 | [diff] [blame] | 99 | alias_target('html', sphinxdocs) |
Paolo Bonzini | f8aa24e | 2020-08-05 15:49:10 +0200 | [diff] [blame] | 100 | alias_target('man', sphinxmans) |
| 101 | endif |