rtems-docs/common/latex.py

169 lines
6.2 KiB
Python

#
# Support for Latex used to build the PDF output format.
#
import os
import platform
import re
package_test_preamble = ['\\newif\\ifsphinxKeepOldNames \\sphinxKeepOldNamestrue',
'\documentclass[a4paper,11pt,english]{report}']
package_test_postamble = ['\\begin{document} test \\end{document}']
package_tests = {
'Bjarne' : ['\\usepackage[Bjarne]{fncychap}'],
'alltt' : ['\\usepackage{alltt}'],
'amsmath' : ['\\usepackage{amsmath}'],
'amssymb' : ['\\usepackage{amssymb}'],
'amstext' : ['\\usepackage{amstext}'],
'array' : ['\\usepackage{array}'],
'atbegshi' : ['\\usepackage{atbegshi}'],
'babel' : ['\\usepackage{babel}'],
'babel' : ['\\usepackage{babel}'],
'calc' : ['\\usepackage{calc}'],
'capt-of' : ['\\usepackage{capt-of}'],
'charter' : ['\\usepackage{charter}'],
'cmap' : ['\\usepackage{cmap}'],
'color' : ['\\usepackage{color}'],
'eqparbox' : ['\\usepackage{eqparbox}'],
'enumitem' : ['\\usepackage{enumitem}'],
'etoolbox' : ['\\usepackage{etoolbox}'],
'fancybox' : ['\\usepackage{fancybox}'],
'fancyhdr' : ['\\usepackage{fancyhdr}'],
'fancyvrb' : ['\\usepackage{fancyvrb}'],
'float' : ['\\usepackage{float}'],
'fncychap' : ['\\usepackage{fncychap}'],
'fontenc' : ['\\usepackage[T1]{fontenc}'],
'footnote' : ['\\usepackage{footnote}'],
'framed' : ['\\usepackage{framed}'],
'graphicx' : ['\\usepackage{graphicx}'],
'hypcap' : ['\\usepackage{hyperref}',
'\\usepackage{hypcap}'],
'hyperref' : ['\\usepackage{hyperref}'],
'inconsolata' : ['\\usepackage{inconsolata}'],
'ifplatform' : ['\\usepackage{ifplatform}'],
'ifthen' : ['\\usepackage{ifthen}'],
'inputenc' : ['\\usepackage{inputenc}'],
'keyval' : ['\\usepackage{keyval}'],
'kvoptions' : ['\\usepackage{kvoptions}'],
'lato' : ['\\usepackage{lato}'],
'lineno' : ['\\usepackage{lineno}'],
'longtable' : ['\\usepackage{longtable}'],
'makeidx' : ['\\usepackage{makeidx}'],
'multirow' : ['\\usepackage{multirow}'],
'parskip' : ['\\usepackage{parskip}'],
'pdftexcmds' : ['\\usepackage{pdftexcmds}'],
'textcomp' : ['\\usepackage{textcomp}'],
'threeparttable' : ['\\usepackage{threeparttable}'],
'times' : ['\\usepackage{times}'],
'titlesec' : ['\\usepackage{titlesec}'],
'upquote' : ['\\usepackage{upquote}'],
'utf8' : ['\\usepackage[utf8]{inputenc}'],
'wrapfig' : ['\\usepackage{wrapfig}'],
'xcolor' : ['\\usepackage{xcolor}'],
'xstring' : ['\\usepackage{xstring}'],
}
package_optional = ['inconsolata',
'lato']
#
# Add per host support. If there is a version clash for the same texlive
# package create a directory, add to that directory and use the path in this
# name here.
#
hosts = {
# All versions of CentOS until told otherwise
'Linux/centos' : { '.*' : ['capt-of.sty',
'eqparbox.sty',
'environ.sty',
'ifplatform.sty',
'trimspaces.sty',
'slantsc.sty',
'upquote.sty'] }
}
def tex_test(test):
return os.linesep.join(package_test_preamble +
package_tests[test] +
package_test_postamble)
def host_name():
uname = os.uname()
if uname[0] == 'Linux':
distro = platform.dist()
name = '%s/%s' % (uname[0], distro[0])
version = distro[1]
else:
name = uname[0]
version = uname[2]
return name, version
def local_packages():
host, version = host_name()
packages = None
if host in hosts:
for hv in list(hosts[host].keys()):
if re.compile(hv).match(version) is not None:
packages = hosts[host][hv]
return packages
def configure_tests(conf):
#
# Using a hint from ita (thank you) :
# https://github.com/waf-project/waf/blob/master/demos/tex/wscript
#
def build_latex_test(bld):
def write_tex_test(tsk):
tsk.outputs[0].write(tex_test(tsk.env.TEST))
test = bld.kw['tex_test']
bld.env.TEST = test
bld.to_log('%s.tex %s' % (test, '=' * (40 - len(test) + 5)))
bld.to_log(tex_test(test))
bld.to_log('=' * 40)
bld(rule = write_tex_test, target = 'main.tex')
bld(features = 'tex', type = 'pdflatex', source = 'main.tex', prompt = 0)
tests = sorted(package_tests.keys())
local_packs = local_packages()
excludes = [p for p in package_optional]
if local_packs is not None:
excludes += [p[:p.rfind('.')] for p in local_packs]
for e in excludes:
if e in tests:
tests.remove(e)
fails = 0
r = conf.find_program("pygmentize", mandatory = False)
if r is None:
fails += 1
for t in tests:
r = conf.test(build_fun = build_latex_test,
msg = "Checking for Tex package '%s'" % (t),
tex_test = t,
okmsg = 'ok',
errmsg = 'not found (please install)',
mandatory = False)
if r is None:
fails += 1
if fails > 0:
conf.fatal('There are %d Tex package failures. Please fix.' % (fails))
fails = 0
for t in package_optional:
r = conf.test(build_fun = build_latex_test,
msg = "Checking for Tex package '%s'" % (t),
tex_test = t,
okmsg = 'ok',
errmsg = 'not found (degraded fonts)',
mandatory = False)
if r is None:
fails += 1
if fails == 0:
conf.env.RTEMSEXTRAFONTS = 'rtemsextrafonts.sty'
else:
if not conf.options.disable_extra_fonts:
conf.fatal('Extra fonts not found, install or use --disable-extra-fonts')
conf.env.RTEMSEXTRAFONTS = 'rtemsextrafonts-null.sty'