mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
## Description This turns off the Doxyfile option `CREATE_SUBDIRS` because it prevents deep link URLs from being stable. It means that thousands of files will be in the main directory, but the filesystem should be able to handle that. I got rid of the header/footer files for doxygen (because Doxygen will generate them anyhow) and fixed where it was looking for the Flutter logo. I also ran Doxygen on the Doxyfile template and Doxyfile and updated all the options to correspond with the latest Doxygen.
113 lines
3.6 KiB
Python
Executable File
113 lines
3.6 KiB
Python
Executable File
#!/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@@', ' '.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)
|