910e62b5创建于 1月15日历史提交
#!/usr/bin/env python3
# Copyright 2025 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import argparse
import glob
import os
import shutil
import subprocess
import sys
import tempfile

_SCRIPT_DIR = os.path.dirname(__file__)
_PARSER_SCRIPT = os.path.join(_SCRIPT_DIR,
                              '../public/tools/mojom/mojom_parser.py')
_GENERATOR_SCRIPT = os.path.join(
    _SCRIPT_DIR, '../public/tools/bindings/mojom_bindings_generator.py')

def removesuffix(string, suffix):
    if not suffix or not string.endswith(suffix):
        return string
    return string[:-len(suffix)]


def generate_bindings(input_dir, output_dir):
    if not os.path.isdir(output_dir):
        raise NotADirectoryError(
            f'Output directory "{output_dir}" must exist')

    with tempfile.TemporaryDirectory() as tmp_dir:
        tmp_modules_dir = os.path.join(tmp_dir, 'modules')
        tmp_bytecode_dir = os.path.join(tmp_dir, 'bytecode')
        tmp_bindings_dir = os.path.join(tmp_dir, 'bindings')
        os.mkdir(tmp_modules_dir)
        os.mkdir(tmp_bytecode_dir)
        os.mkdir(tmp_bindings_dir)

        mojom_files = glob.glob(os.path.join(input_dir, '*.test-mojom'))
        subprocess.run([
            'python3', _PARSER_SCRIPT, '--input-root', input_dir,
            '--add-module-metadata', 'webui_module_path="golden://test"',
            '--output-root', tmp_modules_dir, '--mojoms', *mojom_files
        ],
                       check=True)
        subprocess.run([
            'python3', _GENERATOR_SCRIPT, '-o', tmp_bytecode_dir, 'precompile'
        ],
                       check=True)

        for lang in ['typescript', 'c++', 'java']:
          language_flags = []

          lang_tmp_output = f'{tmp_bindings_dir}/{lang}'
          lang_output = f'{output_dir}/{lang}'

          if lang == 'java':
            language_flags += ['--java_output_directory=' + lang_tmp_output]


          # Paths to module files relative to the bindings output directory.
          mojom_modules = (os.path.join('../../modules',
                            removesuffix(module_filename, '-module'))
                            for module_filename in os.listdir(tmp_modules_dir))
          subprocess.run([
              'python3', _GENERATOR_SCRIPT, '-o', lang_tmp_output, 'generate',
              '--bytecode_path', tmp_bytecode_dir, '--generators', lang,
              # typemap is hardcoded for now.
              '--typemap', f'{input_dir}/typemap.json',
              *language_flags, *mojom_modules],
                         check=True)
          # Append '.golden' file extension to avoid presubmit checks.
          for root, dirs, files in os.walk(lang_tmp_output):
              for file in files:
                path = root + '/'.join(dirs) + '/' + file
                os.rename(path, path + '.golden')
          shutil.copytree(lang_tmp_output, lang_output, dirs_exist_ok=True)


def main():
    parser = argparse.ArgumentParser(
        description='Generate mojo binding golden files.')
    parser.add_argument('--input-dir',
                        default=os.path.join(_SCRIPT_DIR, 'corpus'),
                        dest='input_dir',
                        help='directory containing input .mojom files')
    parser.add_argument(
        '--output-dir',
        default=os.path.join(_SCRIPT_DIR, 'generated/'),
        dest='output_dir',
        help='empty directory in which to write generated bindings')
    args = parser.parse_args(sys.argv[1:])

    generate_bindings(args.input_dir, args.output_dir)


if __name__ == "__main__":
    main()