aboutsummaryrefslogtreecommitdiff
path: root/rust/Android.bp
diff options
context:
space:
mode:
Diffstat (limited to 'rust/Android.bp')
-rw-r--r--rust/Android.bp103
1 files changed, 83 insertions, 20 deletions
diff --git a/rust/Android.bp b/rust/Android.bp
index 517d87a..7ef3df3 100644
--- a/rust/Android.bp
+++ b/rust/Android.bp
@@ -18,7 +18,7 @@
// with so are not exposed outside of this directory; instead we will provide
// a safe higher-level Rust API.
rust_defaults {
- name: "libavb_bindgen.defaults",
+ name: "libavb_bindgen.common.defaults",
wrapper_src: "bindgen/avb.h",
crate_name: "avb_bindgen",
edition: "2021",
@@ -30,52 +30,112 @@ rust_defaults {
],
source_stem: "bindings",
bindgen_flags: [
- "--constified-enum-module AvbDescriptorTag",
+ "--constified-enum-module=AvbDescriptorTag",
+ "--bitfield-enum=AvbHashDescriptorFlags",
"--bitfield-enum=AvbSlotVerifyFlags",
"--default-enum-style rust",
+ "--with-derive-default",
+ "--with-derive-custom=Avb.*Descriptor=FromZeroes,FromBytes",
"--allowlist-type=AvbDescriptorTag",
+ "--allowlist-type=AvbHashDescriptorFlags",
"--allowlist-function=.*",
"--allowlist-var=AVB.*",
"--use-core",
"--raw-line=#![no_std]",
+ "--raw-line=use zerocopy::{FromZeroes, FromBytes};",
"--ctypes-prefix=core::ffi",
],
cflags: ["-DBORINGSSL_NO_CXX"],
}
-rust_bindgen {
- name: "libavb_bindgen",
- defaults: ["libavb_bindgen.defaults"],
+// Full bindgen defaults for std targets.
+rust_defaults {
+ name: "libavb_bindgen.std.defaults",
+ defaults: ["libavb_bindgen.common.defaults"],
host_supported: true,
- static_libs: [
- "libavb",
- ],
- shared_libs: [
- "libcrypto",
- ],
- apex_available: [
- "com.android.virt",
- ],
+ static_libs: ["libavb"],
+ shared_libs: ["libcrypto"],
+ rustlibs: ["libzerocopy"],
+ apex_available: ["com.android.virt"],
}
-rust_bindgen {
- name: "libavb_bindgen_nostd",
- defaults: ["libavb_bindgen.defaults"],
+// Full bindgen default for nostd targets.
+rust_defaults {
+ name: "libavb_bindgen.nostd.defaults",
+ defaults: ["libavb_bindgen.common.defaults"],
static_libs: [
"libavb_baremetal",
"libcrypto_baremetal",
],
+ rustlibs: ["libzerocopy_nostd_noalloc"],
+}
+
+// Internal source-only bindgen with std.
+//
+// This target should only be used as `srcs`, not `rustlibs` or `rlibs`. This
+// is because the `rust_bindgen` rule intentionally only generates rlibs
+// (b/166332519), and also forces its dependencies to use rlibs. However, this
+// can create mismatched library types if the depenency is also used elsewhere
+// in a build rule as a dylib. In particular for us, libzerocopy and its own
+// dependency libbyteorder trigger this problem like so:
+//
+// build target (prefer dylib)
+// / \
+// libavb_rs (dylib) \
+// / \
+// libavb_bindgen (rlib) ... arbitrary dependency chain (dylib) ...
+// / \
+// libzerocopy (rlib) \
+// / \
+// libbyteorder (rlib) libbyteorder (dylib)
+//
+// By using it as a `srcs` instead, we can wrap it in a `rust_library` which
+// allows selecting either library type and fixes the conflict:
+//
+// build target (prefer dylib)
+// / \
+// libavb_rs (dylib) \
+// / \
+// libavb_bindgen (dylib) ... arbitrary dependency chain (dylib) ...
+// / /
+// libzerocopy (dylib) /
+// \ /
+// libbyteorder (dylib)
+//
+rust_bindgen {
+ name: "libavb_bindgen_for_srcs_only",
+ defaults: ["libavb_bindgen.std.defaults"],
+}
+
+// Bindgen with std.
+//
+// See above for why we need a `rust_library` wrapper here.
+rust_library {
+ name: "libavb_bindgen",
+ defaults: ["libavb_bindgen.std.defaults"],
+ srcs: [":libavb_bindgen_for_srcs_only"],
+}
+
+// Bindgen nostd.
+//
+// Nostd targets always use rlibs, so we don't need a `rust_library` wrapper in
+// this case; the rlib-only bindgen target is sufficient.
+rust_bindgen {
+ name: "libavb_bindgen_nostd",
+ defaults: ["libavb_bindgen.nostd.defaults"],
}
+// Bindgen auto-generated tests.
rust_test {
name: "libavb_bindgen_test",
- srcs: [":libavb_bindgen"],
+ srcs: [":libavb_bindgen_for_srcs_only"],
crate_name: "avb_bindgen_test",
edition: "2021",
test_suites: ["general-tests"],
auto_gen_config: true,
clippy_lints: "none",
lints: "none",
+ rustlibs: ["libzerocopy"],
}
// Rust library wrapping libavb C implementation.
@@ -99,6 +159,7 @@ rust_defaults {
no_stdlibs: true,
rustlibs: [
"libavb_bindgen_nostd",
+ "libzerocopy_nostd_noalloc",
],
whole_static_libs: [
"libavb_baremetal",
@@ -115,6 +176,7 @@ rust_defaults {
host_supported: true,
rustlibs: [
"libavb_bindgen",
+ "libzerocopy",
],
whole_static_libs: [
"libavb",
@@ -203,6 +265,7 @@ rust_defaults {
":avbrs_test_vbmeta_2_parts",
":avbrs_test_vbmeta_persistent_digest",
],
+ rustlibs: ["libhex"],
test_suites: ["general-tests"],
clippy_lints: "android",
lints: "android",
@@ -240,7 +303,7 @@ avb_gen_vbmeta_image {
name: "avbrs_test_image_descriptor",
src: ":avbrs_test_image",
partition_name: "test_part",
- salt: "0000",
+ salt: "1000",
}
// Unsigned vbmeta blob containing the test image descriptor for partition name "test_part_2".
@@ -248,7 +311,7 @@ avb_gen_vbmeta_image {
name: "avbrs_test_image_descriptor_2",
src: ":avbrs_test_image",
partition_name: "test_part_2",
- salt: "0001",
+ salt: "1001",
}
// Unsigned vbmeta blob containing a persistent digest descriptor for partition name