Commit ecf5fb58 authored by Akira Yokosawa's avatar Akira Yokosawa Committed by Jonathan Corbet

docs: sphinx/kfigure.py: Add check of 'dot -Tpdf'

To prevent any regression on existing build systems, limit the
fallback of converting DOT -> raster PDF only when both of the
following conditions are met.

 o dot(1) doesn't support -Tpdf
 o rsvg-convert(1) is not found

While we are here, add kernellog.verbose messages related to
rsvg-convert, 'dot -Tpdf', and 'dot -Tsvg' commands.
Suggested-by: default avatarMauro Carvalho Chehab <mchehab@kernel.org>
Signed-off-by: default avatarAkira Yokosawa <akiyks@gmail.com>
Cc: Jonathan Corbet <corbet@lwn.net>
Link: https://lore.kernel.org/r/e76f61e1-7366-ba00-b119-8ea6a2499861@gmail.comSigned-off-by: default avatarJonathan Corbet <corbet@lwn.net>
parent c9edbe1e
...@@ -51,6 +51,7 @@ import os ...@@ -51,6 +51,7 @@ import os
from os import path from os import path
import subprocess import subprocess
from hashlib import sha1 from hashlib import sha1
import re
from docutils import nodes from docutils import nodes
from docutils.statemachine import ViewList from docutils.statemachine import ViewList
from docutils.parsers.rst import directives from docutils.parsers.rst import directives
...@@ -111,6 +112,8 @@ def pass_handle(self, node): # pylint: disable=W0613 ...@@ -111,6 +112,8 @@ def pass_handle(self, node): # pylint: disable=W0613
# Graphviz's dot(1) support # Graphviz's dot(1) support
dot_cmd = None dot_cmd = None
# dot(1) -Tpdf should be used
dot_Tpdf = False
# ImageMagick' convert(1) support # ImageMagick' convert(1) support
convert_cmd = None convert_cmd = None
...@@ -165,7 +168,7 @@ def setupTools(app): ...@@ -165,7 +168,7 @@ def setupTools(app):
This function is called once, when the builder is initiated. This function is called once, when the builder is initiated.
""" """
global dot_cmd, convert_cmd, rsvg_convert_cmd # pylint: disable=W0603 global dot_cmd, dot_Tpdf, convert_cmd, rsvg_convert_cmd # pylint: disable=W0603
kernellog.verbose(app, "kfigure: check installed tools ...") kernellog.verbose(app, "kfigure: check installed tools ...")
dot_cmd = which('dot') dot_cmd = which('dot')
...@@ -174,6 +177,16 @@ def setupTools(app): ...@@ -174,6 +177,16 @@ def setupTools(app):
if dot_cmd: if dot_cmd:
kernellog.verbose(app, "use dot(1) from: " + dot_cmd) kernellog.verbose(app, "use dot(1) from: " + dot_cmd)
try:
dot_Thelp_list = subprocess.check_output([dot_cmd, '-Thelp'],
stderr=subprocess.STDOUT)
except subprocess.CalledProcessError as err:
dot_Thelp_list = err.output
pass
dot_Tpdf_ptn = b'pdf'
dot_Tpdf = re.search(dot_Tpdf_ptn, dot_Thelp_list)
else: else:
kernellog.warn(app, "dot(1) not found, for better output quality install " kernellog.warn(app, "dot(1) not found, for better output quality install "
"graphviz from https://www.graphviz.org") "graphviz from https://www.graphviz.org")
...@@ -185,9 +198,17 @@ def setupTools(app): ...@@ -185,9 +198,17 @@ def setupTools(app):
"ImageMagick (https://www.imagemagick.org)") "ImageMagick (https://www.imagemagick.org)")
if rsvg_convert_cmd: if rsvg_convert_cmd:
kernellog.verbose(app, "use rsvg-convert(1) from: " + rsvg_convert_cmd) kernellog.verbose(app, "use rsvg-convert(1) from: " + rsvg_convert_cmd)
kernellog.verbose(app, "use 'dot -Tsvg' and rsvg-convert(1) for DOT -> PDF conversion")
dot_Tpdf = False
else: else:
kernellog.verbose(app, "rsvg-convert(1) not found, " kernellog.verbose(app,
"falling back to raster image conversion") "rsvg-convert(1) not found.\n"
" SVG -> PDF conversion by convert() can be poor quality.\n"
" Install librsvg (https://gitlab.gnome.org/GNOME/librsvg)")
if dot_Tpdf:
kernellog.verbose(app, "use 'dot -Tpdf' for DOT -> PDF conversion")
else:
kernellog.verbose(app, "use 'dot -Tsvg' and convert(1) for DOT -> PDF conversion")
# integrate conversion tools # integrate conversion tools
...@@ -277,11 +298,12 @@ def convert_image(img_node, translator, src_fname=None): ...@@ -277,11 +298,12 @@ def convert_image(img_node, translator, src_fname=None):
if in_ext == '.dot': if in_ext == '.dot':
kernellog.verbose(app, 'convert DOT to: {out}/' + _name) kernellog.verbose(app, 'convert DOT to: {out}/' + _name)
if translator.builder.format == 'latex': if translator.builder.format == 'latex' and not dot_Tpdf:
svg_fname = path.join(translator.builder.outdir, fname + '.svg') svg_fname = path.join(translator.builder.outdir, fname + '.svg')
ok1 = dot2format(app, src_fname, svg_fname) ok1 = dot2format(app, src_fname, svg_fname)
ok2 = svg2pdf_by_rsvg(app, svg_fname, dst_fname) ok2 = svg2pdf_by_rsvg(app, svg_fname, dst_fname)
ok = ok1 and ok2 ok = ok1 and ok2
else: else:
ok = dot2format(app, src_fname, dst_fname) ok = dot2format(app, src_fname, dst_fname)
......
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