| // Copyright (C) 2023 The Android Open Source Project | |
| // | |
| // Licensed under the Apache License, Version 2.0 (the "License"); | |
| // you may not use this file except in compliance with the License. | |
| // You may obtain a copy of the License at | |
| // | |
| // http://www.apache.org/licenses/LICENSE-2.0 | |
| // | |
| // Unless required by applicable law or agreed to in writing, software | |
| // distributed under the License is distributed on an "AS IS" BASIS, | |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| // See the License for the specific language governing permissions and | |
| // limitations under the License. | |
| // | |
| package { | |
| default_applicable_licenses: ["Android-Apache-2.0"], | |
| // TODO(b/232598137): This group is too wide. Figure out if we | |
| // can have berberis-only team on trendy. | |
| default_team: "trendy_team_arc_", | |
| } | |
| cc_defaults { | |
| name: "berberis_cflags_defaults", | |
| cflags: [ | |
| "-Wall", | |
| "-Werror", | |
| "-Wextra", | |
| "-Wmost", | |
| "-Wover-aligned", | |
| "-Wunused", | |
| "-Werror=deprecated-volatile", | |
| "-Werror=unused-variable", | |
| "-Wimplicit-fallthrough", | |
| "-Werror=reorder-init-list", | |
| "-Wdefaulted-function-deleted", | |
| ], | |
| } | |
| cc_defaults { | |
| name: "berberis_guest_agnostic_defaults", | |
| defaults: ["berberis_cflags_defaults"], | |
| // It is tempting to disable builds by default and explicitly enable only x86. | |
| // Unfortunately that way disabling darwin has no effect. So instead | |
| // we disable unneeded targets individually. | |
| target: { | |
| darwin: { | |
| enabled: false, | |
| }, | |
| }, | |
| arch: { | |
| arm: { | |
| enabled: false, | |
| cflags: ["-DBERBERIS_GUEST_ILP32=1"], | |
| }, | |
| arm64: { | |
| enabled: false, | |
| cflags: ["-DBERBERIS_GUEST_LP64=1"], | |
| }, | |
| riscv64: { | |
| cflags: ["-DBERBERIS_GUEST_LP64=1"], | |
| }, | |
| x86: { | |
| cflags: ["-DBERBERIS_GUEST_ILP32=1"], | |
| }, | |
| x86_64: { | |
| cflags: ["-DBERBERIS_GUEST_LP64=1"], | |
| }, | |
| }, | |
| compile_multilib: "both", | |
| // Only check our headers. | |
| tidy_flags: [ | |
| "-header-filter=^frameworks/libs/binary_translation/", | |
| ], | |
| tidy_checks: [ | |
| "modernize*", | |
| "-modernize-use-trailing-return-type", | |
| ], | |
| } | |
| cc_defaults { | |
| name: "berberis_guest_agnostic_defaults_64", | |
| defaults: ["berberis_guest_agnostic_defaults"], | |
| compile_multilib: "64", | |
| } | |
| cc_defaults { | |
| name: "berberis_enable_arm64_host_defaults", | |
| arch: { | |
| arm64: { | |
| enabled: true, | |
| }, | |
| }, | |
| } | |
| cc_defaults { | |
| name: "berberis_riscv64_defaults", | |
| defaults: ["berberis_guest_agnostic_defaults"], | |
| compile_multilib: "64", | |
| arch: { | |
| arm64: { | |
| // TODO(b/123294366): disconnect guest arch from host arch! | |
| cflags: ["-DNATIVE_BRIDGE_GUEST_ARCH_RISCV64"], | |
| }, | |
| x86_64: { | |
| // TODO(b/123294366): disconnect guest arch from host arch! | |
| cflags: ["-DNATIVE_BRIDGE_GUEST_ARCH_RISCV64"], | |
| }, | |
| }, | |
| } | |
| cc_defaults { | |
| name: "berberis_arm_or_arm64_defaults", | |
| defaults: ["berberis_guest_agnostic_defaults"], | |
| arch: { | |
| x86: { | |
| cflags: ["-DNATIVE_BRIDGE_GUEST_ARCH_ARM"], | |
| }, | |
| x86_64: { | |
| cflags: ["-DNATIVE_BRIDGE_GUEST_ARCH_ARM64"], | |
| }, | |
| riscv64: { | |
| cflags: ["-DNATIVE_BRIDGE_GUEST_ARCH_ARM64"], | |
| }, | |
| }, | |
| } | |
| cc_defaults { | |
| name: "berberis_arm_defaults", | |
| defaults: ["berberis_arm_or_arm64_defaults"], | |
| compile_multilib: "32", | |
| } | |
| cc_defaults { | |
| name: "berberis_arm64_defaults", | |
| defaults: ["berberis_arm_or_arm64_defaults"], | |
| compile_multilib: "64", | |
| } | |
| cc_defaults { | |
| name: "berberis_test_library_defaults", | |
| defaults: ["berberis_guest_agnostic_defaults"], | |
| host_supported: true, | |
| shared: { | |
| enabled: false, | |
| }, | |
| } | |
| cc_defaults { | |
| name: "berberis_test_library_defaults_64", | |
| defaults: ["berberis_test_library_defaults"], | |
| compile_multilib: "64", | |
| } | |
| cc_library_shared { | |
| name: "libberberis_riscv64", | |
| defaults: ["berberis_guest_agnostic_defaults_64"], | |
| host_supported: true, | |
| static_libs: [ | |
| "libbase", | |
| "libberberis_assembler", | |
| "libberberis_base", | |
| "libberberis_elf_backed_exec_region", | |
| "libberberis_instrument", | |
| "libberberis_kernel_api_riscv64", | |
| "libberberis_runtime_primitives", | |
| "libberberis_tinyloader", | |
| ], | |
| whole_static_libs: [ | |
| "libberberis_proxy_loader", | |
| ], | |
| export_static_lib_headers: [ | |
| "libberberis_proxy_loader", | |
| ], | |
| shared_libs: [ | |
| "liblog", | |
| ], | |
| arch: { | |
| x86_64: { | |
| static_libs: [ | |
| "libberberis_backend_riscv64_to_x86_64", | |
| "libberberis_code_gen_lib_riscv64", | |
| "libberberis_guest_abi_riscv64", | |
| "libberberis_heavy_optimizer_riscv64", | |
| "libberberis_interpreter_riscv64", | |
| "libberberis_intrinsics_riscv64", | |
| "libberberis_lite_translator_riscv64_to_x86_64", | |
| "libberberis_macro_assembler_riscv64_to_x86_64", | |
| "libberberis_runtime_library_riscv64", | |
| "libberberis_runtime_primitives_riscv64", | |
| "libberberis_translator_riscv64", | |
| ], | |
| whole_static_libs: [ | |
| "libberberis_guest_loader_riscv64", | |
| // Proxy libraries reference symbols from guest_os_primitives, | |
| // so we need to keep them all. | |
| "libberberis_guest_os_primitives_riscv64", | |
| // Android debuggerd reference symbols from get_cpu_state. | |
| "libberberis_guest_state_riscv64", | |
| "libberberis_runtime_riscv64", | |
| ], | |
| export_static_lib_headers: [ | |
| "libberberis_guest_loader_riscv64", | |
| ], | |
| }, | |
| }, | |
| target: { | |
| android: { | |
| whole_static_libs: [ | |
| "libberberis_jni_riscv64", | |
| "libberberis_native_activity_riscv64", | |
| "libberberis_native_bridge_riscv64", | |
| ], | |
| shared_libs: [ | |
| "libdl_android", | |
| ], | |
| }, | |
| }, | |
| } | |
| cc_test_host { | |
| name: "berberis_host_tests", | |
| defaults: ["berberis_guest_agnostic_defaults"], | |
| static_libs: [ | |
| "libberberis_assembler", | |
| "libberberis_base", | |
| "libberberis_elf_backed_exec_region", | |
| "libberberis_instrument", | |
| "libberberis_runtime_primitives", | |
| "libberberis_tinyloader", | |
| "libgmock", | |
| ], | |
| shared_libs: [ | |
| "libbase", | |
| "liblog", | |
| ], | |
| whole_static_libs: [ | |
| "libberberis_assembler_unit_tests", | |
| "libberberis_base_unit_tests", | |
| "libberberis_calling_conventions_unit_tests", | |
| "libberberis_device_arch_info_tests", | |
| "libberberis_elf_backed_exec_region_unit_tests", | |
| "libberberis_intrinsics_unit_tests", | |
| "libberberis_tinyloader_unit_tests", | |
| "libberberis_runtime_primitives_unit_tests", | |
| ], | |
| arch: { | |
| arm64: { | |
| whole_static_libs: [ | |
| "libberberis_intrinsics_unit_tests_riscv64", | |
| ], | |
| srcs: [ | |
| "base/raw_syscall_tests.cc", | |
| ], | |
| }, | |
| x86: { | |
| srcs: [ | |
| "base/raw_syscall_tests.cc", | |
| ], | |
| }, | |
| x86_64: { | |
| srcs: [ | |
| "base/raw_syscall_tests.cc", | |
| ], | |
| static_libs: [ | |
| "libberberis_backend_riscv64_to_x86_64", | |
| "libberberis_code_gen_lib_riscv64", | |
| // Note: we don't even need to use anything from that library, just need to ensure it | |
| // can be compiled successfully: all checks are done with static_asserts. | |
| "libberberis_emulated_libvulkan_api_checker", | |
| "libberberis_guest_abi_riscv64", | |
| "libberberis_guest_os_primitives_riscv64", | |
| "libberberis_guest_state_riscv64", | |
| "libberberis_heavy_optimizer_riscv64", | |
| "libberberis_interpreter_riscv64", | |
| "libberberis_intrinsics_riscv64", | |
| "libberberis_kernel_api_riscv64", | |
| "libberberis_lite_translator_riscv64_to_x86_64", | |
| "libberberis_macro_assembler_riscv64_to_x86_64", | |
| "libberberis_runtime_riscv64", | |
| "libberberis_runtime_library_riscv64", | |
| "libberberis_runtime_primitives_riscv64", | |
| "libberberis_translator_riscv64", | |
| ], | |
| whole_static_libs: [ | |
| "libberberis_backend_riscv64_to_x86_64_unit_tests", | |
| "libberberis_code_gen_lib_riscv64_unit_tests", | |
| "libberberis_cpu_state_riscv64_unit_test", | |
| "libberberis_guest_abi_riscv64_unit_tests", | |
| "libberberis_guest_os_primitives_unit_tests", | |
| "libberberis_heavy_optimizer_riscv64_unit_tests", | |
| "libberberis_interpreter_riscv64_unit_tests", | |
| "libberberis_intrinsics_unit_tests_riscv64", | |
| "libberberis_lite_translator_riscv64_to_x86_64_unit_tests", | |
| "libberberis_runtime_riscv64_unit_tests", | |
| "libberberis_runtime_primitives_riscv64_unit_tests", | |
| "libberberis_tests_main", | |
| "libberberis_translator_riscv64_unit_tests", | |
| ], | |
| }, | |
| }, | |
| data: [ | |
| "tiny_loader/tests/files/32/*", | |
| "tiny_loader/tests/files/64/*", | |
| ], | |
| test_suites: ["device-tests"], | |
| test_options: { | |
| unit_test: true, | |
| }, | |
| } | |
| filegroup { | |
| name: "berberis_host_tests_data_32", | |
| srcs: [ | |
| "tiny_loader/tests/files/32/*", | |
| ], | |
| } | |
| filegroup { | |
| name: "berberis_host_tests_data_64", | |
| srcs: [ | |
| "tiny_loader/tests/files/64/*", | |
| ], | |
| } | |
| // Clang violates psABI: https://groups.google.com/g/x86-64-abi/c/BjOOyihHuqg | |
| // We want to esnrue that possible fix of this bug wouldn't be unnoticed: b/382703210 | |
| cc_test_host { | |
| name: "berberis_host_tests_avx", | |
| defaults: ["berberis_guest_agnostic_defaults"], | |
| shared_libs: [ | |
| "libbase", | |
| "liblog", | |
| ], | |
| arch: { | |
| x86_64: { | |
| cflags: ["-mavx"], | |
| srcs: ["cpu_emulation/intrinsics/all_to_x86_64/tuple_test.cc"], | |
| // Note: we must NOT use any static or shared libraries with SIMDRegister type involved | |
| // here, only header_libs, because those may be compiled with no-avx. | |
| // Safest way is to only use libbase/loblog needed for gTest itself. | |
| header_libs: ["libberberis_intrinsics_headers"], | |
| }, | |
| }, | |
| test_suites: ["device-tests"], | |
| test_options: { | |
| unit_test: true, | |
| }, | |
| } | |
| // Ensure that everything works in no-AVX case too (there clang follows psABI correctly). | |
| cc_test_host { | |
| name: "berberis_host_tests_no_avx", | |
| defaults: ["berberis_guest_agnostic_defaults"], | |
| shared_libs: [ | |
| "libbase", | |
| "liblog", | |
| ], | |
| arch: { | |
| x86_64: { | |
| cflags: ["-mno-avx"], | |
| srcs: ["cpu_emulation/intrinsics/all_to_x86_64/tuple_test.cc"], | |
| // Note: we must NOT use any static or shared libraries with SIMDRegister type involved | |
| // here, only header_libs, because those may be compiled with avx. | |
| // Safest way is to only use libbase/loblog needed for gTest itself. | |
| header_libs: ["libberberis_intrinsics_headers"], | |
| }, | |
| }, | |
| test_suites: ["device-tests"], | |
| test_options: { | |
| unit_test: true, | |
| }, | |
| } | |
| // This module is used as a workaround to define those deps of berberis_all_deps_defaults which are native_bridge only. | |
| ndk_translation_package { | |
| name: "berberis_all_deps_intermediate_package", | |
| compile_multilib: "both", | |
| native_bridge_supported: true, | |
| native_bridge_deps: [ | |
| "berberis_hello_world", | |
| "berberis_hello_world_static", | |
| "berberis_ndk_program_tests", | |
| "berberis_perf_tests_static", | |
| ], | |
| generate_build_files: false, | |
| } | |
| phony_rule_defaults { | |
| name: "berberis_all_deps_defaults", | |
| phony_deps: [ | |
| "berberis_host_tests", | |
| "berberis_host_tests_avx", | |
| "berberis_host_tests_no_avx", | |
| "berberis_ndk_program_tests", | |
| "dwarf_reader", | |
| "libberberis_emulated_libcamera2ndk_api_checker", | |
| "nogrod_unit_tests", | |
| "gen_intrinsics_tests", | |
| // The intermediate packages to declare those deps which are native_bridge variant. | |
| "berberis_all_deps_intermediate_package", | |
| ], | |
| } | |
| // This module is used as a workaround to define those deps of berberis_all_deps_defaults which are native_bridge only. | |
| ndk_translation_package { | |
| name: "berberis_all_riscv64_to_x86_64_intermediate_package", | |
| compile_multilib: "both", | |
| native_bridge_supported: true, | |
| native_bridge_deps: [ | |
| // NATIVE_BRIDGE_PRODUCT_PACKAGES | |
| "libnative_bridge_vdso", | |
| "native_bridge_guest_app_process", | |
| "native_bridge_guest_linker", | |
| "libandroidicu", | |
| "libcompiler_rt", | |
| "libcrypto", | |
| "libcutils", | |
| "libdl", | |
| "libdl_android", | |
| "libicu", | |
| "liblog", | |
| "libm", | |
| "libsqlite", | |
| "libssl", | |
| "libstdc++", | |
| "libsync", | |
| "libutils", | |
| "libz", | |
| // NATIVE_BRIDGE_MODIFIED_GUEST_LIBS | |
| "libnative_bridge_guest_libaaudio", | |
| "libnative_bridge_guest_libamidi", | |
| "libnative_bridge_guest_libandroid", | |
| "libnative_bridge_guest_libandroid_runtime", | |
| "libnative_bridge_guest_libbinder_ndk", | |
| "//frameworks/libs/native_bridge_support/android_api/libc:libnative_bridge_guest_libc", | |
| "libnative_bridge_guest_libcamera2ndk", | |
| "libnative_bridge_guest_libEGL", | |
| "libnative_bridge_guest_libGLESv1_CM", | |
| "libnative_bridge_guest_libGLESv2", | |
| "libnative_bridge_guest_libGLESv3", | |
| "libnative_bridge_guest_libjnigraphics", | |
| "libnative_bridge_guest_libmediandk", | |
| "libnative_bridge_guest_libnativehelper", | |
| "libnative_bridge_guest_libnativewindow", | |
| "libnative_bridge_guest_libneuralnetworks", | |
| "libnative_bridge_guest_libOpenMAXAL", | |
| "libnative_bridge_guest_libOpenSLES", | |
| "libnative_bridge_guest_libvulkan", | |
| "libnative_bridge_guest_libwebviewchromium_plat_support", | |
| ], | |
| generate_build_files: false, | |
| } | |
| // Note: Keep in sync with variables from `berberis_config.mk` and | |
| // `frameworks/libs/native_bridge_support/native_bridge_support.mk` indicated below. | |
| phony_rule_defaults { | |
| name: "berberis_all_riscv64_to_x86_64_defaults", | |
| phony_deps: [ | |
| // BERBERIS_PRODUCT_PACKAGES_RISCV64_TO_X86_64 | |
| "libberberis_exec_region", | |
| "libberberis_proxy_libEGL", | |
| "libberberis_proxy_libGLESv1_CM", | |
| "libberberis_proxy_libGLESv2", | |
| "libberberis_proxy_libGLESv3", | |
| "libberberis_proxy_libOpenMAXAL", | |
| "libberberis_proxy_libOpenSLES", | |
| "libberberis_proxy_libaaudio", | |
| "libberberis_proxy_libamidi", | |
| "libberberis_proxy_libandroid", | |
| "libberberis_proxy_libbinder_ndk", | |
| "libberberis_proxy_libc", | |
| "libberberis_proxy_libcamera2ndk", | |
| "libberberis_proxy_libjnigraphics", | |
| "libberberis_proxy_libmediandk", | |
| "libberberis_proxy_libnativehelper", | |
| "libberberis_proxy_libnativewindow", | |
| "libberberis_proxy_libneuralnetworks", | |
| "libberberis_proxy_libvulkan", | |
| "libberberis_proxy_libwebviewchromium_plat_support", | |
| "berberis_prebuilt_riscv64", | |
| "berberis_program_runner_binfmt_misc_riscv64", | |
| "berberis_program_runner_riscv64", | |
| "libberberis_riscv64", | |
| // The intermediate packages to declare those deps which are native_bridge variant. | |
| "berberis_all_riscv64_to_x86_64_intermediate_package", | |
| // Everything else. | |
| "berberis_guest_loader_riscv64_tests", | |
| ], | |
| } | |
| soong_config_module_type { | |
| name: "berberis_phony_rule", | |
| module_type: "phony_rule", | |
| config_namespace: "berberis", // BUILD_BERBERIS | |
| variables: ["translation_arch"], | |
| properties: [ | |
| "defaults", | |
| "enabled", | |
| "phony_deps", | |
| ], | |
| } | |
| soong_config_string_variable { | |
| name: "translation_arch", | |
| values: [ | |
| "riscv64_to_x86_64", // BUILD_BERBERIS_RISCV64_TO_X86_64 | |
| ], | |
| } | |
| berberis_phony_rule { | |
| name: "berberis_all", | |
| soong_config_variables: { | |
| translation_arch: { | |
| riscv64_to_x86_64: { | |
| defaults: [ | |
| "berberis_all_deps_defaults", | |
| "berberis_all_riscv64_to_x86_64_defaults", | |
| ], | |
| enabled: true, | |
| }, | |
| conditions_default: { | |
| enabled: false, | |
| }, | |
| }, | |
| }, | |
| phony_deps: select(soong_config_variable("berberis", "target_native_bridge_abi"), { | |
| "riscv64": [ | |
| "berberis_host_tests_result", | |
| ], | |
| default: [ | |
| ], | |
| }), | |
| } | |
| python_binary_host { | |
| name: "berberis_gen_gtest_failure_template", | |
| main: "tests/gen_gtest_failure_template.py", | |
| srcs: ["tests/gen_gtest_failure_template.py"], | |
| } |