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