1# Copyright 2016 Google Inc. 2# 3# Use of this source code is governed by a BSD-style license that can be 4# found in the LICENSE file. 5 6declare_args() { 7 skia_use_system_zlib = is_official_build 8} 9 10import("../third_party.gni") 11 12if (skia_use_system_zlib) { 13 system("zlib") { 14 libs = [ "z" ] 15 } 16} else { 17 # ARM optimizations disabled for Windows on Arm MSVC builds, see http://crbug.com/v8/10012. 18 use_arm_neon_optimizations = 19 (current_cpu == "arm" || current_cpu == "arm64") && !(is_win && !is_clang) 20 use_x86_x64_optimizations = 21 (current_cpu == "x86" || current_cpu == "x64") && !is_ios 22 23 config("zlib_simd_config") { 24 defines = [] 25 if (use_x86_x64_optimizations) { 26 if (is_win) { 27 defines += [ "X86_WINDOWS" ] 28 } else { 29 defines += [ "X86_NOT_WINDOWS" ] 30 } 31 defines += [ "ADLER32_SIMD_SSSE3" ] # Strangely this is needed for 32 # cpu_features.c 33 } 34 if (use_arm_neon_optimizations) { 35 if (is_android) { 36 defines += [ "ARMV8_OS_ANDROID" ] # also compatible with v7 37 } else if (is_linux || is_chromeos) { 38 defines += [ "ARMV8_OS_LINUX" ] 39 } else if (is_fuchsia) { 40 defines += [ "ARMV8_OS_FUCHSIA" ] 41 } else if (is_win) { 42 defines += [ "ARMV8_OS_WINDOWS" ] 43 } else if (is_ios || is_mac) { 44 # iOS@ARM is a special case where we always have NEON but don't check 45 # for crypto extensions. 46 defines += [ "ARM_OS_IOS" ] 47 } else { 48 assert(false, "Unsupported ARM OS") 49 } 50 } 51 52 # Warnings are just noise if we're not maintaining the code. 53 if (is_win) { 54 cflags = [ "/w" ] 55 } else { 56 cflags = [ "-w" ] 57 } 58 } 59 60 source_set("zlib_adler32_simd") { 61 visibility = [ ":*" ] 62 configs += [ ":zlib_simd_config" ] 63 if (use_x86_x64_optimizations) { 64 defines = [ "ADLER32_SIMD_SSSE3" ] 65 if (!is_win || is_clang) { 66 cflags = [ "-mssse3" ] 67 } 68 } 69 if (use_arm_neon_optimizations) { 70 defines = [ "ADLER32_SIMD_NEON" ] 71 } 72 sources = [ "../externals/zlib/adler32_simd.c" ] 73 } 74 75 source_set("zlib_crc32_simd") { 76 visibility = [ ":*" ] 77 configs += [ ":zlib_simd_config" ] 78 79 # Disabled for iPhone, as described in DDI0487C_a_armv8_arm: 80 # "All implementations of the ARMv8.1 architecture are required to 81 # implement the CRC32* instructions. These are optional in ARMv8.0." 82 if (!is_ios && use_arm_neon_optimizations) { 83 defines = [ "CRC32_ARMV8_CRC32" ] 84 85 # An ARMv7 GCC build will fail to compile without building this target 86 # for ARMv8-a+crc and letting runtime cpu detection select the correct 87 # function. 88 if (!is_win && !is_clang) { 89 cflags_c = [ "-march=armv8-a+crc" ] 90 } 91 } 92 93 if (use_x86_x64_optimizations) { 94 defines = [ "CRC32_SIMD_SSE42_PCLMUL" ] 95 if (!is_win || is_clang) { 96 cflags = [ 97 "-msse4.2", 98 "-mpclmul", 99 ] 100 } 101 } 102 103 sources = [ "../externals/zlib/crc32_simd.c" ] 104 } 105 106 source_set("zlib_inflate_chunk_simd") { 107 visibility = [ ":*" ] 108 configs += [ ":zlib_simd_config" ] 109 if (use_x86_x64_optimizations) { 110 defines = [ "INFLATE_CHUNK_SIMD_SSE2" ] 111 if (current_cpu == "x64") { 112 defines += [ "INFLATE_CHUNK_READ_64LE" ] 113 } 114 } 115 if (use_arm_neon_optimizations) { 116 defines = [ "INFLATE_CHUNK_SIMD_NEON" ] 117 if (current_cpu == "arm64") { 118 defines += [ "INFLATE_CHUNK_READ_64LE" ] 119 } 120 } 121 if (use_x86_x64_optimizations || use_arm_neon_optimizations) { 122 include_dirs = [ 123 "../externals/zlib/", 124 "../externals/zlib/contrib/optimizations/", 125 ] 126 sources = [ 127 "../externals/zlib/contrib/optimizations/inffast_chunk.c", 128 "../externals/zlib/contrib/optimizations/inflate.c", 129 ] 130 } 131 } 132 133 source_set("zlib_x86_x64_simd") { 134 visibility = [ ":*" ] 135 configs += [ ":zlib_simd_config" ] 136 if (use_x86_x64_optimizations) { 137 defines = [ 138 "CRC32_SIMD_SSE42_PCLMUL", 139 "DEFLATE_FILL_WINDOW_SSE2", 140 ] 141 if (!is_win || is_clang) { 142 cflags = [ 143 "-msse4.2", 144 "-mpclmul", 145 ] 146 } 147 sources = [ 148 "../externals/zlib/crc_folding.c", 149 "../externals/zlib/fill_window_sse.c", 150 ] 151 } 152 } 153 154 third_party("zlib") { 155 public_include_dirs = [ "../externals/zlib" ] 156 defines = [ "ZLIB_IMPLEMENTATION" ] 157 deps = [] 158 configs = [] 159 160 sources = [ 161 "../externals/zlib/adler32.c", 162 "../externals/zlib/compress.c", 163 "../externals/zlib/cpu_features.c", 164 "../externals/zlib/crc32.c", 165 "../externals/zlib/deflate.c", 166 "../externals/zlib/gzclose.c", 167 "../externals/zlib/gzlib.c", 168 "../externals/zlib/gzread.c", 169 "../externals/zlib/gzwrite.c", 170 "../externals/zlib/infback.c", 171 "../externals/zlib/inffast.c", 172 "../externals/zlib/inftrees.c", 173 "../externals/zlib/trees.c", 174 "../externals/zlib/uncompr.c", 175 "../externals/zlib/zutil.c", 176 ] 177 178 if (is_android) { 179 deps += [ "//third_party/cpu-features" ] 180 } 181 182 if (!use_x86_x64_optimizations && !use_arm_neon_optimizations) { 183 defines += [ "CPU_NO_SIMD" ] 184 sources += [ "../externals/zlib/inflate.c" ] 185 } else { 186 configs += [ ":zlib_simd_config" ] 187 deps += [ 188 ":zlib_adler32_simd", 189 ":zlib_crc32_simd", 190 ":zlib_inflate_chunk_simd", 191 ":zlib_x86_x64_simd", 192 ] 193 } 194 } 195} 196 197config("zlib_config") { 198} 199 200third_party("compression_utils_portable") { 201 visibility = [ "//third_party/externals/angle2:*" ] 202 public_include_dirs = [ "../externals/zlib/google" ] 203 sources = [ 204 "../externals/zlib/google/compression_utils_portable.cc", 205 "../externals/zlib/google/compression_utils_portable.h", 206 ] 207 public_deps = [ ":zlib" ] # either system or from source 208} 209