blob: da84f4bd0bb1d790087c5fb38afb76fdb16fb759 [file] [log] [blame]
Collin Bakerca9819042022-04-07 21:42:231#!/usr/bin/env python3
2
Avi Drissman73a09d12022-09-08 20:33:383# Copyright 2022 The Chromium Authors
Collin Bakerca9819042022-04-07 21:42:234# Use of this source code is governed by a BSD-style license that can be
5# found in the LICENSE file.
6
7import argparse
8import os
9import subprocess
10import sys
11
12# Set up path to be able to import build_utils.
13sys.path.append(
14 os.path.join(os.path.dirname(os.path.abspath(__file__)), os.pardir,
15 os.pardir, 'build', 'android', 'gyp'))
16from util import build_utils
17
Adrian Taylor41eb699e2022-10-06 14:37:1518from filter_clang_args import filter_clang_args
19
Collin Bakerca9819042022-04-07 21:42:2320
21def atomic_copy(in_path, out_path):
22 with open(in_path, 'rb') as input:
23 with build_utils.AtomicOutput(out_path, only_if_changed=True) as output:
24 content = input.read()
25 output.write(content)
26
27
28def copy_to_prefixed_filename(path, filename, prefix):
29 atomic_copy(os.path.join(path, filename),
30 os.path.join(path, prefix + "_" + filename))
31
32
Collin Bakerca9819042022-04-07 21:42:2333def main():
34 parser = argparse.ArgumentParser("run_bindgen.py")
35 parser.add_argument("--exe", help="Path to bindgen", required=True),
36 parser.add_argument("--header",
37 help="C header file to generate bindings for",
38 required=True)
39 parser.add_argument("--depfile",
40 help="depfile to output with header dependencies")
41 parser.add_argument("--output", help="output .rs bindings", required=True)
42 parser.add_argument("--ld-library-path", help="LD_LIBRARY_PATH to set")
43 parser.add_argument("-I", "--include", help="include path", action="append")
44 parser.add_argument(
45 "clangargs",
46 metavar="CLANGARGS",
47 help="arguments to pass to libclang (see "
48 "https://docs.rs/bindgen/latest/bindgen/struct.Builder.html#method.clang_args)",
49 nargs="*")
50 args = parser.parse_args()
51 genargs = []
52
53 # Bindgen settings we use for Chromium
54 genargs.append('--no-layout-tests')
55 genargs.append('--size_t-is-usize')
56 genargs += ['--rust-target', 'nightly']
57
58 if args.depfile:
59 genargs.append('--depfile')
60 genargs.append(args.depfile)
61 genargs.append('--output')
62 genargs.append(args.output)
63 genargs.append(args.header)
64 genargs.append('--')
65 genargs.extend(filter_clang_args(args.clangargs))
66 env = os.environ
67 if args.ld_library_path:
68 env["LD_LIBRARY_PATH"] = args.ld_library_path
Collin Bakerd27f0bd2022-04-21 14:06:4769 returncode = subprocess.run([args.exe, *genargs], env=env).returncode
70 if returncode != 0:
Collin Bakerca9819042022-04-07 21:42:2371 # Make sure we don't emit anything if bindgen failed.
72 try:
73 os.remove(args.output)
74 except FileNotFoundError:
75 pass
76 try:
77 os.remove(args.depfile)
78 except FileNotFoundError:
79 pass
Collin Bakerd27f0bd2022-04-21 14:06:4780 return returncode
Collin Bakerca9819042022-04-07 21:42:2381
82
83if __name__ == '__main__':
84 sys.exit(main())