docs/meson.build | 48 +++++++++++++++++++++++++------------- docs/sphinx/dbusdomain.py | 4 ++++ docs/sphinx/fakedbusdoc.py | 5 ++++ docs/sphinx/qmp_lexer.py | 5 ++++ 4 files changed, 46 insertions(+), 16 deletions(-)
We currently have two documentation targets to build:
- 'man' for the man pages;
- 'html' for the web page.
There are two bottlenecks in the process:
1) sphinx runs with a single process;
2) the two targets are serialized.
For (1), we can just add the "-j auto" to sphinx_build and that should
bring some speed gains.
For (2) it's a little trickier because the reason the builds are
serialized is that Sphinx keeps track of changed files, but we still
need a way to tell meson whether a target needs to re-execute, so we
added dependency tracking and timestamp checking for (only) the 'html'
build via the depfile.py extension. Since the sources for both builds
are the same, we made the 'man' build dependent on 'html' so that it
would rebuild when needed.
So patch 1 adds the -j option to Sphinx and patch 2 adds depfile
support to the 'man' build. We can now run the two in parallel (ninja
will take care of that).
On my 16 core machine,
the -j change saves about 20s
the depfile change saves about 10s
===
On master:
$ ../configure --enable-docs ...
$ time make -j$(nproc) html man
GIT ui/keycodemapdb meson tests/fp/berkeley-testfloat-3 tests/fp/berkeley-softfloat-3 dtc
/usr/bin/ninja build.ninja && touch build.ninja.stamp
ninja: no work to do.
/usr/bin/python3 -B .../qemu/meson/meson.py introspect --targets --tests --benchmarks | /usr/bin/python3 -B scripts/mtest2make.py > Makefile.mtest
GIT ui/keycodemapdb meson tests/fp/berkeley-testfloat-3 tests/fp/berkeley-softfloat-3 dtc
[1/2] Generating docs/QEMU manual with a custom command
[2/2] Generating docs/QEMU man pages with a custom command
make: Nothing to be done for 'man'.
real 0m50.155s
user 0m49.759s
sys 0m0.761s
$ mv docs ../saved-docs
This series:
$ ../configure --enable-docs ...
$ time make -j$(nproc) html man
GIT ui/keycodemapdb meson tests/fp/berkeley-testfloat-3 tests/fp/berkeley-softfloat-3 dtc
/usr/bin/ninja build.ninja && touch build.ninja.stamp
ninja: no work to do.
/usr/bin/python3 -B .../qemu/meson/meson.py introspect --targets --tests --benchmarks | /usr/bin/python3 -B scripts/mtest2make.py > Makefile.mtest
GIT ui/keycodemapdb meson tests/fp/berkeley-testfloat-3 tests/fp/berkeley-softfloat-3 dtc
[1/2] Generating docs/QEMU man pages with a custom command
[2/2] Generating docs/QEMU manual with a custom command
make: Nothing to be done for 'man'.
real 0m21.708s
user 1m12.317s
sys 0m2.056s
Diff sanity check:
$ diff -rq docs/ ../saved-docs/
Only in ../saved-docs/: docs.d # now manual.dep
Only in ../saved-docs/: docs.stamp # now manual.stamp
Only in docs/: man.dep
Only in docs/: man.p
Only in docs/: man.stamp
Only in docs/: manual.dep
Only in docs/: manual.stamp
Files docs/manual.p/about/build-platforms.doctree and ../saved-docs/manual.p/about/build-platforms.doctree differ
... # sphinx cache files, a bunch of these^
Rebuilding (here I show that a man file and an html file are
unchanged, change their source .rst and rebuild each target):
$ ninja -d explain html
ninja: no work to do.
$ ninja -d explain man
ninja: no work to do.
$ man -l docs/qemu.1 | grep foobar
$ grep foobar docs/manual/system/i386/pc.html
$ vi ../docs/system/target-i386-desc.rst.inc #add the 'foobar' string
$ ninja -d explain man
ninja explain: restat of output docs/man.stamp older than most recent input docs/system/target-i386-desc.rst.inc (1683122999140339620 vs 1683123032492362281)
ninja explain: docs/man.stamp is dirty
ninja explain: docs/qemu-block-drivers.7 is dirty
ninja explain: docs/qemu-cpu-models.7 is dirty
ninja explain: docs/qemu-ga-ref.7 is dirty
ninja explain: docs/qemu-ga.8 is dirty
ninja explain: docs/qemu-img.1 is dirty
ninja explain: docs/qemu-nbd.8 is dirty
ninja explain: docs/qemu-pr-helper.8 is dirty
ninja explain: docs/qemu-qmp-ref.7 is dirty
ninja explain: docs/qemu-storage-daemon-qmp-ref.7 is dirty
ninja explain: docs/qemu-storage-daemon.1 is dirty
ninja explain: docs/qemu-trace-stap.1 is dirty
ninja explain: docs/qemu.1 is dirty
ninja explain: docs/virtfs-proxy-helper.1 is dirty
[1/1] Generating docs/QEMU man pages with a custom command
$ man -l docs/qemu.1 | grep foobar
The QEMU PC System emulator simulates the following foobar peripherals:
$ grep foobar docs/manual/system/i386/pc.html #html files unchanged
$ ninja -d explain html
ninja explain: restat of output docs/manual.stamp older than most recent input docs/system/target-i386-desc.rst.inc (1683122995876337403 vs 1683123032492362281)
ninja explain: docs/manual.stamp is dirty
[1/1] Generating docs/QEMU manual with a custom command
$ man -l docs/qemu.1 | grep foobar
The QEMU PC System emulator simulates the following foobar peripherals:
$ grep foobar docs/manual/system/i386/pc.html
<p>The QEMU PC System emulator simulates the following foobar peripherals:</p>
===
Fabiano Rosas (2):
meson: Pass -j option to sphinx
meson: Deserialize the man pages and html builds
docs/meson.build | 48 +++++++++++++++++++++++++-------------
docs/sphinx/dbusdomain.py | 4 ++++
docs/sphinx/fakedbusdoc.py | 5 ++++
docs/sphinx/qmp_lexer.py | 5 ++++
4 files changed, 46 insertions(+), 16 deletions(-)
--
2.35.3
© 2016 - 2026 Red Hat, Inc.