diff options
author | Kjell Ahlstedt <kjellahlstedt@gmail.com> | 2019-12-10 13:10:14 +0100 |
---|---|---|
committer | Kjell Ahlstedt <kjellahlstedt@gmail.com> | 2019-12-20 12:54:50 +0100 |
commit | f0327f7731976b0efe1e295adabdb1a52bb4bef3 (patch) | |
tree | 7f951a43f9105f935361820be836076572b64842 /tools/tutorial-custom-cmd.py | |
parent | b18ebf48ea73afdda86215121c5432ca509d424e (diff) | |
download | sigc++-f0327f7731976b0efe1e295adabdb1a52bb4bef3.tar.gz |
Add support for building libsigc++-3.0 with Meson
libsigc++-3.0 can be built with either Autotools or Meson.
Diffstat (limited to 'tools/tutorial-custom-cmd.py')
-rwxr-xr-x | tools/tutorial-custom-cmd.py | 173 |
1 files changed, 173 insertions, 0 deletions
diff --git a/tools/tutorial-custom-cmd.py b/tools/tutorial-custom-cmd.py new file mode 100755 index 0000000..85b22e7 --- /dev/null +++ b/tools/tutorial-custom-cmd.py @@ -0,0 +1,173 @@ +#!/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) |