1*61c4878aSAndroid Build Coastguard Worker# Copyright 2023 The Pigweed Authors 2*61c4878aSAndroid Build Coastguard Worker# 3*61c4878aSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); you may not 4*61c4878aSAndroid Build Coastguard Worker# use this file except in compliance with the License. You may obtain a copy of 5*61c4878aSAndroid Build Coastguard Worker# the License at 6*61c4878aSAndroid Build Coastguard Worker# 7*61c4878aSAndroid Build Coastguard Worker# https://www.apache.org/licenses/LICENSE-2.0 8*61c4878aSAndroid Build Coastguard Worker# 9*61c4878aSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 10*61c4878aSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 11*61c4878aSAndroid Build Coastguard Worker# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 12*61c4878aSAndroid Build Coastguard Worker# License for the specific language governing permissions and limitations under 13*61c4878aSAndroid Build Coastguard Worker# the License. 14*61c4878aSAndroid Build Coastguard Worker"""Run doxygen on all Pigweed modules.""" 15*61c4878aSAndroid Build Coastguard Worker 16*61c4878aSAndroid Build Coastguard Workerimport argparse 17*61c4878aSAndroid Build Coastguard Workerimport os 18*61c4878aSAndroid Build Coastguard Workerfrom pathlib import Path 19*61c4878aSAndroid Build Coastguard Workerimport shutil 20*61c4878aSAndroid Build Coastguard Workerimport subprocess 21*61c4878aSAndroid Build Coastguard Workerimport sys 22*61c4878aSAndroid Build Coastguard Worker 23*61c4878aSAndroid Build Coastguard Worker 24*61c4878aSAndroid Build Coastguard Workerdef _parse_args() -> argparse.Namespace: 25*61c4878aSAndroid Build Coastguard Worker parser = argparse.ArgumentParser(description=__doc__) 26*61c4878aSAndroid Build Coastguard Worker parser.add_argument( 27*61c4878aSAndroid Build Coastguard Worker '--gn-root', 28*61c4878aSAndroid Build Coastguard Worker type=Path, 29*61c4878aSAndroid Build Coastguard Worker required=True, 30*61c4878aSAndroid Build Coastguard Worker help='Root of the GN tree.', 31*61c4878aSAndroid Build Coastguard Worker ) 32*61c4878aSAndroid Build Coastguard Worker parser.add_argument( 33*61c4878aSAndroid Build Coastguard Worker '--pigweed-modules-file', 34*61c4878aSAndroid Build Coastguard Worker type=Path, 35*61c4878aSAndroid Build Coastguard Worker required=True, 36*61c4878aSAndroid Build Coastguard Worker help='Pigweed modules list file', 37*61c4878aSAndroid Build Coastguard Worker ) 38*61c4878aSAndroid Build Coastguard Worker parser.add_argument( 39*61c4878aSAndroid Build Coastguard Worker '--output-dir', 40*61c4878aSAndroid Build Coastguard Worker type=Path, 41*61c4878aSAndroid Build Coastguard Worker required=True, 42*61c4878aSAndroid Build Coastguard Worker help='Location to write output to', 43*61c4878aSAndroid Build Coastguard Worker ) 44*61c4878aSAndroid Build Coastguard Worker parser.add_argument( 45*61c4878aSAndroid Build Coastguard Worker '--doxygen-config', 46*61c4878aSAndroid Build Coastguard Worker type=Path, 47*61c4878aSAndroid Build Coastguard Worker required=True, 48*61c4878aSAndroid Build Coastguard Worker help='Location to write output to', 49*61c4878aSAndroid Build Coastguard Worker ) 50*61c4878aSAndroid Build Coastguard Worker parser.add_argument( 51*61c4878aSAndroid Build Coastguard Worker '--include-paths', 52*61c4878aSAndroid Build Coastguard Worker nargs='+', 53*61c4878aSAndroid Build Coastguard Worker type=Path, 54*61c4878aSAndroid Build Coastguard Worker ) 55*61c4878aSAndroid Build Coastguard Worker return parser.parse_args() 56*61c4878aSAndroid Build Coastguard Worker 57*61c4878aSAndroid Build Coastguard Worker 58*61c4878aSAndroid Build Coastguard Workerdef main( 59*61c4878aSAndroid Build Coastguard Worker gn_root: Path, 60*61c4878aSAndroid Build Coastguard Worker pigweed_modules_file: Path, 61*61c4878aSAndroid Build Coastguard Worker output_dir: Path, 62*61c4878aSAndroid Build Coastguard Worker doxygen_config: Path, 63*61c4878aSAndroid Build Coastguard Worker include_paths: list[Path], 64*61c4878aSAndroid Build Coastguard Worker) -> None: 65*61c4878aSAndroid Build Coastguard Worker root_build_dir = Path.cwd() 66*61c4878aSAndroid Build Coastguard Worker 67*61c4878aSAndroid Build Coastguard Worker # Pigweed top level module list. 68*61c4878aSAndroid Build Coastguard Worker pw_module_list = [ 69*61c4878aSAndroid Build Coastguard Worker str((gn_root / path).resolve()) 70*61c4878aSAndroid Build Coastguard Worker for path in pigweed_modules_file.read_text().splitlines() 71*61c4878aSAndroid Build Coastguard Worker ] 72*61c4878aSAndroid Build Coastguard Worker 73*61c4878aSAndroid Build Coastguard Worker # Use selected modules only if provided 74*61c4878aSAndroid Build Coastguard Worker if include_paths: 75*61c4878aSAndroid Build Coastguard Worker pw_module_list = [ 76*61c4878aSAndroid Build Coastguard Worker str((root_build_dir / path).resolve()) for path in include_paths 77*61c4878aSAndroid Build Coastguard Worker ] 78*61c4878aSAndroid Build Coastguard Worker 79*61c4878aSAndroid Build Coastguard Worker env = os.environ.copy() 80*61c4878aSAndroid Build Coastguard Worker env['PW_DOXYGEN_OUTPUT_DIRECTORY'] = str(output_dir.resolve()) 81*61c4878aSAndroid Build Coastguard Worker env['PW_DOXYGEN_INPUT'] = ' '.join(pw_module_list) 82*61c4878aSAndroid Build Coastguard Worker env['PW_DOXYGEN_PROJECT_NAME'] = 'Pigweed' 83*61c4878aSAndroid Build Coastguard Worker 84*61c4878aSAndroid Build Coastguard Worker # Clean out old xmls 85*61c4878aSAndroid Build Coastguard Worker shutil.rmtree(output_dir, ignore_errors=True) 86*61c4878aSAndroid Build Coastguard Worker output_dir.mkdir(parents=True, exist_ok=True) 87*61c4878aSAndroid Build Coastguard Worker 88*61c4878aSAndroid Build Coastguard Worker command = ['doxygen', str(doxygen_config.resolve())] 89*61c4878aSAndroid Build Coastguard Worker process = subprocess.run(command, env=env, check=True) 90*61c4878aSAndroid Build Coastguard Worker sys.exit(process.returncode) 91*61c4878aSAndroid Build Coastguard Worker 92*61c4878aSAndroid Build Coastguard Worker 93*61c4878aSAndroid Build Coastguard Workerif __name__ == '__main__': 94*61c4878aSAndroid Build Coastguard Worker main(**vars(_parse_args())) 95