3 # Copyright 2022 The Chromium Authors
4 # Use of this source code is governed by a BSD-style license that can be
5 # found in the LICENSE file.
12 # Set up path to be able to import action_helpers.
14 os.path.join(os.path.dirname(os.path.abspath(__file__)), os.pardir,
18 from filter_clang_args import filter_clang_args
21 def atomic_copy(in_path, out_path):
22 with open(in_path, 'rb') as input:
23 with action_helpers.atomic_output(out_path) as output:
24 content = input.read()
28 def copy_to_prefixed_filename(path, filename, prefix):
29 atomic_copy(os.path.join(path, filename),
30 os.path.join(path, prefix + "_" + filename))
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",
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",
43 help="LD_LIBRARY_PATH (or DYLD_LIBRARY_PATH on Mac) to "
45 parser.add_argument("--libclang-path",
46 help="Path to the libclang shared libray.")
47 parser.add_argument("-I", "--include", help="include path", action="append")
48 parser.add_argument("--bindgen-flags",
49 help="flags to pass to bindgen",
54 help="arguments to pass to libclang (see "
55 "https://docs.rs/bindgen/latest/bindgen/struct.Builder.html#method.clang_args)",
57 args = parser.parse_args()
59 # Args passed to the actual bindgen cli
61 genargs.append('--no-layout-tests')
62 if args.bindgen_flags is not None:
63 for flag in args.bindgen_flags:
64 genargs.append("--" + flag)
66 # TODO(danakj): We need to point bindgen to
67 # //third_party/rust-toolchain/bin/rustfmt.
68 genargs.append('--no-rustfmt-bindings')
69 genargs += ['--rust-target', 'nightly']
72 genargs.append('--depfile')
73 genargs.append(args.depfile)
74 genargs.append('--output')
75 genargs.append(args.output)
76 genargs.append(args.header)
78 genargs.extend(filter_clang_args(args.clangargs))
80 if args.ld_library_path:
81 if sys.platform == 'darwin':
82 env["DYLD_LIBRARY_PATH"] = args.ld_library_path
84 env["LD_LIBRARY_PATH"] = args.ld_library_path
85 if args.libclang_path:
86 env["LIBCLANG_PATH"] = args.libclang_path
87 returncode = subprocess.run([args.exe, *genargs], env=env).returncode
89 # Make sure we don't emit anything if bindgen failed.
91 os.remove(args.output)
92 except FileNotFoundError:
95 os.remove(args.depfile)
96 except FileNotFoundError:
101 if __name__ == '__main__':