package { // See: http://go/android-license-faq // A large-scale-change added 'default_applicable_licenses' to import // all of the 'license_kinds' from "system_bt_license" // to get the below license kinds: // SPDX-license-identifier-Apache-2.0 default_applicable_licenses: ["system_bt_license"], } rust_defaults { name: "libbluetooth_core_rs_defaults", min_sdk_version: "Tiramisu", dylib: { enabled: false, }, srcs: [ "src/lib.rs", ":bluetooth_core_rust_packets", ], shared_libs: [ "libbase", ], static_libs: [ "libbt_shim_bridge", "libbt_shim_ffi", "libchrome", "libevent", "libmodpb64", ], proc_macros: [ "libasync_trait", "libpaste", ], rustlibs: [ "libanyhow", "libbitflags", "libbt_common", "libcxx", "liblog_rust", "libscopeguard", // needed to work around duplicate symbols // caused by bug in Soong "libbt_shim", ], whole_static_libs: [ "libbluetooth_core_rs_bridge", ], features: [ // used to hide libbt_shim in Cargo builds, but // expose it to Soong to work around linker bug "via_android_bp", ], target: { android: { shared_libs: [ "android.hardware.bluetooth@1.0", "android.hardware.bluetooth@1.1", "android.system.suspend-V1-ndk", "android.system.suspend.control-V1-ndk", "libbinder_ndk", "libcutils", "libhidlbase", "libstatslog_bt", "libutils", ], }, }, apex_available: ["com.android.btservices"], } rust_library { name: "libbluetooth_core_rs_for_facade", crate_name: "bluetooth_core_rs_for_facade", defaults: ["libbluetooth_core_rs_defaults"], rustlibs: [ "libtokio", ], host_supported: true, } rust_ffi_static { name: "libbluetooth_core_rs", crate_name: "bluetooth_core", defaults: ["libbluetooth_core_rs_defaults"], rustlibs: [ "libtokio", ], target: { android: { rustlibs: [ "libandroid_logger", ], }, }, host_supported: true, } rust_test_host { name: "libbluetooth_core_rs_test", defaults: ["libbluetooth_core_rs_defaults"], rustlibs: [ "libtokio_for_test", "libtokio_test", ], } cc_library_static { name: "libbluetooth_core_rs_bridge", defaults: ["bluetooth_cflags"], srcs: [ "src/connection/ffi/connection_shim.cc", "src/core/ffi/module.cc", "src/gatt/ffi/gatt_shim.cc", ], include_dirs: [ "packages/modules/Bluetooth/system", "packages/modules/Bluetooth/system/gd", "packages/modules/Bluetooth/system/include", "packages/modules/Bluetooth/system/stack/include", "packages/modules/Bluetooth/system/types", ], export_include_dirs: ["."], static_libs: [ "libbluetooth_hci_pdl", "libbluetooth_log", "libbt_shim_bridge", "libbt_shim_ffi", "libchrome", "libflatbuffers-cpp", ], generated_headers: [ "cxx-bridge-header", "libbluetooth_core_rs_bridge_codegen_header", "BluetoothGeneratedBundlerSchema_h_bfbs", "BluetoothGeneratedDumpsysDataSchema_h", ], export_generated_headers: [ "libbluetooth_core_rs_bridge_codegen_header", ], host_supported: true, generated_sources: ["libbluetooth_core_rs_bridge_codegen"], apex_available: ["com.android.btservices"], min_sdk_version: "Tiramisu", // Bug: 286537287 this library gets linked with Rust objects but cross-language LTO // isn't supported yet. lto: { never: true, }, } /// FFI codegen /// /// The static library libbluetooth_core_rs_bridge is included by /// libbluetooth_core_rs and depends on libbluetooth_core. libbluetooth /// depends on libbluetooth_core_rs. /// i.e. /// libbluetooth -> {libbluetooth_core_rs, libbluetooth_core_rs_bridge} -> libbluetooth_core /// /// Thus, FFI can be either: /// * Rust to GD /// * Legacy C++ to Rust /// * Core to Rust only via injected callbacks (libbluetooth_core does not /// depend on libbluetooth_core_rs) /// * Legacy C++ to Rust can be made directly (as libbluetooth *does* depend /// on libbluetooth_core_rs). /// /// To add FFI for a new module, create an ffi.rs file, and add it to the filegroup below. filegroup { name: "libbluetooth_core_rs_ffi", srcs: [ "src/connection/ffi.rs", "src/core/ffi.rs", "src/gatt/ffi.rs", ], } gensrcs { name: "libbluetooth_core_rs_bridge_codegen_header", tools: ["cxxbridge"], cmd: "$(location cxxbridge) $(in) --header > $(out)", srcs: [":libbluetooth_core_rs_ffi"], output_extension: "rs.h", export_include_dirs: ["."], } gensrcs { name: "libbluetooth_core_rs_bridge_codegen", tools: ["cxxbridge"], cmd: "$(location cxxbridge) $(in) > $(out)", srcs: [":libbluetooth_core_rs_ffi"], output_extension: "cc", } genrule { name: "bluetooth_core_rust_packets", defaults: ["pdl_rust_noalloc_generator_defaults"], srcs: ["src/packets.pdl"], out: ["_packets.rs"], }