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
303phony_rule_defaults {
304    name: "berberis_all_deps_defaults",
305    phony_deps: [
306        "berberis_hello_world.native_bridge",
307        "berberis_hello_world_static.native_bridge",
308        "berberis_host_tests",
309        "berberis_ndk_program_tests",
310        "berberis_ndk_program_tests.native_bridge",
311        "berberis_perf_tests_static.native_bridge",
312        "dwarf_reader",
313        "libberberis_emulated_libcamera2ndk_api_checker",
314        "nogrod_unit_tests",
315        "gen_intrinsics_tests",
316    ],
317}
318
319// Note: Keep in sync with variables from `berberis_config.mk` and
320// `frameworks/libs/native_bridge_support/native_bridge_support.mk` indicated below.
321phony_rule_defaults {
322    name: "berberis_all_riscv64_to_x86_64_defaults",
323    phony_deps: [
324        // BERBERIS_PRODUCT_PACKAGES_RISCV64_TO_X86_64
325        "libberberis_exec_region",
326        "libberberis_proxy_libEGL",
327        "libberberis_proxy_libGLESv1_CM",
328        "libberberis_proxy_libGLESv2",
329        "libberberis_proxy_libGLESv3",
330        "libberberis_proxy_libOpenMAXAL",
331        "libberberis_proxy_libOpenSLES",
332        "libberberis_proxy_libaaudio",
333        "libberberis_proxy_libamidi",
334        "libberberis_proxy_libandroid",
335        "libberberis_proxy_libbinder_ndk",
336        "libberberis_proxy_libc",
337        "libberberis_proxy_libcamera2ndk",
338        "libberberis_proxy_libjnigraphics",
339        "libberberis_proxy_libmediandk",
340        "libberberis_proxy_libnativehelper",
341        "libberberis_proxy_libnativewindow",
342        "libberberis_proxy_libneuralnetworks",
343        "libberberis_proxy_libvulkan",
344        "libberberis_proxy_libwebviewchromium_plat_support",
345        "berberis_prebuilt_riscv64",
346        "berberis_program_runner_binfmt_misc_riscv64",
347        "berberis_program_runner_riscv64",
348        "libberberis_riscv64",
349        // NATIVE_BRIDGE_PRODUCT_PACKAGES
350        "libnative_bridge_vdso.native_bridge",
351        "native_bridge_guest_app_process.native_bridge",
352        "native_bridge_guest_linker.native_bridge",
353        // $(addsuffix .native_bridge,$(NATIVE_BRIDGE_ORIG_GUEST_LIBS))
354        "libandroidicu.bootstrap.native_bridge",
355        "libcompiler_rt.native_bridge",
356        "libcrypto.native_bridge",
357        "libcutils.native_bridge",
358        "libdl.bootstrap.native_bridge",
359        "libdl_android.bootstrap.native_bridge",
360        "libicu.bootstrap.native_bridge",
361        "liblog.native_bridge",
362        "libm.bootstrap.native_bridge",
363        "libsqlite.native_bridge",
364        "libssl.native_bridge",
365        "libstdc++.native_bridge",
366        "libsync.native_bridge",
367        "libutils.native_bridge",
368        "libz.native_bridge",
369        // NATIVE_BRIDGE_MODIFIED_GUEST_LIBS
370        "libnative_bridge_guest_libaaudio.native_bridge",
371        "libnative_bridge_guest_libamidi.native_bridge",
372        "libnative_bridge_guest_libandroid.native_bridge",
373        "libnative_bridge_guest_libandroid_runtime.native_bridge",
374        "libnative_bridge_guest_libbinder_ndk.native_bridge",
375        "libnative_bridge_guest_libc.native_bridge",
376        "libnative_bridge_guest_libcamera2ndk.native_bridge",
377        "libnative_bridge_guest_libEGL.native_bridge",
378        "libnative_bridge_guest_libGLESv1_CM.native_bridge",
379        "libnative_bridge_guest_libGLESv2.native_bridge",
380        "libnative_bridge_guest_libGLESv3.native_bridge",
381        "libnative_bridge_guest_libjnigraphics.native_bridge",
382        "libnative_bridge_guest_libmediandk.native_bridge",
383        "libnative_bridge_guest_libnativehelper.native_bridge",
384        "libnative_bridge_guest_libnativewindow.native_bridge",
385        "libnative_bridge_guest_libneuralnetworks.native_bridge",
386        "libnative_bridge_guest_libOpenMAXAL.native_bridge",
387        "libnative_bridge_guest_libOpenSLES.native_bridge",
388        "libnative_bridge_guest_libvulkan.native_bridge",
389        "libnative_bridge_guest_libwebviewchromium_plat_support.native_bridge",
390        // Everything else.
391        "berberis_guest_loader_riscv64_tests",
392    ],
393}
394
395soong_config_module_type {
396    name: "berberis_phony_rule",
397    module_type: "phony_rule",
398    config_namespace: "berberis", // BUILD_BERBERIS
399    variables: ["translation_arch"],
400    properties: [
401        "defaults",
402        "enabled",
403        "phony_deps",
404    ],
405}
406
407soong_config_string_variable {
408    name: "translation_arch",
409    values: [
410        "riscv64_to_x86_64", // BUILD_BERBERIS_RISCV64_TO_X86_64
411    ],
412}
413
414berberis_phony_rule {
415    name: "berberis_all",
416    soong_config_variables: {
417        translation_arch: {
418            riscv64_to_x86_64: {
419                defaults: [
420                    "berberis_all_deps_defaults",
421                    "berberis_all_riscv64_to_x86_64_defaults",
422                ],
423                enabled: true,
424            },
425            conditions_default: {
426                enabled: false,
427            },
428        },
429    },
430}
431