• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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