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
|
#!/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()))
|