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