blob: 8d6a3ca6174988cfef2a1c2f4cd2dc562cdf8169 [file] [log] [blame]
set(BT_ROOT ${AOSP_ROOT}/packages/modules/Bluetooth)
set(ROOTCANAL_ROOT ${AOSP_ROOT}/packages/modules/Bluetooth/tools/rootcanal)
set(PDL_ROOT ${AOSP_ROOT}/external/rust/crates/pdl-compiler)
corrosion_import_crate(
MANIFEST_PATH ${PDL_ROOT}/Cargo.toml
FLAGS --offline --verbose --verbose)
corrosion_set_env_vars(generate-canonical-tests CARGO_HOME=${Rust_CARGO_HOME})
corrosion_set_env_vars(pdlc CARGO_HOME=${Rust_CARGO_HOME})
corrosion_set_hostbuild(pdlc)
get_property(pdlc_EXECUTABLE TARGET pdlc PROPERTY EXECUTABLE_PATH)
# These tests depend on the tempfile crate which was not imported because
# the crate remove_dir_all does not have a compatible version.
set_tests_properties(cargo-test_pdlc PROPERTIES DISABLED True)
set_tests_properties(cargo-test_generate-canonical-tests PROPERTIES DISABLED True)
android_license(
TARGET pdlc
LIBNAME None
SPDX None
LICENSE None
LOCAL None)
# Generate the Rust/C++ backend for a .pdl specification file.
function(pdl_gen)
# Parse arguments.
set(options)
set(oneValueArgs NAME INPUT OUTPUT LANG NAMESPACE)
set(multiValueArgs USING INCLUDE)
cmake_parse_arguments(pdl "${options}" "${oneValueArgs}"
"${multiValueArgs}" ${ARGN})
if(NOT pdl_NAME)
message(FATAL_ERROR "Error: name not specified")
endif()
if(NOT pdl_INPUT)
message(FATAL_ERROR "Error: output file not specified")
endif()
if(NOT pdl_OUTPUT)
message(FATAL_ERROR "Error: output file not specified")
endif()
set(pdl_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/pdl_gen)
set(pdl_OUTPUT "${pdl_OUTPUT_DIR}/${pdl_OUTPUT}")
get_filename_component(pdl_INPUT_ABSOLUTE ${pdl_INPUT} ABSOLUTE)
get_filename_component(pdl_OUTPUT_ABSOLUTE ${pdl_OUTPUT} ABSOLUTE)
get_filename_component(pdl_OUTPUT_DIR ${pdl_OUTPUT_ABSOLUTE} DIRECTORY)
set(${pdl_NAME} "${pdl_OUTPUT_ABSOLUTE}" CACHE STRING "PDL output filepath for ${pdl_NAME}" FORCE)
file(MAKE_DIRECTORY ${pdl_OUTPUT_DIR})
if(pdl_LANG STREQUAL "rust")
add_custom_command(
OUTPUT "${pdl_OUTPUT_ABSOLUTE}"
COMMAND
${pdlc_EXECUTABLE}
--output-format rust
"${pdl_INPUT_ABSOLUTE}"
> "${pdl_OUTPUT_ABSOLUTE}"
COMMENT "Generating rust module from ${pdl_INPUT}"
VERBATIM
DEPENDS pdlc ${pdl_INPUT_ABSOLUTE})
endif()
if(pdl_LANG STREQUAL "c++")
if(NOT pdl_NAMESPACE)
message(FATAL_ERROR "Error: namespace not specified")
endif()
foreach(namespace ${pdl_USING})
list(APPEND pdl_FLAGS --using-namespace)
list(APPEND pdl_FLAGS ${namespace})
endforeach()
foreach(header ${pdl_INCLUDE})
list(APPEND pdl_FLAGS --include-header)
list(APPEND pdl_FLAGS ${header})
endforeach()
add_custom_command(
OUTPUT "${pdl_OUTPUT_ABSOLUTE}.json"
COMMAND
${pdlc_EXECUTABLE}
--output-format json
"${pdl_INPUT_ABSOLUTE}"
> "${pdl_OUTPUT_ABSOLUTE}.json"
COMMENT "Analyzing ${pdl_INPUT}"
VERBATIM
DEPENDS pdlc ${pdl_INPUT_ABSOLUTE})
add_custom_command(
OUTPUT "${pdl_OUTPUT_ABSOLUTE}"
COMMAND
${PDL_ROOT}/scripts/generate_cxx_backend.py
--input "${pdl_OUTPUT_ABSOLUTE}.json"
--output "${pdl_OUTPUT_ABSOLUTE}"
--namespace ${pdl_NAMESPACE}
${pdl_FLAGS}
COMMENT "Generating c++ header from ${pdl_INPUT}"
VERBATIM
DEPENDS pdlc ${pdl_OUTPUT_ABSOLUTE}.json)
endif()
add_custom_target("pdl_gen-${pdl_NAME}" DEPENDS ${pdl_OUTPUT_ABSOLUTE})
endfunction()
pdl_gen(
NAME BluetoothGeneratedPackets_h
INPUT ${ROOTCANAL_ROOT}/packets/hci_packets.pdl
OUTPUT packets/hci_packets.h
LANG c++
NAMESPACE "bluetooth::hci"
INCLUDE "hci/address.h")
pdl_gen(
NAME RootCanalGeneratedPackets_h
INPUT ${ROOTCANAL_ROOT}/packets/link_layer_packets.pdl
OUTPUT packets/link_layer_packets.h
LANG c++
NAMESPACE model::packets
INCLUDE "hci/address.h"
USING "bluetooth::hci")
pdl_gen(
NAME RootCanalGeneratedPackets_rs
INPUT ${ROOTCANAL_ROOT}/packets/link_layer_packets.pdl
OUTPUT link_layer_packets.rs
LANG rust)
android_add_library(
TARGET libscriptedbeaconpayload-protos-lite LICENSE Apache-2.0
SOURCE_DIR ${ROOTCANAL_ROOT} SRC ${libscriptedbeaconpayload_protos_lite_src})
protobuf_generate_with_plugin(
TARGET libscriptedbeaconpayload-protos-lite
PROTOS ${ROOTCANAL_ROOT}/model/devices/scripted_beacon_ble_payload.proto
APPEND_PATH
PROTOPATH -I${AOSP_ROOT}/external/protobuf/src
-I${ROOTCANAL_ROOT}/model/devices
PROTOC_OUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/model/devices)
target_include_directories(
libscriptedbeaconpayload-protos-lite
PUBLIC ${CMAKE_CURRENT_BINARY_DIR} ${AOSP_ROOT}/external/protobuf/src)
target_link_libraries(libscriptedbeaconpayload-protos-lite
PRIVATE protobuf::libprotobuf)
android_add_library(
TARGET librootcanal_config LICENSE Apache-2.0
SOURCE_DIR ${ROOTCANAL_ROOT} SRC ${librootcanal_config_src})
protobuf_generate_with_plugin(
TARGET librootcanal_config
PROTOS ${ROOTCANAL_ROOT}/proto/rootcanal/configuration.proto
APPEND_PATH
PROTOPATH -I${AOSP_ROOT}/external/protobuf/src
PROTOC_OUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/proto/rootcanal)
target_include_directories(
librootcanal_config
PUBLIC ${CMAKE_CURRENT_BINARY_DIR}/proto ${AOSP_ROOT}/external/protobuf/src)
target_link_libraries(librootcanal_config
PRIVATE protobuf::libprotobuf)
add_library(libbt-rootcanal.headers INTERFACE)
target_include_directories(libbt-rootcanal.headers INTERFACE ${ROOTCANAL_ROOT})
target_link_libraries(libbt-rootcanal.headers
INTERFACE android-emu-base-headers)
android_license(TARGET "libbt-rootcanal.headers" LIBNAME None SPDX Apache-2.0
LICENSE Apache-2.0 LOCAL "${BT_ROOT}/NOTICE")
android_add_library(
TARGET librootcanal_log
LICENSE Apache-2.0
SOURCE_DIR ${ROOTCANAL_ROOT}
SRC lib/log.cc
${AOSP_ROOT}/external/fmtlib/src/format.cc)
target_include_directories(
librootcanal_log PUBLIC
${ROOTCANAL_ROOT}/include
${AOSP_ROOT}/external/fmtlib/include)
android_add_library(
TARGET libbt-rootcanal
LICENSE Apache-2.0
SOURCE_DIR ${ROOTCANAL_ROOT}
SRC ${BluetoothGeneratedPackets_h}
${RootCanalGeneratedPackets_h}
lib/crypto/crypto.cc
lib/hci/address.cc
lib/hci/pcap_filter.cc
lib/log.cc
model/controller/acl_connection.cc
model/controller/acl_connection_handler.cc
model/controller/controller_properties.cc
model/controller/dual_mode_controller.cc
model/controller/le_advertiser.cc
model/controller/link_layer_controller.cc
model/controller/sco_connection.cc
model/controller/vendor_commands/le_apcf.cc
model/devices/beacon.cc
model/devices/beacon_swarm.cc
model/devices/device.cc
model/devices/hci_device.cc
model/devices/link_layer_socket_device.cc
model/devices/scripted_beacon.cc
model/devices/sniffer.cc
model/hci/h4_data_channel_packetizer.cc
model/hci/h4_parser.cc
model/hci/hci_sniffer.cc
model/hci/hci_socket_transport.cc
model/setup/device_boutique.cc
model/setup/phy_device.cc
model/setup/phy_layer.cc
model/setup/test_channel_transport.cc
model/setup/test_command_handler.cc
model/setup/test_model.cc
LINUX net/posix/posix_async_socket.cc
net/posix/posix_async_socket_connector.cc
net/posix/posix_async_socket_server.cc
DARWIN net/posix/posix_async_socket.cc
net/posix/posix_async_socket_connector.cc
net/posix/posix_async_socket_server.cc
DEPS android-emu-base
android-emu-base-headers
android-emu-base-logging
crypto
librootcanal_config
libscriptedbeaconpayload-protos-lite)
target_link_libraries(
libbt-rootcanal
PUBLIC librootcanal_log)
target_include_directories(
libbt-rootcanal
PUBLIC ${ROOTCANAL_ROOT}/include
${ROOTCANAL_ROOT}
${PDL_ROOT}/scripts
${CMAKE_CURRENT_BINARY_DIR}/pdl_gen
${CMAKE_CURRENT_BINARY_DIR}/config)
target_compile_options(libbt-rootcanal
PUBLIC -Wno-inconsistent-missing-override)
add_subdirectory(rust)