1// Copyright (C) 2023 The Android Open Source Project 2// 3// Licensed under the Apache License, Version 2.0 (the "License"); 4// you may not use this file except in compliance with the License. 5// You may obtain a copy of the License at 6// 7// http://www.apache.org/licenses/LICENSE-2.0 8// 9// Unless required by applicable law or agreed to in writing, software 10// distributed under the License is distributed on an "AS IS" BASIS, 11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12// See the License for the specific language governing permissions and 13// limitations under the License. 14// 15 16package { 17 default_applicable_licenses: ["Android-Apache-2.0"], 18} 19 20cc_defaults { 21 name: "berberis_guest_agnostic_defaults", 22 cflags: [ 23 "-Wall", 24 "-Werror", 25 "-Wextra", 26 "-Wmost", 27 "-Wover-aligned", 28 "-Wunused", 29 "-Wimplicit-fallthrough", 30 "-Werror=reorder-init-list", 31 "-Wdefaulted-function-deleted", 32 ], 33 // It is tempting to disable builds by default and explicitly enable only x86. 34 // Unfortunately that way disabling darwin has no effect. So instead 35 // we disable unneeded targets individually. 36 target: { 37 darwin: { 38 enabled: false, 39 }, 40 }, 41 arch: { 42 arm: { 43 enabled: false, 44 }, 45 arm64: { 46 enabled: false, 47 }, 48 riscv64: { 49 // TODO(b/123294366): disconnect guest arch from host arch! 50 cflags: [ 51 "-DBERBERIS_GUEST_LP64=1", 52 ], 53 }, 54 x86_64: { 55 // TODO(b/123294366): disconnect guest arch from host arch! 56 cflags: [ 57 "-DBERBERIS_GUEST_LP64=1", 58 ], 59 }, 60 }, 61 compile_multilib: "both", 62 // Only check our headers. 63 tidy_flags: [ 64 "-header-filter=^frameworks/libs/binary_translation/", 65 ], 66 tidy_checks: [ 67 "modernize*", 68 "-modernize-use-trailing-return-type", 69 ], 70} 71 72cc_defaults { 73 name: "berberis_defaults", 74 defaults: ["berberis_guest_agnostic_defaults"], 75 arch: { 76 x86_64: { 77 // TODO(b/123294366): disconnect guest arch from host arch! 78 cflags: ["-DNATIVE_BRIDGE_GUEST_ARCH_RISCV64"], 79 }, 80 }, 81} 82 83cc_defaults { 84 name: "berberis_all_hosts_defaults", 85 defaults: ["berberis_defaults"], 86 arch: { 87 arm64: { 88 enabled: true, 89 // TODO(b/123294366): disconnect guest arch from host arch! 90 cflags: [ 91 "-DNATIVE_BRIDGE_GUEST_ARCH_RISCV64", 92 "-DBERBERIS_GUEST_LP64=1", 93 ], 94 }, 95 }, 96} 97 98cc_defaults { 99 name: "berberis_defaults_64", 100 defaults: ["berberis_defaults"], 101 compile_multilib: "64", 102} 103 104cc_defaults { 105 name: "berberis_all_hosts_defaults_64", 106 defaults: ["berberis_all_hosts_defaults"], 107 compile_multilib: "64", 108} 109 110cc_defaults { 111 name: "berberis_arm64_defaults", 112 defaults: ["berberis_guest_agnostic_defaults"], 113 compile_multilib: "64", 114 arch: { 115 // TODO(b/123294366): disconnect guest arch from host arch! 116 x86_64: { 117 cflags: ["-DNATIVE_BRIDGE_GUEST_ARCH_ARM64"], 118 }, 119 riscv64: { 120 cflags: ["-DNATIVE_BRIDGE_GUEST_ARCH_ARM64"], 121 }, 122 }, 123} 124 125cc_defaults { 126 name: "berberis_arm_defaults", 127 defaults: ["berberis_guest_agnostic_defaults"], 128 compile_multilib: "32", 129 arch: { 130 x86: { 131 // TODO(b/123294366): disconnect guest arch from host arch! 132 cflags: ["-DNATIVE_BRIDGE_GUEST_ARCH_ARM"], 133 }, 134 }, 135} 136 137cc_defaults { 138 name: "berberis_test_library_defaults", 139 defaults: ["berberis_defaults"], 140 host_supported: true, 141 shared: { 142 enabled: false, 143 }, 144} 145 146cc_defaults { 147 name: "berberis_test_library_defaults_64", 148 defaults: ["berberis_test_library_defaults"], 149 compile_multilib: "64", 150} 151 152cc_library_shared { 153 name: "libberberis_riscv64", 154 defaults: ["berberis_defaults_64"], 155 host_supported: true, 156 static_libs: [ 157 "libbase", 158 "libberberis_assembler", 159 "libberberis_base", 160 "libberberis_elf_backed_exec_region", 161 "libberberis_instrument", 162 "libberberis_intrinsics", 163 "libberberis_kernel_api_riscv64", 164 "libberberis_runtime_primitives", 165 "libberberis_tinyloader", 166 ], 167 whole_static_libs: [ 168 "libberberis_proxy_loader", 169 ], 170 export_static_lib_headers: [ 171 "libberberis_proxy_loader", 172 ], 173 shared_libs: [ 174 "liblog", 175 ], 176 arch: { 177 x86_64: { 178 static_libs: [ 179 "libberberis_backend_riscv64_to_x86_64", 180 "libberberis_code_gen_lib_riscv64", 181 "libberberis_guest_abi_riscv64", 182 "libberberis_heavy_optimizer_riscv64", 183 "libberberis_interpreter_riscv64", 184 "libberberis_lite_translator_riscv64_to_x86_64", 185 "libberberis_macro_assembler_riscv64_to_x86_64", 186 "libberberis_intrinsics_riscv64", 187 "libberberis_runtime_primitives_riscv64", 188 ], 189 whole_static_libs: [ 190 "libberberis_guest_loader_riscv64", 191 // Proxy libraries reference symbols from guest_os_primitives, 192 // so we need to keep them all. 193 "libberberis_guest_os_primitives_riscv64", 194 // Android debuggerd reference symbols from get_cpu_state. 195 "libberberis_guest_state_riscv64", 196 "libberberis_runtime_riscv64", 197 ], 198 export_static_lib_headers: [ 199 "libberberis_guest_loader_riscv64", 200 ], 201 }, 202 }, 203 target: { 204 android: { 205 whole_static_libs: [ 206 "libberberis_jni_riscv64", 207 "libberberis_native_activity_riscv64", 208 "libberberis_native_bridge_riscv64", 209 ], 210 shared_libs: [ 211 "libandroid", 212 "libdl_android", 213 ], 214 }, 215 }, 216} 217 218cc_test_host { 219 name: "berberis_host_tests", 220 defaults: ["berberis_defaults"], 221 static_libs: [ 222 "libberberis_assembler", 223 "libberberis_base", 224 "libberberis_elf_backed_exec_region", 225 "libberberis_intrinsics", 226 "libberberis_instrument", 227 "libberberis_runtime_primitives", 228 "libberberis_tinyloader", 229 "libgmock", 230 ], 231 shared_libs: [ 232 "libbase", 233 "liblog", 234 ], 235 whole_static_libs: [ 236 "libberberis_assembler_unit_tests", 237 "libberberis_base_unit_tests", 238 "libberberis_elf_backed_exec_region_unit_tests", 239 "libberberis_calling_conventions_unit_tests", 240 "libberberis_intrinsics_unit_tests", 241 "libberberis_tinyloader_unit_tests", 242 "libberberis_runtime_primitives_unit_tests", 243 ], 244 arch: { 245 arm64: { 246 srcs: [ 247 "base/raw_syscall_tests.cc", 248 ], 249 }, 250 x86: { 251 srcs: [ 252 "base/raw_syscall_tests.cc", 253 ], 254 }, 255 x86_64: { 256 srcs: [ 257 "base/raw_syscall_tests.cc", 258 ], 259 static_libs: [ 260 "libberberis_backend_riscv64_to_x86_64", 261 // Note: we don't even need to use anything from that library, just need to ensure it 262 // can be compiled successfully: all checks are done with static_asserts. 263 "libberberis_emulated_libvulkan_api_checker", 264 "libberberis_guest_abi_riscv64", 265 "libberberis_guest_os_primitives_riscv64", 266 "libberberis_guest_state_riscv64", 267 "libberberis_heavy_optimizer_riscv64", 268 "libberberis_interpreter_riscv64", 269 "libberberis_kernel_api_riscv64", 270 "libberberis_lite_translator_riscv64_to_x86_64", 271 "libberberis_macro_assembler_riscv64_to_x86_64", 272 "libberberis_intrinsics_riscv64", 273 "libberberis_runtime", 274 "libberberis_runtime_riscv64", 275 "libberberis_runtime_primitives_riscv64", 276 "libberberis_code_gen_lib_riscv64", 277 ], 278 whole_static_libs: [ 279 "libberberis_tests_main", 280 "libberberis_backend_riscv64_to_x86_64_unit_tests", 281 "libberberis_code_gen_lib_riscv64_unit_tests", 282 "libberberis_guest_abi_riscv64_unit_tests", 283 "libberberis_guest_os_primitives_unit_tests", 284 "libberberis_heavy_optimizer_riscv64_unit_tests", 285 "libberberis_interpreter_riscv64_unit_tests", 286 "libberberis_lite_translator_riscv64_to_x86_64_unit_tests", 287 "libberberis_runtime_riscv64_unit_tests", 288 "libberberis_runtime_primitives_riscv64_unit_tests", 289 "libberberis_cpu_state_riscv64_unit_test", 290 ], 291 }, 292 }, 293 data: [ 294 "tiny_loader/tests/files/32/*", 295 "tiny_loader/tests/files/64/*", 296 ], 297 test_suites: ["device-tests"], 298 test_options: { 299 unit_test: true, 300 }, 301} 302 303// Clang violates psABI: https://groups.google.com/g/x86-64-abi/c/BjOOyihHuqg 304// We want to esnrue that possible fix of this bug wouldn't be unnoticed: b/382703210 305cc_test_host { 306 name: "berberis_host_tests_avx", 307 defaults: ["berberis_defaults"], 308 shared_libs: [ 309 "libbase", 310 "liblog", 311 ], 312 arch: { 313 x86_64: { 314 cflags: ["-mavx"], 315 srcs: ["intrinsics/all_to_x86_64/tuple_test.cc"], 316 // Note: we must NOT use any static or shared libraries with SIMDRegister type involved 317 // here, only header_libs, because those may be compiled with no-avx. 318 // Safest way is to only use libbase/loblog needed for gTest itself. 319 header_libs: ["libberberis_intrinsics_headers"], 320 }, 321 }, 322 test_suites: ["device-tests"], 323 test_options: { 324 unit_test: true, 325 }, 326} 327 328// Ensure that everything works in no-AVX case too (there clang follows psABI correctly). 329cc_test_host { 330 name: "berberis_host_tests_no_avx", 331 defaults: ["berberis_defaults"], 332 shared_libs: [ 333 "libbase", 334 "liblog", 335 ], 336 arch: { 337 x86_64: { 338 cflags: ["-mno-avx"], 339 srcs: ["intrinsics/all_to_x86_64/tuple_test.cc"], 340 // Note: we must NOT use any static or shared libraries with SIMDRegister type involved 341 // here, only header_libs, because those may be compiled with avx. 342 // Safest way is to only use libbase/loblog needed for gTest itself. 343 header_libs: ["libberberis_intrinsics_headers"], 344 }, 345 }, 346 test_suites: ["device-tests"], 347 test_options: { 348 unit_test: true, 349 }, 350} 351 352phony_rule_defaults { 353 name: "berberis_all_deps_defaults", 354 phony_deps: [ 355 "berberis_hello_world.native_bridge", 356 "berberis_hello_world_static.native_bridge", 357 "berberis_host_tests", 358 "berberis_host_tests_avx", 359 "berberis_host_tests_no_avx", 360 "berberis_ndk_program_tests", 361 "berberis_ndk_program_tests.native_bridge", 362 "berberis_perf_tests_static.native_bridge", 363 "dwarf_reader", 364 "libberberis_emulated_libcamera2ndk_api_checker", 365 "nogrod_unit_tests", 366 "gen_intrinsics_tests", 367 ], 368} 369 370// Note: Keep in sync with variables from `berberis_config.mk` and 371// `frameworks/libs/native_bridge_support/native_bridge_support.mk` indicated below. 372phony_rule_defaults { 373 name: "berberis_all_riscv64_to_x86_64_defaults", 374 phony_deps: [ 375 // BERBERIS_PRODUCT_PACKAGES_RISCV64_TO_X86_64 376 "libberberis_exec_region", 377 "libberberis_proxy_libEGL", 378 "libberberis_proxy_libGLESv1_CM", 379 "libberberis_proxy_libGLESv2", 380 "libberberis_proxy_libGLESv3", 381 "libberberis_proxy_libOpenMAXAL", 382 "libberberis_proxy_libOpenSLES", 383 "libberberis_proxy_libaaudio", 384 "libberberis_proxy_libamidi", 385 "libberberis_proxy_libandroid", 386 "libberberis_proxy_libbinder_ndk", 387 "libberberis_proxy_libc", 388 "libberberis_proxy_libcamera2ndk", 389 "libberberis_proxy_libjnigraphics", 390 "libberberis_proxy_libmediandk", 391 "libberberis_proxy_libnativehelper", 392 "libberberis_proxy_libnativewindow", 393 "libberberis_proxy_libneuralnetworks", 394 "libberberis_proxy_libvulkan", 395 "libberberis_proxy_libwebviewchromium_plat_support", 396 "berberis_prebuilt_riscv64", 397 "berberis_program_runner_binfmt_misc_riscv64", 398 "berberis_program_runner_riscv64", 399 "libberberis_riscv64", 400 // NATIVE_BRIDGE_PRODUCT_PACKAGES 401 "libnative_bridge_vdso.native_bridge", 402 "native_bridge_guest_app_process.native_bridge", 403 "native_bridge_guest_linker.native_bridge", 404 // $(addsuffix .native_bridge,$(NATIVE_BRIDGE_ORIG_GUEST_LIBS)) 405 "libandroidicu.bootstrap.native_bridge", 406 "libcompiler_rt.native_bridge", 407 "libcrypto.native_bridge", 408 "libcutils.native_bridge", 409 "libdl.bootstrap.native_bridge", 410 "libdl_android.bootstrap.native_bridge", 411 "libicu.bootstrap.native_bridge", 412 "liblog.native_bridge", 413 "libm.bootstrap.native_bridge", 414 "libsqlite.native_bridge", 415 "libssl.native_bridge", 416 "libstdc++.native_bridge", 417 "libsync.native_bridge", 418 "libutils.native_bridge", 419 "libz.native_bridge", 420 // NATIVE_BRIDGE_MODIFIED_GUEST_LIBS 421 "libnative_bridge_guest_libaaudio.native_bridge", 422 "libnative_bridge_guest_libamidi.native_bridge", 423 "libnative_bridge_guest_libandroid.native_bridge", 424 "libnative_bridge_guest_libandroid_runtime.native_bridge", 425 "libnative_bridge_guest_libbinder_ndk.native_bridge", 426 "libnative_bridge_guest_libc.native_bridge", 427 "libnative_bridge_guest_libcamera2ndk.native_bridge", 428 "libnative_bridge_guest_libEGL.native_bridge", 429 "libnative_bridge_guest_libGLESv1_CM.native_bridge", 430 "libnative_bridge_guest_libGLESv2.native_bridge", 431 "libnative_bridge_guest_libGLESv3.native_bridge", 432 "libnative_bridge_guest_libjnigraphics.native_bridge", 433 "libnative_bridge_guest_libmediandk.native_bridge", 434 "libnative_bridge_guest_libnativehelper.native_bridge", 435 "libnative_bridge_guest_libnativewindow.native_bridge", 436 "libnative_bridge_guest_libneuralnetworks.native_bridge", 437 "libnative_bridge_guest_libOpenMAXAL.native_bridge", 438 "libnative_bridge_guest_libOpenSLES.native_bridge", 439 "libnative_bridge_guest_libvulkan.native_bridge", 440 "libnative_bridge_guest_libwebviewchromium_plat_support.native_bridge", 441 // Everything else. 442 "berberis_guest_loader_riscv64_tests", 443 ], 444} 445 446soong_config_module_type { 447 name: "berberis_phony_rule", 448 module_type: "phony_rule", 449 config_namespace: "berberis", // BUILD_BERBERIS 450 variables: ["translation_arch"], 451 properties: [ 452 "defaults", 453 "enabled", 454 "phony_deps", 455 ], 456} 457 458soong_config_string_variable { 459 name: "translation_arch", 460 values: [ 461 "riscv64_to_x86_64", // BUILD_BERBERIS_RISCV64_TO_X86_64 462 ], 463} 464 465berberis_phony_rule { 466 name: "berberis_all", 467 soong_config_variables: { 468 translation_arch: { 469 riscv64_to_x86_64: { 470 defaults: [ 471 "berberis_all_deps_defaults", 472 "berberis_all_riscv64_to_x86_64_defaults", 473 ], 474 enabled: true, 475 }, 476 conditions_default: { 477 enabled: false, 478 }, 479 }, 480 }, 481} 482