blob: 24c727a407d35b85051f92f9216f456cf7e6246b [file] [log] [blame]
package {
default_applicable_licenses: ["external_zlib_license"],
}
license {
name: "external_zlib_license",
visibility: [":__subpackages__"],
license_kinds: [
"SPDX-license-identifier-BSD",
"SPDX-license-identifier-Zlib",
],
license_text: [
"LICENSE",
],
}
// These cflags are shared --- not only between all architectures,
// but between libz and libz_stable too.
cflags_shared = [
// Our compiler does support hidden visibility.
"-DHAVE_HIDDEN",
// Our compiler does support const.
"-DZLIB_CONST",
// Use the traditional Rabin-Karp rolling hash to match zlib DEFLATE output exactly.
"-DCHROMIUM_ZLIB_NO_CASTAGNOLI",
// Enable -O3 for everyone, as chromium's BUILD.gn does.
"-O3",
"-Wall",
"-Werror",
"-Wno-deprecated-non-prototype",
"-Wno-unused",
"-Wno-unused-parameter",
]
cflags_arm = [
// Even the NDK dropped non-neon support in r24.
"-DADLER32_SIMD_NEON",
// HWCAP_CRC32 is checked at runtime, so it's okay to enable crc32
// acceleration for both 64-bit and 32-bit (which may be armv7, at
// least for NDK users).
"-DCRC32_ARMV8_CRC32",
// TODO: DINFLATE_CHUNK_SIMD_NEON causes `atest org.apache.harmony.tests.java.util.zip.DeflaterTest` failures.
// "-DINFLATE_CHUNK_SIMD_NEON",
]
cflags_arm64 = cflags_arm + ["-DINFLATE_CHUNK_READ_64LE"]
cflags_riscv64 = [
// TODO: test and enable these.
// "-DRISCV_RVV",
// "-DADLER32_SIMD_RVV",
]
// The *host* x86 configuration (with *lower* CPU feature requirements).
cflags_x86 = [
// See ARMV8_OS_LINUX above.
"-DX86_NOT_WINDOWS",
// Android's host CPU feature requirements are *lower* than the
// corresponding device CPU feature requirements, so it's easier to just
// say "no SIMD for you" rather than specificially disable SSSE3.
// We should have a conversation about that, but not until we at least have
// data on how many Studio users have CPUs that don't make the grade...
// https://issuetracker.google.com/171235570
"-DCPU_NO_SIMD",
]
cflags_x86_64 = cflags_x86 + ["-DINFLATE_CHUNK_READ_64LE"]
// The additional *device* x86/x86_64 configuration. Devices have *higher* CPU
// feature requirements than the host.
cflags_android_x86 = [
// Android's x86 and x86-64 ABIs both include SSE2 and SSSE3.
"-UCPU_NO_SIMD",
"-DADLER32_SIMD_SSSE3",
// TODO: DINFLATE_CHUNK_SIMD_SSE2 causes `atest org.apache.harmony.tests.java.util.zip.DeflaterTest` failures.
// "-DINFLATE_CHUNK_SIMD_SSE2",
]
libz_srcs = [
"adler32.c",
"adler32_simd.c",
"compress.c",
"cpu_features.c",
"crc32.c",
"crc32_simd.c",
"crc_folding.c",
"deflate.c",
"gzclose.c",
"gzlib.c",
"gzread.c",
"gzwrite.c",
"infback.c",
"inffast.c",
"inflate.c",
"inftrees.c",
"trees.c",
"uncompr.c",
"zutil.c",
// Not-yet-enabled optimizations.
// See https://chromium-review.googlesource.com/749732.
// TODO: causes `atest org.apache.harmony.tests.java.util.zip.DeflaterTest` failures.
// "contrib/optimizations/inffast_chunk.c",
// "contrib/optimizations/inflate.c",
]
cc_defaults {
name: "libz_defaults",
cflags: cflags_shared,
stl: "none",
export_include_dirs: ["."],
host_supported: true,
native_bridge_supported: true,
vendor_available: true,
product_available: true,
ramdisk_available: true,
vendor_ramdisk_available: true,
recovery_available: true,
arch: {
arm: {
// TODO: This is to work around b/24465209. Remove after root cause
// is fixed.
pack_relocations: false,
ldflags: ["-Wl,--hash-style=both"],
cflags: cflags_arm,
},
arm64: {
cflags: cflags_arm64,
},
riscv64: {
cflags: cflags_riscv64,
},
x86: {
cflags: cflags_x86,
},
x86_64: {
cflags: cflags_x86_64,
},
},
target: {
android_arm: {
cflags: [
// Since we're building for the platform, we claim to be Linux rather than
// Android so we use getauxval() directly instead of the NDK
// android_getCpuFeatures which isn't available to us anyway.
"-DARMV8_OS_LINUX",
],
},
android_x86: {
cflags: cflags_android_x86,
},
android_x86_64: {
cflags: cflags_android_x86,
},
darwin_arm64: {
cflags: [
"-DARMV8_OS_MACOS",
],
},
linux_bionic: {
enabled: true,
},
linux_arm64: {
cflags: [
// Since we're building for the platform, we claim to be Linux rather than
// Android so we use getauxval() directly instead of the NDK
// android_getCpuFeatures which isn't available to us anyway.
"-DARMV8_OS_LINUX",
],
},
windows: {
enabled: true,
},
},
}
cc_library {
name: "libz",
defaults: ["libz_defaults"],
whole_static_libs: ["libz_static"],
unique_host_soname: true,
static_ndk_lib: true,
double_loadable: true,
stubs: {
versions: [
"29",
"30",
],
symbol_file: "libz.map.txt",
},
// When used by Vendor/Product APEX,
// libz should be treated like non-stable module.
// (Hence, should be bundled in APEX).
target: {
product: {
no_stubs: true,
},
vendor: {
no_stubs: true,
},
},
}
cc_library {
name: "libz_static",
defaults: ["libz_defaults"],
visibility: [
"//external/angle",
"//system/unwinding/libunwindstack",
],
srcs: libz_srcs,
sdk_version: "minimum",
min_sdk_version: "apex_inherit",
apex_available: [
"com.android.art",
"com.android.art.debug",
"com.android.runtime",
"//apex_available:platform",
],
}
// A build of libz with identical behavior between architectures.
// Used by legacy OTA tools such as imgdiff and updater and their tests.
// New code should not use this library, because new code should not make
// assumptions about the _compressed_ bits, beyond the fact that they will
// decompress to the same input bytes. The actual compressed byte sequences
// can and do differ over time.
cc_library {
name: "libz_stable",
visibility: [
"//bootable/recovery/applypatch",
"//bootable/recovery/tests",
"//bootable/recovery/updater",
"//bootable/deprecated-ota/applypatch",
"//bootable/deprecated-ota/tests",
"//bootable/deprecated-ota/updater",
],
// We only use the shared flags here; the whole point is that this
// library behaves the same on all different architectures.
cflags: cflags_shared,
stl: "none",
export_include_dirs: ["."],
srcs: libz_srcs,
host_supported: true,
vendor_available: true,
recovery_available: true,
}
cc_binary {
name: "zlib_bench",
srcs: ["contrib/bench/zlib_bench.cc"],
cflags: [
"-Wall",
"-Werror",
"-Wno-deprecated-non-prototype",
"-Wno-unused-parameter",
],
host_supported: true,
shared_libs: ["libz"],
// We build zlib_bench32 and zlib_bench64 so it's easy to test LP32.
compile_multilib: "both",
multilib: {
lib32: {
suffix: "32",
},
lib64: {
suffix: "64",
},
},
}
cc_library {
name: "zlib_google_compression_utils_portable",
defaults: ["libz_defaults"],
srcs: [
"google/compression_utils_portable.cc",
],
export_include_dirs: ["google"],
host_supported: true,
shared_libs: ["libz"],
sdk_version: "minimum",
visibility: ["//external/angle"],
apex_available: [
"com.android.runtime",
"//apex_available:platform",
],
}
cc_test {
name: "zlib_tests",
srcs: [
"contrib/tests/infcover.cc",
"contrib/tests/utils_unittest.cc",
],
cflags: [
"-DCMAKE_STANDALONE_UNITTESTS",
"-Wno-unused-parameter",
],
include_dirs: [
// These tests include "gtest.h" rather than the usual "gtest/gtest.h".
"external/googletest/googletest/include/gtest/",
],
shared_libs: ["libz"],
static_libs: ["zlib_google_compression_utils_portable"],
host_supported: true,
test_suites: ["device-tests"],
}
ndk_headers {
name: "libz_headers",
from: "",
to: "",
srcs: [
"zconf.h",
"zlib.h",
],
license: "LICENSE",
}
ndk_library {
name: "libz",
symbol_file: "libz.map.txt",
first_version: "9",
unversioned_until: "current",
export_header_libs: [
"libz_headers",
],
}
// Export zlib headers for inclusion in the musl sysroot.
genrule {
name: "libc_musl_sysroot_zlib_headers",
visibility: ["//external/musl"],
srcs: [
"LICENSE",
"zconf.h",
"zlib.h",
],
out: ["libc_musl_sysroot_zlib_headers.zip"],
tools: [
"soong_zip",
"zip2zip",
],
cmd: "$(location soong_zip) -o $(genDir)/sysroot.zip -symlinks=false" +
// NOTICE
" -j -f $(location LICENSE) " +
// headers
" -j -P include " +
" -f $(location zconf.h) " +
" -f $(location zlib.h) " +
" && " +
"$(location zip2zip) -i $(genDir)/sysroot.zip -o $(out) " +
" include/**/*:include " +
" LICENSE:NOTICE.zlib",
}
cc_defaults {
name: "zlib_fuzz_defaults",
static_libs: ["libz"],
host_supported: true,
}
cc_fuzz {
name: "zlib_deflate_fuzzer",
defaults: ["zlib_fuzz_defaults"],
srcs: ["contrib/tests/fuzzers/deflate_fuzzer.cc"],
}
cc_fuzz {
name: "zlib_deflate_set_dictionary_fuzzer",
defaults: ["zlib_fuzz_defaults"],
srcs: ["contrib/tests/fuzzers/deflate_set_dictionary_fuzzer.cc"],
}
cc_fuzz {
name: "zlib_inflate_fuzzer",
defaults: ["zlib_fuzz_defaults"],
srcs: ["contrib/tests/fuzzers/inflate_fuzzer.cc"],
}
cc_fuzz {
name: "zlib_inflate_with_header_fuzzer",
defaults: ["zlib_fuzz_defaults"],
srcs: ["contrib/tests/fuzzers/inflate_with_header_fuzzer.cc"],
}
cc_fuzz {
name: "zlib_streaming_inflate_fuzzer",
defaults: ["zlib_fuzz_defaults"],
srcs: ["contrib/tests/fuzzers/streaming_inflate_fuzzer.cc"],
fuzz_config: {
libfuzzer_options: ["max_len=256000"],
},
}
cc_fuzz {
name: "zlib_uncompress_fuzzer",
defaults: ["zlib_fuzz_defaults"],
srcs: ["contrib/tests/fuzzers/uncompress_fuzzer.cc"],
}