1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189
|
#!/usr/bin/env python3
# External command, intended to be called with run_command(), custom_target(),
# meson.add_install_script() or meson.add_dist_script() in meson.build.
# argv[1] argv[2] argv[3:]
# doc-reference.py <subcommand> <MMDOCTOOLDIR> <xxx>...
# <MMDOCTOOLDIR> is an absolute path in the source directory.
import os
import sys
import subprocess
import shutil
subcommand = sys.argv[1]
MMDOCTOOLDIR = sys.argv[2]
# Invoked from custom_target() in meson.build.
def doxygen():
# argv[3] argv[4:]
# <doxytagfile> <doc_input_files>...
# <doxytagfile> is a relative or absolute path in the build directory.
# <doc_input_files> are absolute paths in the source or build directory.
doxytagfile = sys.argv[3]
doc_outdir = os.path.dirname(doxytagfile)
# Search for doc_postprocess.py first in MMDOCTOOLDIR.
sys.path.insert(0, MMDOCTOOLDIR)
from doc_postprocess import doc_postprocess
# Export this variable for use in the Doxygen configuration file.
child_env = os.environ.copy()
child_env['MMDOCTOOLDIR'] = MMDOCTOOLDIR
# Remove old files.
if os.path.isfile(doxytagfile):
os.remove(doxytagfile)
shutil.rmtree(os.path.join(doc_outdir, 'html'), ignore_errors=True)
# Relative paths in Doxyfile assume that Doxygen is run from the
# build directory one level above Doxyfile.
doxygen_cwd = os.path.join(doc_outdir, '..')
DOXYGEN = child_env.get('DOXYGEN', None)
if not DOXYGEN:
DOXYGEN = 'doxygen'
doxygen_input = '@INCLUDE = ' + os.path.join('reference', 'Doxyfile') + '\n' \
+ 'INPUT = "' + '" "'.join(sys.argv[4:]) + '"\n'
# (Starting with Python 3.7 text=True is a more understandable equivalent to
# universal_newlines=True. Let's use only features in Python 3.5.)
result = subprocess.run([DOXYGEN, '-'], input=doxygen_input,
universal_newlines=True, env=child_env, cwd=doxygen_cwd)
if result.returncode:
return result.returncode
return doc_postprocess(os.path.join(doc_outdir, 'html', '*.html'))
# Invoked from custom_target() in meson.build.
def devhelp():
# argv[3] argv[4] argv[5] argv[6]
# <doxytagfile> <devhelpfile> <book_name> <book_title>
# <doxytagfile> and <devhelpfile> are relative or absolute paths in the build directory.
doxytagfile = sys.argv[3]
devhelpfile = sys.argv[4]
book_name = sys.argv[5]
book_title = sys.argv[6]
tagfile_to_devhelp = os.path.join(MMDOCTOOLDIR, 'tagfile-to-devhelp2.xsl')
# The parameters to the Doxygen-to-Devhelp XSLT script.
cmd = [
'xsltproc',
'--stringparam', 'book_title', book_title,
'--stringparam', 'book_name', book_name,
'--stringparam', 'book_base', 'html',
'-o', devhelpfile,
tagfile_to_devhelp,
doxytagfile,
]
return subprocess.run(cmd).returncode
# Invoked from meson.add_install_script().
def install_doc():
# argv[3] argv[4] argv[5] argv[6:]
# <devhelpfile> <devhelpdir> <htmlrefdir> <docinstall_flags>...
# <devhelpfile> is a relative or absolute path in the build directory.
# <htmlrefdir> and <devhelpdir> are installation directories, relative to {prefix}.
devhelpfile = sys.argv[3]
destdir_devhelpdir = os.path.join(os.getenv('MESON_INSTALL_DESTDIR_PREFIX'), sys.argv[4])
destdir_htmlrefdir = os.path.join(os.getenv('MESON_INSTALL_DESTDIR_PREFIX'), sys.argv[5])
prefix_htmlrefdir = os.path.join(os.getenv('MESON_INSTALL_PREFIX'), sys.argv[5])
build_dir = os.path.dirname(devhelpfile)
# Search for doc_install.py first in MMDOCTOOLDIR.
sys.path.insert(0, MMDOCTOOLDIR)
from doc_install import doc_install_cmdargs, doc_install_funcargs
# Create the installation directories, if they do not exist.
os.makedirs(destdir_htmlrefdir, exist_ok=True)
os.makedirs(destdir_devhelpdir, exist_ok=True)
verbose = []
if not os.getenv('MESON_INSTALL_QUIET'):
verbose = ['--verbose']
# Install html files.
cmdargs = [
'--mode=0o644',
] + verbose + sys.argv[6:] + [
'-t', destdir_htmlrefdir,
'--glob',
'--',
os.path.join(build_dir, 'html', '*'),
]
result1 = doc_install_cmdargs(cmdargs)
# Install the Devhelp file.
# rstrip('/') means remove trailing /, if any.
result2 = doc_install_funcargs(
sources=[devhelpfile],
target=destdir_devhelpdir,
target_is_dir=True,
mode=0o644,
verbose=bool(verbose),
book_base=prefix_htmlrefdir.rstrip('/'),
)
return max(result1, result2)
# Invoked from meson.add_dist_script().
def dist_doc():
# argv[3] argv[4] argv[5] argv[6]
# <doctool_dist_dir> <doc_ref_build_dir> <tagfile> <devhelpfile>
# <doctool_dist_dir> is a distribution directory, relative to MESON_PROJECT_DIST_ROOT.
# <doc_ref_build_dir> is a relative or absolute path in the build directory.
# <tagfile> and <devhelpfile> are relative or absolute paths in the build directory.
# MESON_PROJECT_DIST_ROOT is set only if meson.version() >= 0.58.0.
project_dist_root = os.getenv('MESON_PROJECT_DIST_ROOT', os.getenv('MESON_DIST_ROOT'))
doctool_dist_dir = os.path.join(project_dist_root, sys.argv[3])
doc_ref_build_dir = sys.argv[4]
tagfile = sys.argv[5]
devhelpfile = sys.argv[6]
# Create the distribution directory, if it does not exist.
os.makedirs(os.path.join(doctool_dist_dir, 'reference'), exist_ok=True)
# Distribute files that mm-common-get has copied to MMDOCTOOLDIR.
# shutil.copy() does not copy timestamps.
for file in ['doc_install.py', 'doc_postprocess.py', 'doxygen-extra.css', 'tagfile-to-devhelp2.xsl']:
shutil.copy(os.path.join(MMDOCTOOLDIR, file), doctool_dist_dir)
# Distribute built files: tag file, devhelp file, html files.
for file in [tagfile, devhelpfile]:
shutil.copy(file, os.path.join(doctool_dist_dir, 'reference'))
shutil.copytree(os.path.join(doc_ref_build_dir, 'html'),
os.path.join(doctool_dist_dir, 'reference', 'html'),
copy_function=shutil.copy)
return 0
# Invoked from run_command() in meson.build.
def get_script_property():
# argv[3]
# <property>
# argv[2] (MMDOCTOOLDIR) is not used.
prop = sys.argv[3]
if prop == 'requires_perl':
print('false', end='') # stdout can be read in the meson.build file.
return 0
print(sys.argv[0], ': unknown property,', prop)
return 1
# ----- Main -----
if subcommand == 'doxygen':
sys.exit(doxygen())
if subcommand == 'devhelp':
sys.exit(devhelp())
if subcommand == 'install_doc':
sys.exit(install_doc())
if subcommand == 'dist_doc':
sys.exit(dist_doc())
if subcommand == 'get_script_property':
sys.exit(get_script_property())
print(sys.argv[0], ': illegal subcommand,', subcommand)
sys.exit(1)
|