Commit b44158b1 authored by Ben Hutchings's avatar Ben Hutchings Committed by Jonathan Corbet

DocBook: Avoid building man pages repeatedly and inconsistently

Some kernel-doc sections are included in multiple DocBook files.  This
means the mandocs target will generate the same manual page multiple
times with different metadata (author name/address and manual title,
taken from the including DocBook file).  If it's invoked in a parallel
build, the output is nondeterminstic.

For each section that is duplicated, mark the less specific manual's
inclusion as 'extra' and exclude it during conversion to manual pages.
Use xmlif for this, as that is bundled with xmlto which we already
use.

I would have preferred to use more conventional markup for this, but
each of the following approaches failed:

1. Wrap the extra inclusions with a new element and add a template to
   the stylesheet to include/exclude them.  Unfortunately DocBook XSL
   doesn't seem to support foreign elements at an intermediate level
   in the document tree.
2. Use DocBook profiling.  This works but requires passing an absolute
   path to the profile stylesheet to xmlto, so it's not portable.
3. Use SGML marked sections.  docbook2x can handle these but xmlto
   chokes on them.
Reported-by: default avatarJérémy Bobbio <lunar@debian.org>
Signed-off-by: default avatarBen Hutchings <ben@decadent.org.uk>
Signed-off-by: default avatarJonathan Corbet <corbet@lwn.net>
parent b48ed851
...@@ -56,6 +56,13 @@ htmldocs: $(HTML) ...@@ -56,6 +56,13 @@ htmldocs: $(HTML)
MAN := $(patsubst %.xml, %.9, $(BOOKS)) MAN := $(patsubst %.xml, %.9, $(BOOKS))
mandocs: $(MAN) mandocs: $(MAN)
@dups=$$(sed -n 's/.*<refname>\([^<]*\)<\/refname>.*/\1/p' \
$(obj)/*.xml.noextra | sort | uniq -d); \
if [ -n "$$dups" ]; then \
echo >&2 "The following manual pages are generated more than once:"; \
printf >&2 '%s\n' "$$dups"; \
exit 1; \
fi
find $(obj)/man -name '*.9' | xargs gzip -nf find $(obj)/man -name '*.9' | xargs gzip -nf
installmandocs: mandocs installmandocs: mandocs
...@@ -150,7 +157,7 @@ quiet_cmd_db2html = HTML $@ ...@@ -150,7 +157,7 @@ quiet_cmd_db2html = HTML $@
cp $(PNG-$(basename $(notdir $@))) $(patsubst %.html,%,$@); fi cp $(PNG-$(basename $(notdir $@))) $(patsubst %.html,%,$@); fi
quiet_cmd_db2man = MAN $@ quiet_cmd_db2man = MAN $@
cmd_db2man = if grep -q refentry $<; then xmlto man $(XMLTOFLAGS) -o $(obj)/man $< ; fi cmd_db2man = if grep -q refentry $<; then xmlif excludeextra=1 <$< >$<.noextra && xmlto man $(XMLTOFLAGS) -o $(obj)/man $<.noextra ; fi
%.9 : %.xml %.9 : %.xml
@(which xmlto > /dev/null 2>&1) || \ @(which xmlto > /dev/null 2>&1) || \
(echo "*** You need to install xmlto ***"; \ (echo "*** You need to install xmlto ***"; \
...@@ -217,6 +224,7 @@ clean-files := $(DOCBOOKS) \ ...@@ -217,6 +224,7 @@ clean-files := $(DOCBOOKS) \
$(patsubst %.xml, %.ps, $(DOCBOOKS)) \ $(patsubst %.xml, %.ps, $(DOCBOOKS)) \
$(patsubst %.xml, %.pdf, $(DOCBOOKS)) \ $(patsubst %.xml, %.pdf, $(DOCBOOKS)) \
$(patsubst %.xml, %.html, $(DOCBOOKS)) \ $(patsubst %.xml, %.html, $(DOCBOOKS)) \
$(patsubst %, %.noextra, $(DOCBOOKS)) \
$(patsubst %.xml, %.9, $(DOCBOOKS)) \ $(patsubst %.xml, %.9, $(DOCBOOKS)) \
$(index) $(index)
......
...@@ -194,8 +194,13 @@ X!Edrivers/pnp/system.c ...@@ -194,8 +194,13 @@ X!Edrivers/pnp/system.c
<chapter id="snddev"> <chapter id="snddev">
<title>Sound Devices</title> <title>Sound Devices</title>
<?xmlif if excludeextra='1'?>
<?xmlif else?>
!Iinclude/sound/core.h !Iinclude/sound/core.h
<?xmlif fi?>
!Esound/sound_core.c !Esound/sound_core.c
<?xmlif if excludeextra='1'?>
<?xmlif else?>
!Iinclude/sound/pcm.h !Iinclude/sound/pcm.h
!Esound/core/pcm.c !Esound/core/pcm.c
!Esound/core/device.c !Esound/core/device.c
...@@ -211,6 +216,7 @@ X!Edrivers/pnp/system.c ...@@ -211,6 +216,7 @@ X!Edrivers/pnp/system.c
!Esound/core/hwdep.c !Esound/core/hwdep.c
!Esound/core/pcm_native.c !Esound/core/pcm_native.c
!Esound/core/memalloc.c !Esound/core/memalloc.c
<?xmlif fi?>
<!-- FIXME: Removed for now since no structured comments in source <!-- FIXME: Removed for now since no structured comments in source
X!Isound/sound_firmware.c X!Isound/sound_firmware.c
--> -->
......
...@@ -488,7 +488,10 @@ These are the same types and constants used by host ...@@ -488,7 +488,10 @@ These are the same types and constants used by host
side drivers (and usbcore). side drivers (and usbcore).
</para> </para>
<?xmlif if excludeextra='1'?>
<?xmlif else?>
!Iinclude/linux/usb/ch9.h !Iinclude/linux/usb/ch9.h
<?xmlif fi?>
</sect1> </sect1>
<sect1 id="core"><title>Core Objects and Methods</title> <sect1 id="core"><title>Core Objects and Methods</title>
......
...@@ -58,8 +58,11 @@ ...@@ -58,8 +58,11 @@
<sect1><title>String Conversions</title> <sect1><title>String Conversions</title>
!Elib/vsprintf.c !Elib/vsprintf.c
<?xmlif if excludeextra='1'?>
<?xmlif else?>
!Finclude/linux/kernel.h kstrtol !Finclude/linux/kernel.h kstrtol
!Finclude/linux/kernel.h kstrtoul !Finclude/linux/kernel.h kstrtoul
<?xmlif fi?>
!Elib/kstrtox.c !Elib/kstrtox.c
</sect1> </sect1>
<sect1><title>String Manipulation</title> <sect1><title>String Manipulation</title>
...@@ -178,7 +181,10 @@ X!Ekernel/module.c ...@@ -178,7 +181,10 @@ X!Ekernel/module.c
<chapter id="hardware"> <chapter id="hardware">
<title>Hardware Interfaces</title> <title>Hardware Interfaces</title>
<sect1><title>Interrupt Handling</title> <sect1><title>Interrupt Handling</title>
<?xmlif if excludeextra='1'?>
<?xmlif else?>
!Ekernel/irq/manage.c !Ekernel/irq/manage.c
<?xmlif fi?>
</sect1> </sect1>
<sect1><title>DMA Channels</title> <sect1><title>DMA Channels</title>
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment