unplugged-system/packages/modules/Bluetooth/tools/rootcanal/CMakeLists.txt

301 lines
10 KiB
CMake
Raw Normal View History

set(BT_ROOT ${AOSP_ROOT}/packages/modules/Bluetooth/system)
set(ROOTCANAL_ROOT ${AOSP_ROOT}/packages/modules/Bluetooth/tools/rootcanal)
set(PDL_ROOT ${AOSP_ROOT}/packages/modules/Bluetooth/tools/pdl)
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(pdl CARGO_HOME=${Rust_CARGO_HOME})
corrosion_set_hostbuild(pdl)
get_property(pdl_EXECUTABLE TARGET pdl 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_pdl PROPERTIES DISABLED True)
set_tests_properties(cargo-test_generate-canonical-tests PROPERTIES DISABLED True)
android_license(
TARGET pdl
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)
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}" PARENT_SCOPE)
file(MAKE_DIRECTORY ${pdl_OUTPUT_DIR})
if(pdl_LANG STREQUAL "rust")
add_custom_command(
OUTPUT "${pdl_OUTPUT_ABSOLUTE}"
COMMAND
${pdl_EXECUTABLE}
--output-format rust
"${pdl_INPUT_ABSOLUTE}"
> "${pdl_OUTPUT_ABSOLUTE}"
COMMENT "Generating rust module from ${pdl_INPUT}"
VERBATIM
DEPENDS pdl ${pdl_INPUT_ABSOLUTE})
endif()
endfunction()
# ~~~
# ! foobar : Compile .pdl files to C++/Rust!
#
# This function allows you to compile a set of .pdl files
# to rust or C++. It will generate a set of headers and
# sources.
#
# :GENERATED: The set of sources that are generated.
# Add these sources to the library you are building
# :SRC: The set of .pdl files to be compiled.
# :INCLUDES: Include directory used when generating sources.
# :LANG: Optional parameter indicating which language to use,
# either rust or c++, defaults to c++
# :NAMESPACE: Root name space to use for the generated c++ classes.
# :OUTPUT_DIR: Optional paramater of the directory where the generated
# sources will be placed, defaults to CMAKE_CURRENT_BINARY_DIR/gens
# :SOURCE_DIR: Root directory where sources can be found,
# defaults to CMAKE_CURRENT_SOURCE_DIR
# ~~~
function(android_bluetooth_packet_gen)
# Parse arguments
set(options)
set(oneValueArgs OUTPUT_DIR GENERATED SOURCE_DIR INCLUDES NAMESPACE LANG)
set(multiValueArgs SRC)
cmake_parse_arguments(packet_gen "${options}" "${oneValueArgs}"
"${multiValueArgs}" ${ARGN})
if(NOT packet_gen_OUTPUT_DIR)
set(packet_gen_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/packet_gen)
endif()
if(packet_gen_NAMESPACE)
set(packet_gen_NAMESPACE "--root_namespace=${packet_gen_NAMESPACE}")
endif()
if(NOT packet_gen_SOURCE_DIR)
set(packet_gen_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
endif()
if(NOT packet_gen_SRC)
message(
FATAL_ERROR
"Error: android_packet_gen_compile() called without any .yy files")
return()
endif()
set(SUFFIX_GEN "h")
if(packet_gen_LANG STREQUAL "rust")
set(SUFFIX_GEN "rs")
set(packet_gen_LANG "--rust")
endif()
# Configure packet_gen
android_compile_for_host(
bluetooth_packetgen ${ANDROID_QEMU2_TOP_DIR}/android/bluetooth/packet_gen
bluetooth_packetgen_EXECUTABLE)
set(BLUE_GEN "")
file(MAKE_DIRECTORY ${packet_gen_OUTPUT_DIR})
foreach(FIL ${packet_gen_SRC})
get_filename_component(
ABS_FIL ${packet_gen_SOURCE_DIR}/${packet_gen_INCLUDES}/${FIL} ABSOLUTE)
get_filename_component(FIL_WE ${FIL} NAME_WE)
get_filename_component(FIL_DIR ${FIL} DIRECTORY)
set(FIL_GEN "${packet_gen_OUTPUT_DIR}/${FIL_DIR}/${FIL_WE}.${SUFFIX_GEN}")
add_custom_command(
OUTPUT "${FIL_GEN}"
COMMAND
${bluetooth_packetgen_EXECUTABLE} ${packet_gen_NAMESPACE}
"--include=${packet_gen_INCLUDES}" "--out=${packet_gen_OUTPUT_DIR}"
${packet_gen_INCLUDES}/${FIL} ${packet_gen_LANG}
COMMENT "Creating bluetooth packet headers from ${ABS_FIL}"
WORKING_DIRECTORY ${packet_gen_SOURCE_DIR}
VERBATIM
DEPENDS ${bluetooth_packetgen_EXECUTABLE} ${ABS_FIL})
list(APPEND BLUE_GEN ${FIL_GEN})
set_source_files_properties(${FIL_GEN} PROPERTIES GENERATED TRUE)
endforeach()
# Make the library available
if(packet_gen_GENERATED)
set(${packet_gen_GENERATED} "${BLUE_GEN}" PARENT_SCOPE)
endif()
endfunction()
android_bluetooth_packet_gen(
GENERATED BluetoothGeneratedPackets_h INCLUDES tools/rootcanal/packets
SRC hci/hci_packets.pdl SOURCE_DIR ${BT_ROOT}/..)
android_bluetooth_packet_gen(
GENERATED RootCanalGeneratedPackets_h INCLUDES tools/rootcanal NAMESPACE model
SRC packets/link_layer_packets.pdl SOURCE_DIR ${BT_ROOT}/..)
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}/config.proto
APPEND_PATH
PROTOPATH -I${AOSP_ROOT}/external/protobuf/src
PROTOC_OUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/config)
target_include_directories(
librootcanal_config
PUBLIC ${CMAKE_CURRENT_BINARY_DIR}/config ${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 BluetoothPacketSources
LICENSE Apache-2.0
SOURCE_DIR ${BT_ROOT}/gd/packet
SRC bit_inserter.cc
byte_inserter.cc
byte_observer.cc
fragmenting_inserter.cc
iterator.cc
packet_view.cc
raw_builder.cc
view.cc
DEPS android-emu-base android-emu-base-headers)
target_include_directories(
BluetoothPacketSources PUBLIC
${ROOTCANAL_ROOT}/emulator
${ROOTCANAL_ROOT}/emulator/include
${ROOTCANAL_ROOT}/include
${BT_ROOT}/gd
${BT_ROOT})
target_compile_options(BluetoothPacketSources
PUBLIC -Wno-inconsistent-missing-override)
android_add_library(
TARGET libbt-rootcanal
LICENSE Apache-2.0
SOURCE_DIR ${ROOTCANAL_ROOT}
SRC ${BluetoothGeneratedPackets_h}
${RootCanalGeneratedPackets_h}
emulator/src/log.cc
lib/crypto/crypto.cc
lib/hci/address.cc
lib/hci/class_of_device.cc
lib/hci/pcap_filter.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/isochronous_connection_handler.cc
model/controller/le_advertiser.cc
model/controller/link_layer_controller.cc
model/controller/sco_connection.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_protocol.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
BluetoothPacketSources
crypto
librootcanal_config
libscriptedbeaconpayload-protos-lite)
target_include_directories(
libbt-rootcanal
PUBLIC ${ROOTCANAL_ROOT}/emulator
${ROOTCANAL_ROOT}/emulator/include
${ROOTCANAL_ROOT}/include
${ROOTCANAL_ROOT}
${BT_ROOT}/gd
${BT_ROOT}
${CMAKE_CURRENT_BINARY_DIR}/packet_gen
${CMAKE_CURRENT_BINARY_DIR}/config)
target_compile_options(libbt-rootcanal
PUBLIC -Wno-inconsistent-missing-override)
add_subdirectory(rust)