Greg Spencer 2bcecf60c9 Change Doxyfile options to not create subdirs (flutter/engine#44855)
## 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.
2023-08-21 17:39:06 +00:00

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)