You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
106 lines
3.3 KiB
106 lines
3.3 KiB
4 months ago
|
#!/usr/bin/env python3
|
||
|
|
||
|
import argparse
|
||
|
import datetime
|
||
|
import errno
|
||
|
import os
|
||
|
import subprocess
|
||
|
import sys
|
||
|
|
||
|
# Custom configuration for each documentation format
|
||
|
doxygen_templates = {
|
||
|
'xml': [
|
||
|
'GENERATE_XML=YES\n',
|
||
|
'XML_OUTPUT={format}/{section}\n',
|
||
|
'INPUT= {files}\n',
|
||
|
],
|
||
|
'html': [
|
||
|
'GENERATE_HTML=YES\n',
|
||
|
'HTML_OUTPUT={format}/{section}\n',
|
||
|
'PROJECT_NAME=\"Wayland {section} API\"\n',
|
||
|
'INPUT= {files}\n',
|
||
|
],
|
||
|
'man': [
|
||
|
'GENERATE_MAN=YES\n',
|
||
|
'MAN_OUTPUT={format}\n',
|
||
|
'MAN_SUBDIR=.\n',
|
||
|
'JAVADOC_AUTOBRIEF=NO\n',
|
||
|
'INPUT= {files}\n',
|
||
|
],
|
||
|
}
|
||
|
|
||
|
def load_doxygen_file(doxyfile):
|
||
|
with open(doxyfile, 'r') as f:
|
||
|
res = f.readlines()
|
||
|
return res
|
||
|
|
||
|
def get_template(outformat):
|
||
|
for (k,v) in doxygen_templates.items():
|
||
|
if outformat.startswith(k):
|
||
|
return v
|
||
|
|
||
|
def gen_doxygen_file(data, outformat, section, files):
|
||
|
for l in get_template(outformat):
|
||
|
data.append(l.format(format=outformat, section=section, files=' '.join(files)))
|
||
|
return data
|
||
|
|
||
|
parser = argparse.ArgumentParser(description='Generate docs with Doxygen')
|
||
|
parser.add_argument('doxygen_file',
|
||
|
help='The doxygen file to use')
|
||
|
parser.add_argument('files',
|
||
|
help='The list of files to parse',
|
||
|
metavar='FILES',
|
||
|
nargs='+')
|
||
|
parser.add_argument('--builddir',
|
||
|
help='The build directory',
|
||
|
metavar='DIR',
|
||
|
default='.')
|
||
|
parser.add_argument('--section',
|
||
|
help='The section to build',
|
||
|
metavar='NAME',
|
||
|
default='Client')
|
||
|
parser.add_argument('--output-format',
|
||
|
help='The output format: xml, html, man',
|
||
|
metavar='FORMAT',
|
||
|
default='xml')
|
||
|
parser.add_argument('--stamp',
|
||
|
help='Stamp file to output',
|
||
|
metavar='STAMP_FILE',
|
||
|
nargs='?',
|
||
|
type=argparse.FileType('w'))
|
||
|
|
||
|
args = parser.parse_args()
|
||
|
|
||
|
# Merge the doxyfile with our custom templates
|
||
|
conf = load_doxygen_file(args.doxygen_file)
|
||
|
conf = gen_doxygen_file(conf, args.output_format, args.section, args.files)
|
||
|
|
||
|
# Doxygen is not clever enough to create the directories it
|
||
|
# needs beforehand
|
||
|
try:
|
||
|
os.makedirs(os.path.join(args.builddir, args.output_format))
|
||
|
except OSError as e:
|
||
|
if e.errno != errno.EEXIST:
|
||
|
raise e
|
||
|
|
||
|
# Run Doxygen with the generated doxyfile
|
||
|
cmd = subprocess.Popen(['doxygen', '-'], stdin=subprocess.PIPE)
|
||
|
cmd.stdin.write(''.join(conf).encode('utf-8'))
|
||
|
cmd.stdin.close()
|
||
|
if cmd.wait() != 0:
|
||
|
sys.exit(1)
|
||
|
|
||
|
# This is a bit of a hack; Doxygen will generate way more files than we
|
||
|
# want to install, but there's no way to know how many at configuration
|
||
|
# time. Since we want to install only the wl_* man pages anyway, we can
|
||
|
# delete the other files and let Meson install the whole man3 subdirectory
|
||
|
if args.output_format.startswith('man'):
|
||
|
manpath = os.path.join(args.builddir, args.output_format)
|
||
|
for filename in os.listdir(manpath):
|
||
|
full_path = os.path.join(manpath, filename)
|
||
|
if not filename.startswith('wl_'):
|
||
|
os.remove(full_path)
|
||
|
|
||
|
if args.stamp:
|
||
|
args.stamp.write(str(datetime.datetime.now()))
|