| # Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import("//build/config/compiler/compiler.gni") |
| |
| if (current_cpu == "arm" || current_cpu == "arm64") { |
| import("//build/config/arm.gni") |
| } |
| |
| config("zlib_config") { |
| include_dirs = [ "." ] |
| } |
| |
| config("zlib_internal_config") { |
| defines = [ "ZLIB_IMPLEMENTATION" ] |
| } |
| |
| use_arm_neon_optimizations = false |
| if (current_cpu == "arm" || current_cpu == "arm64") { |
| if (arm_use_neon) { |
| use_arm_neon_optimizations = true |
| } |
| } |
| |
| use_x86_x64_optimizations = |
| (current_cpu == "x86" || current_cpu == "x64") && !is_ios |
| |
| config("zlib_adler32_simd_config") { |
| if (use_x86_x64_optimizations) { |
| defines = [ "ADLER32_SIMD_SSSE3" ] |
| if (is_win) { |
| defines += [ "X86_WINDOWS" ] |
| } else { |
| defines += [ "X86_NOT_WINDOWS" ] |
| } |
| } else if (use_arm_neon_optimizations) { |
| defines = [ "ADLER32_SIMD_NEON" ] |
| } |
| } |
| |
| source_set("zlib_adler32_simd") { |
| visibility = [ ":*" ] |
| |
| if (use_x86_x64_optimizations) { |
| sources = [ |
| "adler32_simd.c", |
| "adler32_simd.h", |
| ] |
| |
| if (!is_win || is_clang) { |
| cflags = [ "-mssse3" ] |
| } |
| } |
| |
| if (use_arm_neon_optimizations) { |
| sources = [ |
| "adler32_simd.c", |
| "adler32_simd.h", |
| ] |
| if (!is_debug) { |
| # Use optimize_speed (-O3) to output the _smallest_ code. |
| configs -= [ "//build/config/compiler:default_optimization" ] |
| configs += [ "//build/config/compiler:optimize_speed" ] |
| } |
| } |
| |
| configs += [ ":zlib_internal_config" ] |
| |
| public_configs = [ ":zlib_adler32_simd_config" ] |
| } |
| |
| if (use_arm_neon_optimizations) { |
| config("zlib_arm_crc32_config") { |
| # Disabled for iPhone, as described in DDI0487C_a_armv8_arm: |
| # "All implementations of the ARMv8.1 architecture are required to |
| # implement the CRC32* instructions. These are optional in ARMv8.0." |
| if (!is_ios) { |
| defines = [ "CRC32_ARMV8_CRC32" ] |
| if (is_android) { |
| defines += [ "ARMV8_OS_ANDROID" ] |
| } else if (is_linux || is_chromeos) { |
| defines += [ "ARMV8_OS_LINUX" ] |
| } else if (is_fuchsia) { |
| defines += [ "ARMV8_OS_FUCHSIA" ] |
| } else if (is_win) { |
| defines += [ "ARMV8_OS_WINDOWS" ] |
| } else { |
| assert(false, "Unsupported ARM OS") |
| } |
| } |
| } |
| |
| source_set("zlib_arm_crc32") { |
| visibility = [ ":*" ] |
| |
| if (!is_ios) { |
| include_dirs = [ "." ] |
| |
| if (!is_win && !is_clang) { |
| assert(!use_thin_lto, |
| "ThinLTO fails mixing different module-level targets") |
| cflags_c = [ "-march=armv8-a+crc" ] |
| } |
| |
| sources = [ |
| "crc32_simd.c", |
| "crc32_simd.h", |
| ] |
| |
| if (!is_debug) { |
| configs -= [ "//build/config/compiler:default_optimization" ] |
| configs += [ "//build/config/compiler:optimize_speed" ] |
| } |
| } |
| |
| configs += [ ":zlib_internal_config" ] |
| |
| public_configs = [ ":zlib_arm_crc32_config" ] |
| } |
| } |
| |
| config("zlib_inflate_chunk_simd_config") { |
| if (use_x86_x64_optimizations) { |
| defines = [ "INFLATE_CHUNK_SIMD_SSE2" ] |
| |
| if (current_cpu == "x64") { |
| defines += [ "INFLATE_CHUNK_READ_64LE" ] |
| } |
| } |
| |
| if (use_arm_neon_optimizations) { |
| defines = [ "INFLATE_CHUNK_SIMD_NEON" ] |
| if (current_cpu == "arm64") { |
| defines += [ "INFLATE_CHUNK_READ_64LE" ] |
| } |
| } |
| } |
| |
| source_set("zlib_inflate_chunk_simd") { |
| visibility = [ ":*" ] |
| |
| if (use_x86_x64_optimizations || use_arm_neon_optimizations) { |
| include_dirs = [ "." ] |
| |
| sources = [ |
| "contrib/optimizations/chunkcopy.h", |
| "contrib/optimizations/inffast_chunk.c", |
| "contrib/optimizations/inffast_chunk.h", |
| "contrib/optimizations/inflate.c", |
| ] |
| |
| if (use_arm_neon_optimizations && !is_debug) { |
| # Here we trade better performance on newer/bigger ARMv8 cores |
| # for less perf on ARMv7, per crbug.com/772870#c40 |
| configs -= [ "//build/config/compiler:default_optimization" ] |
| configs += [ "//build/config/compiler:optimize_speed" ] |
| } |
| } |
| |
| configs -= [ "//build/config/compiler:chromium_code" ] |
| configs += [ |
| ":zlib_internal_config", |
| "//build/config/compiler:no_chromium_code", |
| ] |
| |
| public_configs = [ ":zlib_inflate_chunk_simd_config" ] |
| } |
| |
| config("zlib_crc32_simd_config") { |
| if (use_x86_x64_optimizations) { |
| defines = [ "CRC32_SIMD_SSE42_PCLMUL" ] |
| } |
| } |
| |
| source_set("zlib_crc32_simd") { |
| visibility = [ ":*" ] |
| |
| if (use_x86_x64_optimizations) { |
| sources = [ |
| "crc32_simd.c", |
| "crc32_simd.h", |
| ] |
| |
| if (!is_win || is_clang) { |
| cflags = [ |
| "-msse4.2", |
| "-mpclmul", |
| ] |
| } |
| } |
| |
| configs += [ ":zlib_internal_config" ] |
| |
| public_configs = [ ":zlib_crc32_simd_config" ] |
| } |
| |
| source_set("zlib_x86_simd") { |
| visibility = [ ":*" ] |
| |
| if (use_x86_x64_optimizations) { |
| sources = [ |
| "crc_folding.c", |
| "fill_window_sse.c", |
| ] |
| |
| if (!is_win || is_clang) { |
| cflags = [ |
| "-msse4.2", |
| "-mpclmul", |
| ] |
| } |
| } |
| |
| configs -= [ "//build/config/compiler:chromium_code" ] |
| configs += [ |
| ":zlib_internal_config", |
| "//build/config/compiler:no_chromium_code", |
| ] |
| } |
| |
| config("zlib_warnings") { |
| if (is_clang && use_x86_x64_optimizations) { |
| cflags = [ "-Wno-incompatible-pointer-types" ] |
| } |
| } |
| |
| component("zlib") { |
| if (!is_win) { |
| # Don't stomp on "libzlib" on other platforms. |
| output_name = "chrome_zlib" |
| } |
| |
| sources = [ |
| "adler32.c", |
| "chromeconf.h", |
| "compress.c", |
| "contrib/optimizations/insert_string.h", |
| "cpu_features.c", |
| "cpu_features.h", |
| "crc32.c", |
| "crc32.h", |
| "deflate.c", |
| "deflate.h", |
| "gzclose.c", |
| "gzguts.h", |
| "gzlib.c", |
| "gzread.c", |
| "gzwrite.c", |
| "infback.c", |
| "inffast.c", |
| "inffast.h", |
| "inffixed.h", |
| "inflate.h", |
| "inftrees.c", |
| "inftrees.h", |
| "trees.c", |
| "trees.h", |
| "uncompr.c", |
| "zconf.h", |
| "zlib.h", |
| "zutil.c", |
| "zutil.h", |
| ] |
| |
| defines = [] |
| deps = [] |
| if (!use_x86_x64_optimizations && !use_arm_neon_optimizations) { |
| # Apparently android_cronet bot builds with NEON disabled and |
| # we also should disable optimizations for iOS@x86 (a.k.a. simulator). |
| defines += [ "CPU_NO_SIMD" ] |
| } |
| |
| if (is_ios) { |
| # iOS@ARM is a special case where we always have NEON but don't check |
| # for crypto extensions. |
| # TODO(cavalcantii): verify what is the current state of CPU features shipped |
| # on latest iOS devices. |
| defines += [ "ARM_OS_IOS" ] |
| } |
| |
| if (use_x86_x64_optimizations || use_arm_neon_optimizations) { |
| deps += [ |
| ":zlib_adler32_simd", |
| ":zlib_inflate_chunk_simd", |
| ] |
| |
| if (use_x86_x64_optimizations) { |
| deps += [ ":zlib_crc32_simd" ] |
| } else if (use_arm_neon_optimizations) { |
| sources += [ "contrib/optimizations/slide_hash_neon.h" ] |
| deps += [ ":zlib_arm_crc32" ] |
| } |
| } else { |
| sources += [ "inflate.c" ] |
| } |
| |
| if (is_android) { |
| import("//build/config/android/config.gni") |
| if (defined(android_ndk_root) && android_ndk_root != "") { |
| deps += [ "//third_party/android_ndk:cpu_features" ] |
| } else { |
| assert(false, "CPU detection requires the Android NDK") |
| } |
| } |
| |
| configs -= [ "//build/config/compiler:chromium_code" ] |
| configs += [ |
| ":zlib_internal_config", |
| "//build/config/compiler:no_chromium_code", |
| |
| # Must be after no_chromium_code for warning flags to be ordered correctly. |
| ":zlib_warnings", |
| ] |
| |
| public_configs = [ ":zlib_config" ] |
| |
| deps += [ ":zlib_x86_simd" ] |
| allow_circular_includes_from = deps |
| } |
| |
| config("minizip_warnings") { |
| visibility = [ ":*" ] |
| |
| if (is_clang) { |
| # zlib uses `if ((a == b))` for some reason. |
| cflags = [ "-Wno-parentheses-equality" ] |
| } |
| } |
| |
| static_library("minizip") { |
| sources = [ |
| "contrib/minizip/ioapi.c", |
| "contrib/minizip/ioapi.h", |
| "contrib/minizip/iowin32.c", |
| "contrib/minizip/iowin32.h", |
| "contrib/minizip/unzip.c", |
| "contrib/minizip/unzip.h", |
| "contrib/minizip/zip.c", |
| "contrib/minizip/zip.h", |
| ] |
| |
| if (!is_win) { |
| sources -= [ |
| "contrib/minizip/iowin32.c", |
| "contrib/minizip/iowin32.h", |
| ] |
| } |
| |
| if (is_mac || is_ios || is_android || is_nacl) { |
| # Mac, Android and the BSDs don't have fopen64, ftello64, or fseeko64. We |
| # use fopen, ftell, and fseek instead on these systems. |
| defines = [ "USE_FILE32API" ] |
| } |
| |
| deps = [ ":zlib" ] |
| |
| configs -= [ "//build/config/compiler:chromium_code" ] |
| configs += [ |
| "//build/config/compiler:no_chromium_code", |
| |
| # Must be after no_chromium_code for warning flags to be ordered correctly. |
| ":minizip_warnings", |
| ] |
| |
| public_configs = [ ":zlib_config" ] |
| } |
| |
| executable("zlib_bench") { |
| include_dirs = [ "." ] |
| |
| sources = [ "contrib/bench/zlib_bench.cc" ] |
| |
| if (!is_debug) { |
| configs -= [ "//build/config/compiler:default_optimization" ] |
| configs += [ "//build/config/compiler:optimize_speed" ] |
| } |
| |
| configs -= [ "//build/config/compiler:chromium_code" ] |
| configs += [ "//build/config/compiler:no_chromium_code" ] |
| |
| deps = [ ":zlib" ] |
| } |