xref: /aosp_15_r20/development/tools/ndk/build_ndk_docs.py (revision 90c8c64db3049935a07c6143d7fd006e26f8ecca)
1*90c8c64dSAndroid Build Coastguard Worker#!/usr/bin/env python3
2*90c8c64dSAndroid Build Coastguard Worker#
3*90c8c64dSAndroid Build Coastguard Worker# Copyright (C) 2020 The Android Open Source Project
4*90c8c64dSAndroid Build Coastguard Worker#
5*90c8c64dSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
6*90c8c64dSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
7*90c8c64dSAndroid Build Coastguard Worker# You may obtain a copy of the License at
8*90c8c64dSAndroid Build Coastguard Worker#
9*90c8c64dSAndroid Build Coastguard Worker#      http://www.apache.org/licenses/LICENSE-2.0
10*90c8c64dSAndroid Build Coastguard Worker#
11*90c8c64dSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
12*90c8c64dSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
13*90c8c64dSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*90c8c64dSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
15*90c8c64dSAndroid Build Coastguard Worker# limitations under the License.
16*90c8c64dSAndroid Build Coastguard Worker#
17*90c8c64dSAndroid Build Coastguard Worker"""Generates the NDK API docs for local viewing.
18*90c8c64dSAndroid Build Coastguard Worker
19*90c8c64dSAndroid Build Coastguard WorkerNote that the local docs will not exactly match the docs that are uploaded to
20*90c8c64dSAndroid Build Coastguard Workerdevsite. The theming is different and the per-file view is not available.
21*90c8c64dSAndroid Build Coastguard WorkerEnsure that your documentation is accessible from the module view or it will
22*90c8c64dSAndroid Build Coastguard Workernot be discoverable on devsite.
23*90c8c64dSAndroid Build Coastguard Worker"""
24*90c8c64dSAndroid Build Coastguard Workerimport argparse
25*90c8c64dSAndroid Build Coastguard Workerimport os
26*90c8c64dSAndroid Build Coastguard Workerfrom pathlib import Path
27*90c8c64dSAndroid Build Coastguard Workerimport shutil
28*90c8c64dSAndroid Build Coastguard Workerimport subprocess
29*90c8c64dSAndroid Build Coastguard Workerimport sys
30*90c8c64dSAndroid Build Coastguard Worker
31*90c8c64dSAndroid Build Coastguard WorkerTHIS_DIR = Path(__file__).resolve().parent
32*90c8c64dSAndroid Build Coastguard WorkerANDROID_TOP = THIS_DIR.parents[2]
33*90c8c64dSAndroid Build Coastguard Worker
34*90c8c64dSAndroid Build Coastguard Worker
35*90c8c64dSAndroid Build Coastguard Workerdef check_environment() -> None:
36*90c8c64dSAndroid Build Coastguard Worker    """Validates that we have everything we need from the environment."""
37*90c8c64dSAndroid Build Coastguard Worker    if shutil.which('doxygen') is None:
38*90c8c64dSAndroid Build Coastguard Worker        sys.exit('Doxygen not found. Run `sudo apt install doxygen`.')
39*90c8c64dSAndroid Build Coastguard Worker
40*90c8c64dSAndroid Build Coastguard Worker    if 'ANDROID_PRODUCT_OUT' not in os.environ:
41*90c8c64dSAndroid Build Coastguard Worker        sys.exit('Could not find ANDROID_PRODUCT_OUT. Run lunch.')
42*90c8c64dSAndroid Build Coastguard Worker
43*90c8c64dSAndroid Build Coastguard Worker
44*90c8c64dSAndroid Build Coastguard Workerdef build_ndk() -> None:
45*90c8c64dSAndroid Build Coastguard Worker    """Builds the NDK sysroot."""
46*90c8c64dSAndroid Build Coastguard Worker    subprocess.run(["build/soong/soong_ui.bash", "--make-mode", "ndk"],
47*90c8c64dSAndroid Build Coastguard Worker                   cwd=ANDROID_TOP,
48*90c8c64dSAndroid Build Coastguard Worker                   check=True)
49*90c8c64dSAndroid Build Coastguard Worker
50*90c8c64dSAndroid Build Coastguard Worker
51*90c8c64dSAndroid Build Coastguard Workerdef generate_docs() -> None:
52*90c8c64dSAndroid Build Coastguard Worker    """Generates the NDK API reference."""
53*90c8c64dSAndroid Build Coastguard Worker    product_out = Path(os.environ['ANDROID_PRODUCT_OUT'])
54*90c8c64dSAndroid Build Coastguard Worker    out_dir = product_out.parents[1] / 'common/ndk-docs'
55*90c8c64dSAndroid Build Coastguard Worker    html_dir = out_dir / 'html'
56*90c8c64dSAndroid Build Coastguard Worker    input_dir = product_out.parents[2] / 'soong/ndk/sysroot/usr/include'
57*90c8c64dSAndroid Build Coastguard Worker    doxyfile_template = ANDROID_TOP / 'frameworks/native/docs/Doxyfile'
58*90c8c64dSAndroid Build Coastguard Worker    out_dir.mkdir(parents=True, exist_ok=True)
59*90c8c64dSAndroid Build Coastguard Worker    doxyfile = out_dir / 'Doxyfile'
60*90c8c64dSAndroid Build Coastguard Worker
61*90c8c64dSAndroid Build Coastguard Worker    doxyfile_contents = doxyfile_template.read_text()
62*90c8c64dSAndroid Build Coastguard Worker    doxyfile_contents += f'\nINPUT={input_dir}\nHTML_OUTPUT={html_dir}'
63*90c8c64dSAndroid Build Coastguard Worker    doxyfile.write_text(doxyfile_contents)
64*90c8c64dSAndroid Build Coastguard Worker
65*90c8c64dSAndroid Build Coastguard Worker    subprocess.run(['doxygen', str(doxyfile)], cwd=ANDROID_TOP, check=True)
66*90c8c64dSAndroid Build Coastguard Worker    index = html_dir / 'index.html'
67*90c8c64dSAndroid Build Coastguard Worker    print(f'Generated NDK API documentation to {index.as_uri()}')
68*90c8c64dSAndroid Build Coastguard Worker
69*90c8c64dSAndroid Build Coastguard Worker
70*90c8c64dSAndroid Build Coastguard Workerdef parse_args() -> argparse.Namespace:
71*90c8c64dSAndroid Build Coastguard Worker    """Parses command line arguments."""
72*90c8c64dSAndroid Build Coastguard Worker    parser = argparse.ArgumentParser(description=sys.modules[__name__].__doc__)
73*90c8c64dSAndroid Build Coastguard Worker    return parser.parse_args()
74*90c8c64dSAndroid Build Coastguard Worker
75*90c8c64dSAndroid Build Coastguard Worker
76*90c8c64dSAndroid Build Coastguard Workerdef main() -> None:
77*90c8c64dSAndroid Build Coastguard Worker    """Program entry point."""
78*90c8c64dSAndroid Build Coastguard Worker    _ = parse_args()
79*90c8c64dSAndroid Build Coastguard Worker    check_environment()
80*90c8c64dSAndroid Build Coastguard Worker    build_ndk()
81*90c8c64dSAndroid Build Coastguard Worker    generate_docs()
82*90c8c64dSAndroid Build Coastguard Worker
83*90c8c64dSAndroid Build Coastguard Worker
84*90c8c64dSAndroid Build Coastguard Workerif __name__ == '__main__':
85*90c8c64dSAndroid Build Coastguard Worker    main()
86