# Copyright 2016 Google Inc. # # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. declare_args() { skia_use_system_zlib = is_official_build } import("../third_party.gni") if (skia_use_system_zlib) { system("zlib") { libs = [ "z" ] } } else { # ARM optimizations disabled for Windows on Arm MSVC builds, see http://crbug.com/v8/10012. use_arm_neon_optimizations = (current_cpu == "arm" || current_cpu == "arm64") && !(is_win && !is_clang) use_x86_x64_optimizations = (current_cpu == "x86" || current_cpu == "x64") && !is_ios config("zlib_simd_config") { defines = [] if (use_x86_x64_optimizations) { if (is_win) { defines += [ "X86_WINDOWS" ] } else { defines += [ "X86_NOT_WINDOWS" ] } defines += [ "ADLER32_SIMD_SSSE3" ] # Strangely this is needed for # cpu_features.c } if (use_arm_neon_optimizations) { if (is_android) { defines += [ "ARMV8_OS_ANDROID" ] # also compatible with v7 } 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 if (is_ios || is_mac) { # iOS@ARM is a special case where we always have NEON but don't check # for crypto extensions. defines += [ "ARM_OS_IOS" ] } else { assert(false, "Unsupported ARM OS") } } # Warnings are just noise if we're not maintaining the code. if (is_win) { cflags = [ "/w" ] } else { cflags = [ "-w" ] } } source_set("zlib_adler32_simd") { visibility = [ ":*" ] configs += [ ":zlib_simd_config" ] if (use_x86_x64_optimizations) { defines = [ "ADLER32_SIMD_SSSE3" ] if (!is_win || is_clang) { cflags = [ "-mssse3" ] } } if (use_arm_neon_optimizations) { defines = [ "ADLER32_SIMD_NEON" ] } sources = [ "../externals/zlib/adler32_simd.c" ] } source_set("zlib_crc32_simd") { visibility = [ ":*" ] configs += [ ":zlib_simd_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 && use_arm_neon_optimizations) { defines = [ "CRC32_ARMV8_CRC32" ] # An ARMv7 GCC build will fail to compile without building this target # for ARMv8-a+crc and letting runtime cpu detection select the correct # function. if (!is_win && !is_clang) { cflags_c = [ "-march=armv8-a+crc" ] } } if (use_x86_x64_optimizations) { defines = [ "CRC32_SIMD_SSE42_PCLMUL" ] if (!is_win || is_clang) { cflags = [ "-msse4.2", "-mpclmul", ] } } sources = [ "../externals/zlib/crc32_simd.c" ] } source_set("zlib_inflate_chunk_simd") { visibility = [ ":*" ] configs += [ ":zlib_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" ] } } if (use_x86_x64_optimizations || use_arm_neon_optimizations) { include_dirs = [ "../externals/zlib/", "../externals/zlib/contrib/optimizations/", ] sources = [ "../externals/zlib/contrib/optimizations/inffast_chunk.c", "../externals/zlib/contrib/optimizations/inflate.c", ] } } source_set("zlib_x86_x64_simd") { visibility = [ ":*" ] configs += [ ":zlib_simd_config" ] if (use_x86_x64_optimizations) { defines = [ "CRC32_SIMD_SSE42_PCLMUL", "DEFLATE_FILL_WINDOW_SSE2", ] if (!is_win || is_clang) { cflags = [ "-msse4.2", "-mpclmul", ] } sources = [ "../externals/zlib/crc_folding.c", "../externals/zlib/fill_window_sse.c", ] } } third_party("zlib") { public_include_dirs = [ "../externals/zlib" ] defines = [ "ZLIB_IMPLEMENTATION" ] deps = [] sources = [ "../externals/zlib/adler32.c", "../externals/zlib/compress.c", "../externals/zlib/cpu_features.c", "../externals/zlib/crc32.c", "../externals/zlib/deflate.c", "../externals/zlib/gzclose.c", "../externals/zlib/gzlib.c", "../externals/zlib/gzread.c", "../externals/zlib/gzwrite.c", "../externals/zlib/infback.c", "../externals/zlib/inffast.c", "../externals/zlib/inftrees.c", "../externals/zlib/trees.c", "../externals/zlib/uncompr.c", "../externals/zlib/zutil.c", ] if (is_android) { deps += [ "//third_party/cpu-features" ] } if (!use_x86_x64_optimizations && !use_arm_neon_optimizations) { defines += [ "CPU_NO_SIMD" ] sources += [ "../externals/zlib/inflate.c" ] } else { configs += [ ":zlib_simd_config" ] deps += [ ":zlib_adler32_simd", ":zlib_crc32_simd", ":zlib_inflate_chunk_simd", ":zlib_x86_x64_simd", ] } } } config("zlib_config") { } third_party("compression_utils_portable") { visibility = [ "//third_party/externals/angle2:*" ] public_include_dirs = [ "../externals/zlib/google" ] sources = [ "../externals/zlib/google/compression_utils_portable.cc", "../externals/zlib/google/compression_utils_portable.h", ] public_deps = [ ":zlib" ] # either system or from source }