// Defaults for rust backend generation. genrule_defaults { name: "pdl_rust_generator_defaults", cmd: "$(location :pdlc) --output-format rust $(in) > $(out)", tools: [":pdlc"], defaults_visibility: [ "//system/nfc:__subpackages__", "//external/rust/pica", "//external/uwb/src", "//packages/modules/Bluetooth:__subpackages__", "//tools/netsim:__subpackages__", ], } // Defaults for rust_noalloc backend generation. genrule_defaults { name: "pdl_rust_noalloc_generator_defaults", cmd: "$(location :pdlc) --output-format rust_no_alloc $(in) > $(out)", tools: [":pdlc"], } // Defaults for PDL python backend generation. genrule_defaults { name: "pdl_python_generator_defaults", tools: [ ":pdlc", ":pdl_python_generator", ], } // Defaults for PDL C++ backend generation. genrule_defaults { name: "pdl_cxx_generator_defaults", tools: [ ":pdlc", ":pdl_cxx_generator", ], } filegroup { name: "pdl_generated_files", srcs: [ "tests/generated/custom_field_declaration_big_endian.rs", "tests/generated/custom_field_declaration_little_endian.rs", "tests/generated/enum_declaration_big_endian.rs", "tests/generated/enum_declaration_little_endian.rs", "tests/generated/packet_decl_8bit_enum_array_big_endian.rs", "tests/generated/packet_decl_8bit_enum_array_little_endian.rs", "tests/generated/packet_decl_8bit_enum_big_endian.rs", "tests/generated/packet_decl_8bit_enum_little_endian.rs", "tests/generated/packet_decl_8bit_scalar_array_big_endian.rs", "tests/generated/packet_decl_8bit_scalar_array_little_endian.rs", "tests/generated/packet_decl_8bit_scalar_big_endian.rs", "tests/generated/packet_decl_8bit_scalar_little_endian.rs", "tests/generated/packet_decl_24bit_enum_array_big_endian.rs", "tests/generated/packet_decl_24bit_enum_array_little_endian.rs", "tests/generated/packet_decl_24bit_enum_big_endian.rs", "tests/generated/packet_decl_24bit_enum_little_endian.rs", "tests/generated/packet_decl_24bit_scalar_array_big_endian.rs", "tests/generated/packet_decl_24bit_scalar_array_little_endian.rs", "tests/generated/packet_decl_24bit_scalar_big_endian.rs", "tests/generated/packet_decl_24bit_scalar_little_endian.rs", "tests/generated/packet_decl_64bit_enum_array_big_endian.rs", "tests/generated/packet_decl_64bit_enum_array_little_endian.rs", "tests/generated/packet_decl_64bit_enum_big_endian.rs", "tests/generated/packet_decl_64bit_enum_little_endian.rs", "tests/generated/packet_decl_64bit_scalar_array_big_endian.rs", "tests/generated/packet_decl_64bit_scalar_array_little_endian.rs", "tests/generated/packet_decl_64bit_scalar_big_endian.rs", "tests/generated/packet_decl_64bit_scalar_little_endian.rs", "tests/generated/packet_decl_array_dynamic_count_big_endian.rs", "tests/generated/packet_decl_array_dynamic_count_little_endian.rs", "tests/generated/packet_decl_array_dynamic_size_big_endian.rs", "tests/generated/packet_decl_array_dynamic_size_little_endian.rs", "tests/generated/packet_decl_array_unknown_element_width_dynamic_count_big_endian.rs", "tests/generated/packet_decl_array_unknown_element_width_dynamic_count_little_endian.rs", "tests/generated/packet_decl_array_unknown_element_width_dynamic_size_big_endian.rs", "tests/generated/packet_decl_array_unknown_element_width_dynamic_size_little_endian.rs", "tests/generated/packet_decl_array_with_padding_big_endian.rs", "tests/generated/packet_decl_array_with_padding_little_endian.rs", "tests/generated/packet_decl_child_packets_big_endian.rs", "tests/generated/packet_decl_child_packets_little_endian.rs", "tests/generated/packet_decl_complex_scalars_big_endian.rs", "tests/generated/packet_decl_complex_scalars_little_endian.rs", "tests/generated/packet_decl_custom_field_big_endian.rs", "tests/generated/packet_decl_custom_field_little_endian.rs", "tests/generated/packet_decl_empty_big_endian.rs", "tests/generated/packet_decl_empty_little_endian.rs", "tests/generated/packet_decl_fixed_enum_field_big_endian.rs", "tests/generated/packet_decl_fixed_enum_field_little_endian.rs", "tests/generated/packet_decl_fixed_scalar_field_big_endian.rs", "tests/generated/packet_decl_fixed_scalar_field_little_endian.rs", "tests/generated/packet_decl_grand_children_big_endian.rs", "tests/generated/packet_decl_grand_children_little_endian.rs", "tests/generated/packet_decl_mask_scalar_value_big_endian.rs", "tests/generated/packet_decl_mask_scalar_value_little_endian.rs", "tests/generated/packet_decl_mixed_scalars_enums_big_endian.rs", "tests/generated/packet_decl_mixed_scalars_enums_little_endian.rs", "tests/generated/packet_decl_parent_with_alias_child_big_endian.rs", "tests/generated/packet_decl_parent_with_alias_child_little_endian.rs", "tests/generated/packet_decl_parent_with_no_payload_big_endian.rs", "tests/generated/packet_decl_parent_with_no_payload_little_endian.rs", "tests/generated/packet_decl_payload_field_unknown_size_big_endian.rs", "tests/generated/packet_decl_payload_field_unknown_size_little_endian.rs", "tests/generated/packet_decl_payload_field_unknown_size_terminal_big_endian.rs", "tests/generated/packet_decl_payload_field_unknown_size_terminal_little_endian.rs", "tests/generated/packet_decl_payload_field_variable_size_big_endian.rs", "tests/generated/packet_decl_payload_field_variable_size_little_endian.rs", "tests/generated/packet_decl_reserved_field_big_endian.rs", "tests/generated/packet_decl_reserved_field_little_endian.rs", "tests/generated/packet_decl_simple_scalars_big_endian.rs", "tests/generated/packet_decl_simple_scalars_little_endian.rs", "tests/generated/preamble.rs", "tests/generated/struct_decl_complex_scalars_big_endian.rs", "tests/generated/struct_decl_complex_scalars_little_endian.rs", ], } rust_test_host { name: "pdl_tests", srcs: ["src/main.rs"], rustlibs: [ "libargh", "libcodespan_reporting", "libheck", "libpdl_compiler", "libpest", "libprettyplease", "libproc_macro2", "libquote", "libserde", "libserde_json", "libsyn", "libtempfile", ], proc_macros: [ "libpest_derive", "libpaste", ], test_suites: ["general-tests"], data: [ ":pdl_generated_files", ], } genrule { name: "pdl_generated_files_compile_rs", cmd: "$(location tests/generated_files_compile.sh) $(in) > $(out)", srcs: [":pdl_generated_files"], out: ["generated_files_compile.rs"], tool_files: ["tests/generated_files_compile.sh"], } rust_test_host { name: "pdl_generated_files_compile", srcs: [":pdl_generated_files_compile_rs"], test_suites: ["general-tests"], clippy_lints: "none", lints: "none", defaults: ["pdl_backend_defaults"], } // The generators support more features for LE packets than for BE // packets. We use a single input written for LE packets and remove // the parts that don't work for BE packets. We do this by removing // everything between // // // Start: little_endian_only // // and // // // End: little_endian_only // // from the LE packet input. genrule_defaults { name: "pdl_be_test_file_defaults", cmd: "sed -e 's/little_endian_packets/big_endian_packets/' " + " -e '/Start: little_endian_only/,/End: little_endian_only/d' " + " < $(in) > $(out)", } genrule { name: "pdl_be_test_file", defaults: ["pdl_be_test_file_defaults"], srcs: ["tests/canonical/le_test_file.pdl"], out: ["be_test_file.pdl"], } // Generate the Rust parser+serializer backends. genrule { name: "pdl_le_backend", tools: [":pdlc"], cmd: "$(location :pdlc)" + " --output-format rust" + " --exclude-declaration UnsizedCustomField" + " --exclude-declaration Packet_Custom_Field_VariableSize" + " --exclude-declaration Struct_Custom_Field_VariableSize_" + " --exclude-declaration Struct_Custom_Field_VariableSize" + " --exclude-declaration Checksum" + " --exclude-declaration Packet_Checksum_Field_FromStart" + " --exclude-declaration Packet_Checksum_Field_FromEnd" + " --exclude-declaration Struct_Checksum_Field_FromStart_" + " --exclude-declaration Struct_Checksum_Field_FromStart" + " --exclude-declaration Struct_Checksum_Field_FromEnd_" + " --exclude-declaration Struct_Checksum_Field_FromEnd" + " --exclude-declaration PartialParent5" + " --exclude-declaration PartialParent12" + " --exclude-declaration PartialChild5_A" + " --exclude-declaration PartialChild5_B" + " --exclude-declaration PartialChild12_A" + " --exclude-declaration PartialChild12_B" + " --exclude-declaration Packet_Array_Field_UnsizedElement_SizeModifier" + " --exclude-declaration Struct_Array_Field_UnsizedElement_SizeModifier_" + " --exclude-declaration Struct_Array_Field_UnsizedElement_SizeModifier" + " $(in) > $(out)", srcs: ["tests/canonical/le_test_file.pdl"], out: ["le_backend.rs"], } genrule { name: "pdl_be_backend", tools: [":pdlc"], cmd: "$(location :pdlc)" + " --output-format rust" + " --exclude-declaration UnsizedCustomField" + " --exclude-declaration Packet_Custom_Field_VariableSize" + " --exclude-declaration Struct_Custom_Field_VariableSize_" + " --exclude-declaration Struct_Custom_Field_VariableSize" + " --exclude-declaration Checksum" + " --exclude-declaration Packet_Checksum_Field_FromStart" + " --exclude-declaration Packet_Checksum_Field_FromEnd" + " --exclude-declaration Struct_Checksum_Field_FromStart_" + " --exclude-declaration Struct_Checksum_Field_FromStart" + " --exclude-declaration Struct_Checksum_Field_FromEnd_" + " --exclude-declaration Struct_Checksum_Field_FromEnd" + " --exclude-declaration Packet_Array_Field_UnsizedElement_SizeModifier" + " --exclude-declaration Struct_Array_Field_UnsizedElement_SizeModifier_" + " --exclude-declaration Struct_Array_Field_UnsizedElement_SizeModifier" + " $(in) > $(out)", srcs: [":pdl_be_test_file"], out: ["be_backend.rs"], } rust_defaults { name: "pdl_backend_defaults", features: ["serde"], rustlibs: [ "libbytes", "libserde", "libtempfile", "libpdl_runtime", ], } rust_library_host { name: "libpdl_le_backend", crate_name: "pdl_le_backend", srcs: [":pdl_le_backend"], defaults: ["pdl_backend_defaults"], clippy_lints: "none", lints: "none", } rust_library_host { name: "libpdl_be_backend", crate_name: "pdl_be_backend", srcs: [":pdl_be_backend"], defaults: ["pdl_backend_defaults"], clippy_lints: "none", lints: "none", } genrule { name: "pdl_rust_generator_tests_le_src", cmd: "$(location :generate_canonical_tests) $(in) pdl_le_backend > $(out)", srcs: ["tests/canonical/le_test_vectors.json"], out: ["le_canonical.rs"], tools: [":generate_canonical_tests"], } genrule { name: "pdl_rust_generator_tests_be_src", cmd: "$(location :generate_canonical_tests) $(in) pdl_be_backend > $(out)", srcs: ["tests/canonical/be_test_vectors.json"], out: ["be_canonical.rs"], tools: [":generate_canonical_tests"], } rust_test_host { name: "pdl_rust_generator_tests_le", srcs: [":pdl_rust_generator_tests_le_src"], test_suites: ["general-tests"], rustlibs: [ "libnum_traits", "libpdl_le_backend", "libpdl_runtime", "libserde_json", ], clippy_lints: "none", lints: "none", } rust_test_host { name: "pdl_rust_generator_tests_be", srcs: [":pdl_rust_generator_tests_be_src"], test_suites: ["general-tests"], rustlibs: [ "libnum_traits", "libpdl_be_backend", "libpdl_runtime", "libserde_json", ], clippy_lints: "none", lints: "none", } // Generate the python parser+serializer backend for the // little endian test file located at tests/canonical/le_test_file.pdl. genrule { name: "pdl_python_generator_le_test_gen", defaults: ["pdl_python_generator_defaults"], cmd: "set -o pipefail;" + " $(location :pdlc) $(in) |" + " $(location :pdl_python_generator)" + " --output $(out) --custom-type-location tests.custom_types", tool_files: [ "tests/custom_types.py", ], srcs: [ "tests/canonical/le_test_file.pdl", ], out: [ "le_backend.py", ], } // Generate the python parser+serializer backend for a big endian test // file derived from tests/canonical/le_test_file.pdl. genrule { name: "pdl_python_generator_be_test_gen", defaults: ["pdl_python_generator_defaults"], cmd: "set -o pipefail;" + " $(location :pdlc) $(in) |" + " $(location :pdl_python_generator)" + " --output $(out) --custom-type-location tests.custom_types", tool_files: [ "tests/custom_types.py", ], srcs: [ ":pdl_be_test_file", ], out: [ "be_backend.py", ], } // Test the generated python parser+serializer against // pre-generated binary inputs. python_test_host { name: "pdl_python_generator_test", main: "tests/python_generator_test.py", srcs: [ ":pdl_python_generator_be_test_gen", ":pdl_python_generator_le_test_gen", "tests/custom_types.py", "tests/python_generator_test.py", ], data: [ "tests/canonical/be_test_vectors.json", "tests/canonical/le_test_vectors.json", ], libs: [ "typing_extensions", ], test_options: { unit_test: true, }, version: { py3: { embedded_launcher: true, }, }, } // Generate the rust_noalloc backend srcs against the little-endian test vectors genrule { name: "pdl_rust_noalloc_le_test_backend_srcs", defaults: ["pdl_rust_noalloc_generator_defaults"], srcs: ["tests/canonical/le_rust_noalloc_test_file.pdl"], out: ["_packets.rs"], } // Generate the C++ parser+serializer backend for the // little endian test file located at tests/canonical/le_test_file.pdl. genrule { name: "pdl_cxx_canonical_le_src_gen", defaults: ["pdl_cxx_generator_defaults"], cmd: "set -o pipefail;" + " $(location :pdlc) $(in) |" + " $(location :pdl_cxx_generator)" + " --namespace le_test" + " --output $(out)", srcs: [ "tests/canonical/le_test_file.pdl", ], out: [ "canonical_le_test_file.h", ], } // Generate the C++ parser+serializer backend tests for the // little endian test file located at tests/canonical/le_test_file.pdl. genrule { name: "pdl_cxx_canonical_le_test_gen", cmd: "set -o pipefail;" + " inputs=( $(in) ) &&" + " $(location :pdlc) $${inputs[0]} |" + " $(location :pdl_cxx_unittest_generator)" + " --output $(out)" + " --test-vectors $${inputs[1]}" + " --include-header $$(basename $${inputs[2]})" + " --using-namespace le_test" + " --namespace le_test" + " --parser-test-suite LeParserTest" + " --serializer-test-suite LeSerializerTest", tools: [ ":pdlc", ":pdl_cxx_unittest_generator", ], srcs: [ "tests/canonical/le_test_file.pdl", "tests/canonical/le_test_vectors.json", ":pdl_cxx_canonical_le_src_gen", ], out: [ "canonical_le_test.cc", ], } // Generate the C++ parser+serializer backend for the // big endian test file. genrule { name: "pdl_cxx_canonical_be_src_gen", defaults: ["pdl_cxx_generator_defaults"], cmd: "set -o pipefail;" + " $(location :pdlc) $(in) |" + " $(location :pdl_cxx_generator)" + " --namespace be_test" + " --output $(out)", srcs: [ ":pdl_be_test_file", ], out: [ "canonical_be_test_file.h", ], } // Generate the C++ parser+serializer backend tests for the // big endian test file. genrule { name: "pdl_cxx_canonical_be_test_gen", cmd: "set -o pipefail;" + " inputs=( $(in) ) &&" + " $(location :pdlc) $${inputs[0]} |" + " $(location :pdl_cxx_unittest_generator)" + " --output $(out)" + " --test-vectors $${inputs[1]}" + " --include-header $$(basename $${inputs[2]})" + " --using-namespace be_test" + " --namespace be_test" + " --parser-test-suite BeParserTest" + " --serializer-test-suite BeSerializerTest", tools: [ ":pdlc", ":pdl_cxx_unittest_generator", ], srcs: [ ":pdl_be_test_file", "tests/canonical/be_test_vectors.json", ":pdl_cxx_canonical_be_src_gen", ], out: [ "canonical_be_test.cc", ], } // Test the generated C++ parser+serializer against // pre-generated binary inputs. cc_test_host { name: "pdl_cxx_generator_test", local_include_dirs: [ "scripts", ], generated_headers: [ "pdl_cxx_canonical_be_src_gen", "pdl_cxx_canonical_le_src_gen", ], generated_sources: [ "pdl_cxx_canonical_be_test_gen", "pdl_cxx_canonical_le_test_gen", ], static_libs: [ "libgtest", ], }