package { // See: http://go/android-license-faq // A large-scale-change added 'default_applicable_licenses' to import // all of the 'license_kinds' from "art_license" // to get the below license kinds: // SPDX-license-identifier-Apache-2.0 default_applicable_licenses: ["art_license"], } bootstrap_go_package { name: "soong-art", pkgPath: "android/soong/art", deps: [ "blueprint", "blueprint-pathtools", "blueprint-proptools", "soong", "soong-android", "soong-apex", "soong-cc", ], srcs: [ "art.go", "codegen.go", "makevars.go", ], pluginFor: ["soong_build"], } art_clang_tidy_errors = [ "android-cloexec-dup", "android-cloexec-open", "bugprone-argument-comment", "bugprone-lambda-function-name", "bugprone-unused-raii", // Protect scoped things like MutexLock. "bugprone-unused-return-value", "bugprone-virtual-near-miss", "modernize-use-bool-literals", "modernize-use-nullptr", "modernize-use-using", "performance-faster-string-find", "performance-for-range-copy", "performance-implicit-conversion-in-loop", "performance-noexcept-move-constructor", "performance-unnecessary-copy-initialization", "performance-unnecessary-value-param", "misc-unused-using-decls", ] art_clang_tidy_disabled = [ "-google-default-arguments", // We have local stores that are only used for debug checks. "-clang-analyzer-deadcode.DeadStores", // We are OK with some static globals and that they can, in theory, throw. "-cert-err58-cpp", // We have lots of C-style variadic functions, and are OK with them. JNI ensures // that working around this warning would be extra-painful. "-cert-dcl50-cpp", // "Modernization" we don't agree with. "-modernize-use-auto", "-modernize-return-braced-init-list", "-modernize-use-default-member-init", "-modernize-pass-by-value", ] soong_config_module_type_import { from: "art/build/SoongConfig.bp", module_types: [ "art_module_art_global_defaults", "art_module_cc_defaults", "art_module_java_defaults", ], } art_module_art_global_defaults { // Additional flags are computed by art.go name: "art_defaults", // Disable all ART Soong modules by default when ART prebuilts are in use. // TODO(b/172480617): Clean up when sources are gone from the platform tree // and we no longer need to support sources present when prebuilts are used. enabled: false, soong_config_variables: { source_build: { enabled: true, }, }, // This is the default visibility for the //art package, but we repeat it // here so that it gets merged with other visibility rules in modules // extending these defaults. visibility: ["//art:__subpackages__"], cflags: [ // Base set of cflags used by all things ART. "-fno-rtti", "-ggdb3", "-Wall", "-Werror", "-Wextra", "-Wstrict-aliasing", "-fstrict-aliasing", "-Wunreachable-code", "-Wredundant-decls", "-Wshadow", "-Wunused", "-fvisibility=protected", // Warn about thread safety violations with clang. "-Wthread-safety", // TODO(b/144045034): turn on -Wthread-safety-negative //"-Wthread-safety-negative", // Warn if switch fallthroughs aren't annotated. "-Wimplicit-fallthrough", // Enable float equality warnings. "-Wfloat-equal", // Enable warning of converting ints to void*. "-Wint-to-void-pointer-cast", // Enable warning of wrong unused annotations. "-Wused-but-marked-unused", // Enable warning for deprecated language features. "-Wdeprecated", // Enable warning for unreachable break & return. "-Wunreachable-code-break", "-Wunreachable-code-return", // Disable warning for use of offsetof on non-standard layout type. // We use it to implement OFFSETOF_MEMBER - see macros.h. "-Wno-invalid-offsetof", // Enable inconsistent-missing-override warning. This warning is disabled by default in // Android. "-Winconsistent-missing-override", // Enable thread annotations for std::mutex, etc. "-D_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS", ], arch: { x86: { avx2: { cflags: [ "-mavx2", "-mfma", ], }, }, x86_64: { avx2: { cflags: [ "-mavx2", "-mfma", ], }, }, }, target: { android: { cflags: [ // To use oprofile_android --callgraph, uncomment this and recompile with // mmma -j art // "-fno-omit-frame-pointer", // "-marm", // "-mapcs", ], header_libs: [ // We optimize Thread::Current() with a direct TLS access. This requires access to a // platform specific Bionic header. "bionic_libc_platform_headers", ], }, linux: { cflags: [ // Enable missing-noreturn only on non-Mac. As lots of things are not implemented for // Apple, it's a pain. "-Wmissing-noreturn", ], }, linux_bionic: { header_libs: [ // We optimize Thread::Current() with a direct TLS access. This requires access to a // platform specific Bionic header. "bionic_libc_platform_headers", ], strip: { // Do not strip art libs when building for linux-bionic. // Otherwise we can't get any symbols out of crashes. none: true, }, }, darwin: { enabled: false, }, windows: { // When the module is enabled globally in the soong_config_variables // stanza above, it may get enabled on windows too for some module // types. Hence we need to disable it explicitly. // TODO(b/172480617): Clean up with that. enabled: false, }, host: { cflags: [ // Bug: 15446488. We don't omit the frame pointer to work around // clang/libunwind bugs that cause SEGVs in run-test-004-ThreadStress. "-fno-omit-frame-pointer", // The build assumes that all our x86/x86_64 hosts (such as buildbots and developer // desktops) support at least sse4.2/popcount. This firstly implies that the ART // runtime binary itself may exploit these features. Secondly, this implies that // the ART runtime passes these feature flags to dex2oat and JIT by calling the // method InstructionSetFeatures::FromCppDefines(). Since invoking dex2oat directly // does not pick up these flags, cross-compiling from a x86/x86_64 host to a // x86/x86_64 target should not be affected. "-msse4.2", "-mpopcnt", ], }, }, codegen: { arm: { cflags: ["-DART_ENABLE_CODEGEN_arm"], }, arm64: { cflags: ["-DART_ENABLE_CODEGEN_arm64"], }, x86: { cflags: ["-DART_ENABLE_CODEGEN_x86"], }, x86_64: { cflags: ["-DART_ENABLE_CODEGEN_x86_64"], }, }, tidy_checks: art_clang_tidy_errors + art_clang_tidy_disabled, tidy_checks_as_errors: art_clang_tidy_errors, tidy_flags: [ // The static analyzer treats DCHECK as always enabled; we sometimes get // false positives when we use DCHECKs with code that relies on NDEBUG. "-extra-arg=-UNDEBUG", // clang-tidy complains about functions like: // void foo() { CHECK(kIsFooEnabled); /* do foo... */ } // not being marked noreturn if kIsFooEnabled is false. "-extra-arg=-Wno-missing-noreturn", // Because tidy doesn't like our flow checks for compile-time configuration and thinks that // the following code is dead (it is, but not for all configurations), disable unreachable // code detection in Clang for tidy builds. It is still on for regular build steps, so we // will still get the "real" errors. "-extra-arg=-Wno-unreachable-code", ], min_sdk_version: "S", } // Used to generate binaries that can be backed by transparent hugepages. cc_defaults { name: "art_hugepage_defaults", arch: { arm64: { ldflags: ["-z max-page-size=0x200000"], }, x86_64: { ldflags: ["-z max-page-size=0x200000"], }, }, } cc_defaults { name: "art_pgo_defaults", visibility: ["//art:__subpackages__"], pgo: { sampling: true, }, target: { android_arm64: { pgo: { profile_file: "art/art_arm_arm64.profdata", }, }, android_arm: { pgo: { profile_file: "art/art_arm_arm64.profdata", }, }, android_x86_64: { pgo: { profile_file: "art/art_x86_x86_64.profdata", }, }, android_x86: { pgo: { profile_file: "art/art_x86_x86_64.profdata", }, }, }, } art_debug_defaults { name: "art_debug_defaults", visibility: ["//art:__subpackages__"], cflags: [ "-DDYNAMIC_ANNOTATIONS_ENABLED=1", "-DVIXL_DEBUG", "-UNDEBUG", ], asflags: [ "-UNDEBUG", ], target: { // This has to be duplicated for android and host to make sure it // comes after the -Wframe-larger-than warnings inserted by art.go // target-specific properties android: { cflags: ["-Wno-frame-larger-than="], }, host: { cflags: ["-Wno-frame-larger-than="], }, }, min_sdk_version: "S", } // Use this to enable a cc_* module only when building ART from sources. // TODO(b/172480617): Clean up when sources are gone from the platform tree and // we no longer need to support sources present when prebuilts are used. art_module_cc_defaults { name: "art_module_source_build_defaults", defaults_visibility: [ "//art:__subpackages__", "//libcore:__subpackages__", "//libnativehelper:__subpackages__", ], enabled: false, soong_config_variables: { source_build: { enabled: true, }, }, target: { windows: { // Windows is disabled by default, but if we set enabled:true // globally above we need to disable it explicitly. enabled: false, }, }, } // Use this to enable a java_* module only when building ART from sources. // TODO(b/172480617): Clean up when sources are gone from the platform tree and // we no longer need to support sources present when prebuilts are used. art_module_java_defaults { name: "art_module_source_build_java_defaults", defaults_visibility: [ "//art:__subpackages__", "//libcore:__subpackages__", "//libnativehelper:__subpackages__", ], enabled: false, soong_config_variables: { source_build: { enabled: true, }, }, target: { windows: { // Windows is disabled by default, but if we set enabled:true // globally above we need to disable it explicitly. enabled: false, }, }, } // A version of conscrypt only for enabling the "-hostdex" version to test ART on host. java_library { // We need our own name to not clash with the conscrypt library. name: "conscrypt-host", installable: true, hostdex: true, static_libs: ["conscrypt-for-host"], // Tests and build files rely on this file to be installed as "conscrypt-hostdex", // therefore set a stem. Without it, the file would be installed as // "conscrypt-host-hostdex". stem: "conscrypt", sdk_version: "core_platform", target: { hostdex: { required: ["libjavacrypto"], }, darwin: { // required module "libjavacrypto" is disabled on darwin enabled: false, }, }, } // A version of core-icu4j only for enabling the "-hostdex" version to test ART on host. java_library { // We need our own name to not clash with the core-icu4j library. name: "core-icu4j-host", installable: true, hostdex: true, static_libs: ["core-icu4j-for-host"], // Tests and build files rely on this file to be installed as "core-icu4j-hostdex", // therefore set a stem. Without it, the file would be installed as // "core-icu4j-host-hostdex". stem: "core-icu4j", sdk_version: "core_platform", target: { hostdex: { required: ["libicu_jni"], }, }, }