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