174 lines
4.6 KiB
Python
Executable File
174 lines
4.6 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
|
|
# External command, intended to be called with custom_target() in meson.build
|
|
|
|
# argv[1] argv[2:]
|
|
# tutorial-custom-cmd.py <subcommand> <xxx>...
|
|
|
|
import os
|
|
import sys
|
|
import subprocess
|
|
from pathlib import Path
|
|
import shutil
|
|
|
|
subcommand = sys.argv[1]
|
|
|
|
def html():
|
|
# argv[2] argv[3]
|
|
# <input_xml_file> <output_html_dir>
|
|
|
|
input_xml_file = sys.argv[2]
|
|
output_html_dir = sys.argv[3]
|
|
|
|
# For a list of available parameters, see http://docbook.sourceforge.net/release/xsl/current/doc/html/
|
|
xslt_params = []
|
|
|
|
xslt_stylesheet = 'http://docbook.sourceforge.net/release/xsl/current/html/chunk.xsl'
|
|
|
|
# Remove old files and create the destination directory.
|
|
shutil.rmtree(output_html_dir, ignore_errors=True)
|
|
os.makedirs(output_html_dir, exist_ok=True)
|
|
|
|
cmd = [
|
|
'xsltproc',
|
|
] + xslt_params + [
|
|
'-o', output_html_dir + '/',
|
|
'--xinclude',
|
|
xslt_stylesheet,
|
|
input_xml_file,
|
|
]
|
|
result = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
|
|
universal_newlines=True)
|
|
# xsltproc prints the names of all written files. Don't print those lines.
|
|
for line in result.stdout.splitlines():
|
|
if not line.startswith('Writing '):
|
|
print(line)
|
|
|
|
return result.returncode
|
|
|
|
def xmllint():
|
|
# argv[2] argv[3] argv[4]
|
|
# <validate> <input_xml_file> <stamp_file_path>
|
|
|
|
validate = sys.argv[2]
|
|
input_xml_file = sys.argv[3]
|
|
stamp_file_path = sys.argv[4]
|
|
|
|
cmd = [
|
|
'xmllint',
|
|
'--noout',
|
|
'--noent',
|
|
'--xinclude',
|
|
]
|
|
if validate == 'true':
|
|
cmd += ['--postvalid']
|
|
cmd += [input_xml_file]
|
|
result = subprocess.run(cmd)
|
|
if result.returncode:
|
|
return result.returncode
|
|
|
|
Path(stamp_file_path).touch(exist_ok=True)
|
|
return 0
|
|
|
|
def dblatex():
|
|
# argv[2] argv[3]
|
|
# <input_xml_file> <output_pdf_file>
|
|
# Create a PDF file, using dblatex.
|
|
|
|
input_xml_file = sys.argv[2]
|
|
output_pdf_file = sys.argv[3]
|
|
|
|
# For a list of available parameters, see http://dblatex.sourceforge.net/doc/manual/
|
|
dblatex_params = [
|
|
'-P', 'toc.section.depth=2',
|
|
'-P', 'paper.type=a4paper',
|
|
]
|
|
|
|
cmd = [
|
|
'dblatex',
|
|
] + dblatex_params + [
|
|
'-o', output_pdf_file,
|
|
'--pdf', input_xml_file,
|
|
]
|
|
return subprocess.run(cmd).returncode
|
|
|
|
def docbook2pdf():
|
|
# argv[2] argv[3]
|
|
# <input_xml_file> <output_pdf_file>
|
|
# Create a PDF file, using docbook2pdf.
|
|
|
|
input_xml_file = sys.argv[2]
|
|
output_pdf_file = sys.argv[3]
|
|
|
|
output_dir = os.path.dirname(output_pdf_file)
|
|
if not output_dir:
|
|
output_dir = '.'
|
|
output_basename = os.path.basename(output_pdf_file)
|
|
if output_basename.endswith('.pdf'):
|
|
output_basename = output_basename[:-4]
|
|
xml_file = os.path.join(output_dir, output_basename + '.xml')
|
|
|
|
# We need to produce an XML file with all of the XIncludes done.
|
|
cmd = [
|
|
'xmllint',
|
|
'--xinclude',
|
|
'--postvalid',
|
|
'--output', xml_file,
|
|
input_xml_file,
|
|
]
|
|
result = subprocess.run(cmd)
|
|
if result.returncode:
|
|
return result.returncode
|
|
|
|
cmd = [
|
|
'docbook2pdf',
|
|
'--output', output_dir,
|
|
xml_file,
|
|
]
|
|
return subprocess.run(cmd).returncode
|
|
|
|
# Invoked from meson.add_dist_script().
|
|
def dist_doc():
|
|
# argv[2] argv[3] argv[4] argv[5]
|
|
# <doc_dist_dir> <doc_build_dir> <xml_file> <pdf_file>
|
|
|
|
# <doc_dist_dir> is a distribution directory, relative to MESON_DIST_ROOT.
|
|
# <doc_build_dir> is a relative or absolute path in the build directory.
|
|
# <xml_file> is a relative or absolute path in the source directory.
|
|
# <pdf_file> is a relative or absolute path in the build directory.
|
|
doc_dist_dir = os.path.join(os.getenv('MESON_DIST_ROOT'), sys.argv[2])
|
|
doc_build_dir = sys.argv[3]
|
|
xml_file = sys.argv[4]
|
|
pdf_file = sys.argv[5]
|
|
|
|
# Create the distribution directory, if it does not exist.
|
|
os.makedirs(doc_dist_dir, exist_ok=True)
|
|
|
|
# Distribute built html files.
|
|
shutil.copytree(os.path.join(doc_build_dir, 'html'),
|
|
os.path.join(doc_dist_dir, 'html'),
|
|
copy_function=shutil.copy)
|
|
|
|
# If there is an updated PDF file, distribute it.
|
|
if os.path.isfile(pdf_file) and \
|
|
os.stat(pdf_file).st_mtime > os.stat(xml_file).st_mtime:
|
|
shutil.copy(pdf_file, doc_dist_dir)
|
|
else:
|
|
print('--- Info: No updated PDF file found.')
|
|
|
|
return 0
|
|
|
|
# ----- Main -----
|
|
if subcommand == 'html':
|
|
sys.exit(html())
|
|
if subcommand == 'xmllint':
|
|
sys.exit(xmllint())
|
|
if subcommand == 'dblatex':
|
|
sys.exit(dblatex())
|
|
if subcommand == 'docbook2pdf':
|
|
sys.exit(docbook2pdf())
|
|
if subcommand == 'dist_doc':
|
|
sys.exit(dist_doc())
|
|
print(sys.argv[0], ': illegal subcommand,', subcommand)
|
|
sys.exit(1)
|