| #!/usr/bin/env python3 | |
| # Copyright 2013 The Flutter Authors. All rights reserved. | |
| # Use of this source code is governed by a BSD-style license that can be | |
| # found in the LICENSE file. | |
| # Generates API docs for Flutter embedders and libraries. | |
| import os | |
| import shutil | |
| import tempfile | |
| import zipfile | |
| import sys | |
| import subprocess | |
| from collections import namedtuple | |
| Section = namedtuple('Section', ['title', 'inputs']) | |
| SECTIONS = { | |
| 'ios': | |
| Section( | |
| 'iOS Embedder', [ | |
| 'shell/platform/darwin/ios', | |
| 'shell/platform/darwin/common', | |
| 'shell/platform/common', | |
| ] | |
| ), | |
| 'macos': | |
| Section( | |
| 'macOS Embedder', [ | |
| 'shell/platform/darwin/macos', | |
| 'shell/platform/darwin/common', | |
| 'shell/platform/common', | |
| ] | |
| ), | |
| 'linux': | |
| Section('Linux Embedder', [ | |
| 'shell/platform/linux', | |
| 'shell/platform/common', | |
| ]), | |
| 'windows': | |
| Section('Windows Embedder', [ | |
| 'shell/platform/windows', | |
| 'shell/platform/common', | |
| ]), | |
| 'impeller': | |
| Section('Impeller', [ | |
| 'impeller', | |
| ]), | |
| } | |
| def generate_doxyfile(section, output_dir, log_file, doxy_file): | |
| doxyfile = open('docs/Doxyfile.template', 'r').read() | |
| doxyfile = doxyfile.replace('@@OUTPUT_DIRECTORY@@', output_dir) | |
| doxyfile = doxyfile.replace('@@LOG_FILE@@', log_file) | |
| doxyfile = doxyfile.replace('@@INPUT_DIRECTORIES@@', '"{}"'.format('" "'.join(section.inputs))) | |
| doxyfile = doxyfile.replace('@@PROJECT_NAME@@', 'Flutter {}'.format(section.title)) | |
| doxyfile = doxyfile.replace( | |
| '@@DOCSET_FEEDNAME@@', 'Flutter {} Documentation'.format(section.title) | |
| ) | |
| with open(doxy_file, 'w') as f: | |
| f.write(doxyfile) | |
| def process_section(name, section, destination): | |
| output_dir = tempfile.mkdtemp(prefix="doxygen") | |
| log_file = os.path.join(destination, '{}-doxygen.log'.format(name)) | |
| zip_file = os.path.join(destination, '{}-docs.zip'.format(name)) | |
| doxy_file = os.path.join(output_dir, 'Doxyfile') | |
| generate_doxyfile(section, output_dir, log_file, doxy_file) | |
| # Update the Doxyfile format to the latest format. | |
| subprocess.call(['doxygen', '-u'], cwd=output_dir) | |
| subprocess.call(['doxygen', doxy_file]) | |
| html_dir = os.path.join(output_dir, 'html') | |
| with zipfile.ZipFile(zip_file, 'w') as zip: | |
| for root, _, files in os.walk(html_dir): | |
| for file in files: | |
| filename = os.path.join(root, file) | |
| zip.write(filename, os.path.relpath(filename, html_dir)) | |
| print('Wrote ZIP file for {} to {}'.format(section, zip_file)) | |
| print('Preserving log file in {}'.format(log_file)) | |
| shutil.rmtree(output_dir, ignore_errors=True) | |
| def generate_docs(argv): | |
| if len(argv) != 2: | |
| print( | |
| 'Error: Argument specifying output directory required. ' | |
| 'Directory may be an absolute path, or a relative path from the "src" directory.' | |
| ) | |
| exit(1) | |
| destination = argv[1] | |
| script_path = os.path.realpath(__file__) | |
| src_path = os.path.dirname(os.path.dirname(os.path.dirname(script_path))) | |
| # Run commands from the Flutter root dir. | |
| os.chdir(os.path.join(src_path, 'flutter')) | |
| # If the argument isn't an absolute path, assume that it is relative to the src dir. | |
| if not os.path.isabs(destination): | |
| destination = os.path.join(src_path, destination) | |
| os.makedirs(destination, exist_ok=True) | |
| for name, section in SECTIONS.items(): | |
| process_section(name, section, destination) | |
| if __name__ == '__main__': | |
| generate_docs(sys.argv) |