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 = current_cpu == "arm64" && !(is_win && !is_clang) 19 use_x86_x64_optimizations = 20 (current_cpu == "x86" || current_cpu == "x64") && !is_ios 21 22 config("zlib_simd_config") { 23 defines = [] 24 if (use_x86_x64_optimizations) { 25 if (is_win) { 26 defines += [ "X86_WINDOWS" ] 27 } else { 28 defines += [ "X86_NOT_WINDOWS" ] 29 } 30 defines += [ "ADLER32_SIMD_SSSE3" ] # Strangely this is needed for 31 # cpu_features.c 32 } 33 if (use_arm_neon_optimizations) { 34 if (is_android) { 35 defines += [ "ARMV8_OS_ANDROID" ] # also compatible with v7 36 } else if (is_linux || is_chromeos) { 37 defines += [ "ARMV8_OS_LINUX" ] 38 } else if (is_fuchsia) { 39 defines += [ "ARMV8_OS_FUCHSIA" ] 40 } else if (is_win) { 41 defines += [ "ARMV8_OS_WINDOWS" ] 42 } else if (is_ios || is_mac) { 43 # iOS@ARM is a special case where we always have NEON but don't check 44 # for crypto extensions. 45 defines += [ "ARM_OS_IOS" ] 46 } # else { 47 # assert(false, "Unsupported ARM OS") 48 # } 49 } 50 51 # Warnings are just noise if we're not maintaining the code. 52 if (is_win) { 53 cflags = [ "/w" ] 54 } else { 55 cflags = [ "-w" ] 56 } 57 } 58 59 source_set("zlib_adler32_simd") { 60 visibility = [ ":*" ] 61 configs += [ ":zlib_simd_config" ] 62 if (use_x86_x64_optimizations) { 63 defines = [ "ADLER32_SIMD_SSSE3" ] 64 if (!is_win || is_clang) { 65 cflags = [ "-mssse3" ] 66 } 67 } 68 if (use_arm_neon_optimizations) { 69 defines = [ "ADLER32_SIMD_NEON" ] 70 } 71 sources = [ "../externals/zlib/adler32_simd.c" ] 72 } 73 74 source_set("zlib_crc32_simd") { 75 visibility = [ ":*" ] 76 configs += [ ":zlib_simd_config" ] 77 78 # Disabled for iPhone, as described in DDI0487C_a_armv8_arm: 79 # "All implementations of the ARMv8.1 architecture are required to 80 # implement the CRC32* instructions. These are optional in ARMv8.0." 81 if (!is_ios && use_arm_neon_optimizations) { 82 defines = [ "CRC32_ARMV8_CRC32" ] 83 84 # An ARMv7 GCC build will fail to compile without building this target 85 # for ARMv8-a+crc and letting runtime cpu detection select the correct 86 # function. 87 if (!is_win && !is_clang) { 88 cflags_c = [ "-march=armv8-a+crc" ] 89 } 90 } 91 92 if (use_x86_x64_optimizations) { 93 defines = [ "CRC32_SIMD_SSE42_PCLMUL" ] 94 if (!is_win || is_clang) { 95 cflags = [ 96 "-msse4.2", 97 "-mpclmul", 98 ] 99 } 100 } 101 102 sources = [ "../externals/zlib/crc32_simd.c" ] 103 } 104 105 source_set("zlib_inflate_chunk_simd") { 106 visibility = [ ":*" ] 107 configs += [ ":zlib_simd_config" ] 108 if (use_x86_x64_optimizations) { 109 defines = [ "INFLATE_CHUNK_SIMD_SSE2" ] 110 if (current_cpu == "x64") { 111 defines += [ "INFLATE_CHUNK_READ_64LE" ] 112 } 113 } 114 if (use_arm_neon_optimizations) { 115 defines = [ "INFLATE_CHUNK_SIMD_NEON" ] 116 if (current_cpu == "arm64") { 117 defines += [ "INFLATE_CHUNK_READ_64LE" ] 118 } 119 } 120 if (use_x86_x64_optimizations || use_arm_neon_optimizations) { 121 include_dirs = [ 122 "../externals/zlib/", 123 "../externals/zlib/contrib/optimizations/", 124 ] 125 sources = [ 126 "../externals/zlib/contrib/optimizations/inffast_chunk.c", 127 "../externals/zlib/contrib/optimizations/inflate.c", 128 ] 129 } 130 } 131 132 source_set("zlib_x86_x64_simd") { 133 visibility = [ ":*" ] 134 configs += [ ":zlib_simd_config" ] 135 if (use_x86_x64_optimizations) { 136 defines = [ 137 "CRC32_SIMD_SSE42_PCLMUL", 138 "DEFLATE_FILL_WINDOW_SSE2", 139 ] 140 if (!is_win || is_clang) { 141 cflags = [ 142 "-msse4.2", 143 "-mpclmul", 144 ] 145 } 146 sources = [ 147 "../externals/zlib/crc_folding.c", 148 "../externals/zlib/fill_window_sse.c", 149 ] 150 } 151 } 152 153 third_party("zlib") { 154 public_include_dirs = [ "../externals/zlib" ] 155 defines = [ "ZLIB_IMPLEMENTATION" ] 156 deps = [] 157 configs = [] 158 159 sources = [ 160 "../externals/zlib/adler32.c", 161 "../externals/zlib/compress.c", 162 "../externals/zlib/cpu_features.c", 163 "../externals/zlib/crc32.c", 164 "../externals/zlib/deflate.c", 165 "../externals/zlib/gzclose.c", 166 "../externals/zlib/gzlib.c", 167 "../externals/zlib/gzread.c", 168 "../externals/zlib/gzwrite.c", 169 "../externals/zlib/infback.c", 170 "../externals/zlib/inffast.c", 171 "../externals/zlib/inftrees.c", 172 "../externals/zlib/trees.c", 173 "../externals/zlib/uncompr.c", 174 "../externals/zlib/zutil.c", 175 ] 176 177 if (is_android) { 178 deps += [ "${skia_third_party_dir}/cpu-features" ] 179 } 180 181 if (!use_x86_x64_optimizations && !use_arm_neon_optimizations) { 182 defines += [ "CPU_NO_SIMD" ] 183 sources += [ "../externals/zlib/inflate.c" ] 184 } else { 185 defines += [ "ADLER32_SIMD_NEON" ] 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 = [ "${skia_third_party_dir}/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