diff options
Diffstat (limited to 'rust/Android.bp')
-rw-r--r-- | rust/Android.bp | 103 |
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 |