1# Copyright 2022 The Chromium Authors 2# Use of this source code is governed by a BSD-style license that can be 3# found in the LICENSE file. 4 5import("//build/config/clang/clang.gni") 6import("//build/config/rust.gni") 7import("//build/config/sysroot.gni") 8import("//build/rust/rust_bindgen_generator.gni") 9import("//build/rust/rust_static_library.gni") 10 11if (is_win) { 12 import("//build/toolchain/win/win_toolchain_data.gni") 13} 14 15_bindgen_path = "${rust_bindgen_root}/bin/bindgen" 16if (host_os == "win") { 17 _bindgen_path = "${_bindgen_path}.exe" 18} 19 20# On Windows, the libclang.dll is beside the bindgen.exe, otherwise it is in 21# ../lib. 22_libclang_path = rust_bindgen_root 23if (host_os == "win") { 24 _libclang_path += "/bin" 25} else { 26 _libclang_path += "/lib" 27} 28 29# Template to build Rust/C bindings with bindgen. 30# 31# This template expands to a rust_static_library that exports the 32# bindings generated from bindgen at the root of the library. 33# 34# Parameters: 35# 36# header: 37# The .h file to generate bindings for. 38# 39# deps: (optional) 40# C targets on which the headers depend in order to build successfully. 41# 42# configs: (optional) 43# C compilation targets determine the correct list of -D and -I flags based 44# on their dependencies and any configs applied. The same applies here. Set 45# any configs here as if this were a C target. 46# 47# cpp: (optional) 48# Use C++ mode to consume the header instead of C mode (the default). 49# 50# bindgen_flags: (optional) 51# The additional bindgen flags which are passed to the executable. A `--` will 52# be prepended to each flag. So use `bindgen_flags = [ "foo" ]` to pass 53# `--foo` to bindgen. 54# 55# wrap_static_fns: (optional) 56# If set to true, enables binding `static` and `static inline` functions in 57# the header. Setting this causes the template to emit a source_set target 58# named "${target_name}_static_fns", which must be incorporated into the 59# build. Additionally, `get_target_outputs` will return both the Rust file and 60# a generated C file, but callers can rely on the Rust file being first. 61# 62# 63# For a small, self-contained example please see: 64# * C header: //build/rust/tests/bindgen_test 65# * C++ header: //build/rust/tests/bindgen_cpp_test 66template("rust_bindgen") { 67 # "_generator" will be added to the rust_bindgen_generator target. 68 _rust_bindgen_generator_name = target_name + "_generator" 69 _wrap_static_fns = false 70 if (defined(invoker.wrap_static_fns) && invoker.wrap_static_fns) { 71 _wrap_static_fns = true 72 } 73 rust_bindgen_generator(_rust_bindgen_generator_name) { 74 forward_variables_from(invoker, 75 "*", 76 [ 77 "library_name", 78 "output_name", 79 ] + TESTONLY_AND_VISIBILITY) 80 81 # This will allow the rust_static_library to depend on the 82 # `rust_bindgen_generator` through visibility. 83 library_name = target_name 84 85 # We know the library that is going to consume this rust_bindgen and we're 86 # sure that only a single bindgen is there. So rename the bindings to avoid 87 # passing envflags. envflags are usually problematic for Cronet as Soong 88 # does not support it (b/181221467). 89 output_name = "bindings" 90 } 91 92 rust_static_library(target_name) { 93 forward_variables_from(invoker, 94 TESTONLY_AND_VISIBILITY + [ 95 "crate_name", 96 "cpp", 97 ]) 98 99 crate_root = "//build/rust/bindings.rs" 100 sources = [ crate_root ] 101 bindgen_deps = [ ":$_rust_bindgen_generator_name" ] 102 allow_unsafe = true 103 if (_wrap_static_fns) { 104 # Add a dependency on the static_fns library for simplicity if 105 # it's declared. 106 deps = [ ":${_rust_bindgen_generator_name}_static_fns" ] 107 } 108 if (defined(cpp) && cpp) { 109 # This cfg is used to control the bindings public export. 110 rustflags = [ 111 "--cfg", 112 "cpp", 113 ] 114 } 115 } 116} 117