| #!/usr/bin/env python3 |
| # Copyright (C) 2022 The Android Open Source Project |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| """ |
| Generate stdlib documentation JSON. |
| |
| This tool generates documentation JSON for the Perfetto SQL standard library. |
| """ |
| |
| import argparse |
| import json |
| import os |
| import sys |
| |
| ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) |
| sys.path.append(ROOT_DIR) |
| |
| from python.generators.sql_processing.stdlib_parser import parse_all_modules, format_docs |
| |
| |
| def main(): |
| parser = argparse.ArgumentParser( |
| description="Generate stdlib documentation JSON") |
| parser.add_argument('--json-out', required=True) |
| parser.add_argument('--input-list-file') |
| parser.add_argument( |
| '--minify', |
| action='store_true', |
| help='Minify JSON output (removes indentation and whitespace)') |
| parser.add_argument( |
| '--with-internal', |
| action='store_true', |
| help='Include internal artifacts (those starting with _) in output') |
| parser.add_argument('sql_files', nargs='*') |
| args = parser.parse_args() |
| |
| if args.input_list_file and args.sql_files: |
| print( |
| "Only one of --input-list-file and list of SQL files expected", |
| file=sys.stderr) |
| return 1 |
| |
| # Get list of SQL files from either input-list-file or arguments |
| if args.input_list_file: |
| with open(args.input_list_file, 'r', encoding='utf-8') as f: |
| sql_files = [line.strip() for line in f.readlines() if line.strip()] |
| else: |
| sql_files = args.sql_files |
| |
| if not sql_files: |
| print("No SQL files provided", file=sys.stderr) |
| return 1 |
| |
| # Find stdlib path from the common path of all files |
| # Unfortunately we cannot pass this in as an arg as soong does not provide |
| # us a way to get the path to the Perfetto source directory. |
| stdlib_path = os.path.commonpath(sql_files) |
| |
| # Validate paths (check for ../) |
| for file_name in sql_files: |
| relpath = os.path.relpath(file_name, stdlib_path) |
| # We've had bugs (e.g. b/264711057) when Soong's common path logic breaks |
| # and ends up with a bunch of ../ prefixing the path: disallow any ../ |
| # as this should never be a valid in our C++ output. |
| if '../' in relpath: |
| raise ValueError( |
| f"Invalid path with parent directory reference: {relpath}") |
| |
| # Parse all modules using the library |
| try: |
| modules = parse_all_modules( |
| stdlib_path=stdlib_path, |
| include_internal=args.with_internal, |
| name_filter=None) |
| |
| # Format as docs JSON |
| output_data = format_docs(modules) |
| |
| # Write output |
| with open(args.json_out, 'w', encoding='utf-8') as f: |
| json.dump(output_data, f, indent=None if args.minify else 2) |
| |
| return 0 |
| except Exception as e: |
| print(f"Error generating docs JSON: {e}", file=sys.stderr) |
| import traceback |
| traceback.print_exc() |
| return 1 |
| |
| |
| if __name__ == '__main__': |
| sys.exit(main()) |