diff mbox

[04/23,v5] gendoc infra: disable pdf manual generation if xsltproc is buggy

Message ID 4285f37298bb4361de1ca8f82f42e37c4bc4d7d4.1410692670.git.yann.morin.1998@free.fr
State Changes Requested
Headers show

Commit Message

Yann E. MORIN Sept. 14, 2014, 11:07 a.m. UTC
From: Samuel Martin <s.martin49@gmail.com>

The PDF manual generation reaches the default xsltproc's template
recursion limit when processing the target package list; this makes the
PDF manual generation fail [1-3].

This limit can be raised with the '--maxvars' option. Unfortunately,
this option is not correctly handled in the latest xsltproc/libxslt
release (1.1.28), but this bug is already fixed in the libxslt
repository [4].

This patch disables the PDF manual generation (makes it fail with a
meaningful error message) when the xsltproc program found in the PATH
does not support the --maxvars option.
So, one can still generate the PDF manual if he/she extends PATH with
the location of a working xsltproc, by running:

  $ PATH=/path/to/custom-xsltproc/bin:${PATH} make manual-pdf

[1] http://lists.busybox.net/pipermail/buildroot/2014-August/104390.html
[2] http://lists.busybox.net/pipermail/buildroot/2014-August/104418.html
[3] http://lists.busybox.net/pipermail/buildroot/2014-August/104421.html
[4] https://gitorious.org/libxslt/libxslt/commit/5af7ad745323004984287e48b42712e7305de35c

Reported-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Cc: Thomas De Schampheleire <thomas.de.schampheleire@gmail.com>
Signed-off-by: Samuel Martin <s.martin49@gmail.com>
[yann.morin.1998@free.fr: move the assignment block out of GENDOC_INNER, no
 need to retest for each type of each document: it's always the same answer]
Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
---
 docs/manual/manual.mk | 28 +++++++++++++++++++++++++++-
 1 file changed, 27 insertions(+), 1 deletion(-)

Comments

Thomas De Schampheleire Sept. 19, 2014, 8 p.m. UTC | #1
On Sun, Sep 14, 2014 at 1:07 PM, Yann E. MORIN <yann.morin.1998@free.fr> wrote:
> From: Samuel Martin <s.martin49@gmail.com>
>
> The PDF manual generation reaches the default xsltproc's template
> recursion limit when processing the target package list; this makes the
> PDF manual generation fail [1-3].
>
> This limit can be raised with the '--maxvars' option. Unfortunately,
> this option is not correctly handled in the latest xsltproc/libxslt
> release (1.1.28), but this bug is already fixed in the libxslt
> repository [4].
>
> This patch disables the PDF manual generation (makes it fail with a
> meaningful error message) when the xsltproc program found in the PATH
> does not support the --maxvars option.
> So, one can still generate the PDF manual if he/she extends PATH with
> the location of a working xsltproc, by running:
>
>   $ PATH=/path/to/custom-xsltproc/bin:${PATH} make manual-pdf
>
> [1] http://lists.busybox.net/pipermail/buildroot/2014-August/104390.html
> [2] http://lists.busybox.net/pipermail/buildroot/2014-August/104418.html
> [3] http://lists.busybox.net/pipermail/buildroot/2014-August/104421.html
> [4] https://gitorious.org/libxslt/libxslt/commit/5af7ad745323004984287e48b42712e7305de35c
>
> Reported-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
> Cc: Thomas De Schampheleire <thomas.de.schampheleire@gmail.com>
> Signed-off-by: Samuel Martin <s.martin49@gmail.com>
> [yann.morin.1998@free.fr: move the assignment block out of GENDOC_INNER, no
>  need to retest for each type of each document: it's always the same answer]
> Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
> ---
>  docs/manual/manual.mk | 28 +++++++++++++++++++++++++++-
>  1 file changed, 27 insertions(+), 1 deletion(-)
>
> diff --git a/docs/manual/manual.mk b/docs/manual/manual.mk
> index 09d8b18..b5856b9 100644
> --- a/docs/manual/manual.mk
> +++ b/docs/manual/manual.mk
> @@ -41,6 +41,20 @@ manual-check-dependencies-lists:
>                 exit 1; \
>         fi
>
> +# PDF manual generation is broken because of a bug in xsltproc program provided
> +# by libxslt <=1.1.28, which does not honor an option we need to set.
> +# Fortunately, this bug is already fixed upstream:
> +#   https://gitorious.org/libxslt/libxslt/commit/5af7ad745323004984287e48b42712e7305de35c
> +#
> +# So, bail out when trying to build the pdf manual using a buggy version of the
> +# xsltproc program.
> +#
> +# So, to overcome this issue and being able to build the pdf manual, you can
> +# build xsltproc from it source repository, then run:
> +#   $ PATH=/path/to/custom-xsltproc/bin:${PATH} make manual
> +MANUAL_XSLTPROC_IS_BROKEN = \
> +       $(shell xsltproc --maxvars 0 >/dev/null 2>/dev/null || echo y)
> +
>  ################################################################################
>  # GENDOC_INNER -- generates the make targets needed to build a specific type of
>  #                 asciidoc documentation.
> @@ -83,6 +97,14 @@ define MANUAL_$(2)_INSTALL_CMDS
>  endef
>  endif
>
> +ifeq ($(4)-$$(MANUAL_XSLTPROC_IS_BROKEN),pdf-y)
> +$$(O)/docs/$(1)/$(1).$(4):
> +       $$(error PDF manual generation is disabled because of a bug in \
> +               xsltproc. To be able to generate the PDF manual, you should \
> +               build xsltproc from the libxslt sources >=1.1.29 and pass it \
> +               to make through the command line: \
> +               'PATH=/path/to/custom-xsltproc/bin:$$$${PATH} make manual-pdf')

I think this should be $(warning) instead of $(error), because if you
run 'make manual' with a broken xsltproc, then the manual generation
will stop at the pdf manual, even though the following manuals (text
and ePUB) could have been built without issue.
Yann E. MORIN Sept. 19, 2014, 8:15 p.m. UTC | #2
Thomas, All,

On 2014-09-19 22:00 +0200, Thomas De Schampheleire spake thusly:
> On Sun, Sep 14, 2014 at 1:07 PM, Yann E. MORIN <yann.morin.1998@free.fr> wrote:
> > From: Samuel Martin <s.martin49@gmail.com>
> >
> > The PDF manual generation reaches the default xsltproc's template
> > recursion limit when processing the target package list; this makes the
> > PDF manual generation fail [1-3].
[--SNIP--]
> >  ################################################################################
> >  # GENDOC_INNER -- generates the make targets needed to build a specific type of
> >  #                 asciidoc documentation.
> > @@ -83,6 +97,14 @@ define MANUAL_$(2)_INSTALL_CMDS
> >  endef
> >  endif
> >
> > +ifeq ($(4)-$$(MANUAL_XSLTPROC_IS_BROKEN),pdf-y)
> > +$$(O)/docs/$(1)/$(1).$(4):
> > +       $$(error PDF manual generation is disabled because of a bug in \
> > +               xsltproc. To be able to generate the PDF manual, you should \
> > +               build xsltproc from the libxslt sources >=1.1.29 and pass it \
> > +               to make through the command line: \
> > +               'PATH=/path/to/custom-xsltproc/bin:$$$${PATH} make manual-pdf')
> 
> I think this should be $(warning) instead of $(error), because if you
> run 'make manual' with a broken xsltproc, then the manual generation
> will stop at the pdf manual, even though the following manuals (text
> and ePUB) could have been built without issue.

Yup, it always bothered me. But we can just skip it, indeed.

Another point about this hunk: the indentation of $(error...) is wrong:
it is not the commands of the rule. I.e. it is not interpreted by the
shell for the $$(O)/docs/$(1)/$(1).$(4) rule, but really by make itself.

So, we should probably have this instead:

    ifeq ($(4)-$$(MANUAL_XSLTPROC_IS_BROKEN),pdf-y)
    $$(error ........)
    $$(O)/docs/$(1)/$(1).$(4):
    else
    $$(O)/docs/$(1)/$(1).$(4):
        a2x ....
    endif

Regards,
Yann E. MORIN.
Thomas De Schampheleire Sept. 19, 2014, 8:21 p.m. UTC | #3
On Fri, Sep 19, 2014 at 10:15 PM, Yann E. MORIN <yann.morin.1998@free.fr> wrote:
> Thomas, All,
>
> On 2014-09-19 22:00 +0200, Thomas De Schampheleire spake thusly:
>> On Sun, Sep 14, 2014 at 1:07 PM, Yann E. MORIN <yann.morin.1998@free.fr> wrote:
>> > From: Samuel Martin <s.martin49@gmail.com>
>> >
>> > The PDF manual generation reaches the default xsltproc's template
>> > recursion limit when processing the target package list; this makes the
>> > PDF manual generation fail [1-3].
> [--SNIP--]
>> >  ################################################################################
>> >  # GENDOC_INNER -- generates the make targets needed to build a specific type of
>> >  #                 asciidoc documentation.
>> > @@ -83,6 +97,14 @@ define MANUAL_$(2)_INSTALL_CMDS
>> >  endef
>> >  endif
>> >
>> > +ifeq ($(4)-$$(MANUAL_XSLTPROC_IS_BROKEN),pdf-y)
>> > +$$(O)/docs/$(1)/$(1).$(4):
>> > +       $$(error PDF manual generation is disabled because of a bug in \
>> > +               xsltproc. To be able to generate the PDF manual, you should \
>> > +               build xsltproc from the libxslt sources >=1.1.29 and pass it \
>> > +               to make through the command line: \
>> > +               'PATH=/path/to/custom-xsltproc/bin:$$$${PATH} make manual-pdf')
>>
>> I think this should be $(warning) instead of $(error), because if you
>> run 'make manual' with a broken xsltproc, then the manual generation
>> will stop at the pdf manual, even though the following manuals (text
>> and ePUB) could have been built without issue.
>
> Yup, it always bothered me. But we can just skip it, indeed.
>
> Another point about this hunk: the indentation of $(error...) is wrong:
> it is not the commands of the rule. I.e. it is not interpreted by the
> shell for the $$(O)/docs/$(1)/$(1).$(4) rule, but really by make itself.
>
> So, we should probably have this instead:
>
>     ifeq ($(4)-$$(MANUAL_XSLTPROC_IS_BROKEN),pdf-y)
>     $$(error ........)
>     $$(O)/docs/$(1)/$(1).$(4):
>     else
>     $$(O)/docs/$(1)/$(1).$(4):
>         a2x ....
>     endif

Yes, but with $(warning) then...

Best regards,
Thomas
diff mbox

Patch

diff --git a/docs/manual/manual.mk b/docs/manual/manual.mk
index 09d8b18..b5856b9 100644
--- a/docs/manual/manual.mk
+++ b/docs/manual/manual.mk
@@ -41,6 +41,20 @@  manual-check-dependencies-lists:
 		exit 1; \
 	fi
 
+# PDF manual generation is broken because of a bug in xsltproc program provided
+# by libxslt <=1.1.28, which does not honor an option we need to set.
+# Fortunately, this bug is already fixed upstream:
+#   https://gitorious.org/libxslt/libxslt/commit/5af7ad745323004984287e48b42712e7305de35c
+#
+# So, bail out when trying to build the pdf manual using a buggy version of the
+# xsltproc program.
+#
+# So, to overcome this issue and being able to build the pdf manual, you can
+# build xsltproc from it source repository, then run:
+#   $ PATH=/path/to/custom-xsltproc/bin:${PATH} make manual
+MANUAL_XSLTPROC_IS_BROKEN = \
+	$(shell xsltproc --maxvars 0 >/dev/null 2>/dev/null || echo y)
+
 ################################################################################
 # GENDOC_INNER -- generates the make targets needed to build a specific type of
 #                 asciidoc documentation.
@@ -83,6 +97,14 @@  define MANUAL_$(2)_INSTALL_CMDS
 endef
 endif
 
+ifeq ($(4)-$$(MANUAL_XSLTPROC_IS_BROKEN),pdf-y)
+$$(O)/docs/$(1)/$(1).$(4):
+	$$(error PDF manual generation is disabled because of a bug in \
+		xsltproc. To be able to generate the PDF manual, you should \
+		build xsltproc from the libxslt sources >=1.1.29 and pass it \
+		to make through the command line: \
+		'PATH=/path/to/custom-xsltproc/bin:$$$${PATH} make manual-pdf')
+else
 $$(O)/docs/$(1)/$(1).$(4): docs/$(1)/$(1).txt \
 			   $$($$(call UPPERCASE,$(1))_SOURCES) \
 			   manual-check-dependencies \
@@ -96,6 +118,7 @@  $$(O)/docs/$(1)/$(1).$(4): docs/$(1)/$(1).txt \
 		$$(BUILD_DIR)/$(1)/$(1).txt
 # install the generated manual
 	$$(MANUAL_$(2)_INSTALL_CMDS)
+endif
 endef
 
 ################################################################################
@@ -111,8 +134,11 @@  $(call GENDOC_INNER,$(pkgname),xhtml,html,html,HTML,\
 	--xsltproc-opts "--stringparam toc.section.depth 1")
 $(call GENDOC_INNER,$(pkgname),chunked,split-html,chunked,split HTML,\
 	--xsltproc-opts "--stringparam toc.section.depth 1")
+# dblatex needs to pass the '--maxvars ...' option to xsltproc to prevent it
+# from reaching the template recursion limit when processing the (long) target
+# package table and bailing out.
 $(call GENDOC_INNER,$(pkgname),pdf,pdf,pdf,PDF,\
-	--dblatex-opts "-P latex.output.revhistory=0")
+	--dblatex-opts "-P latex.output.revhistory=0 -x '--maxvars 100000'")
 $(call GENDOC_INNER,$(pkgname),text,text,text,text)
 $(call GENDOC_INNER,$(pkgname),epub,epub,epub,ePUB)
 clean: $(pkgname)-clean