xref: /aosp_15_r20/external/pigweed/docs/run_doxygen.py (revision 61c4878ac05f98d0ceed94b57d316916de578985)
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