blob: 2414c8826f6dc7df308fa490bc0d79a73e72aa50 [file] [log] [blame]
brettw@chromium.org069e2b82014-04-30 16:47:24 +00001# Copyright (c) 2013 The Chromium Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
Tomasz Śniatowskiabd51832019-06-24 17:52:19 +00005import("//build/config/compiler/compiler.gni")
6
Adenilson Cavalcanti3060dcb2017-09-29 03:24:52 +00007if (current_cpu == "arm" || current_cpu == "arm64") {
8 import("//build/config/arm.gni")
9}
10
brettw@chromium.org069e2b82014-04-30 16:47:24 +000011config("zlib_config") {
12 include_dirs = [ "." ]
13}
14
Tom Anderson20c7ae12019-04-08 20:51:48 +000015config("zlib_internal_config") {
16 defines = [ "ZLIB_IMPLEMENTATION" ]
17}
18
Daniel Bratelldde5ce52018-10-31 11:39:12 +000019use_arm_neon_optimizations = false
20if (current_cpu == "arm" || current_cpu == "arm64") {
21 if (arm_use_neon) {
22 use_arm_neon_optimizations = true
23 }
24}
25
Hans Wennborg2a6432e2020-01-24 22:31:29 +000026use_x86_x64_optimizations =
27 (current_cpu == "x86" || current_cpu == "x64") && !is_ios
Daniel Bratelldde5ce52018-10-31 11:39:12 +000028
Noel Gordon17bbb3d2017-09-29 19:44:25 +000029config("zlib_adler32_simd_config") {
Daniel Bratelldde5ce52018-10-31 11:39:12 +000030 if (use_x86_x64_optimizations) {
Noel Gordon17bbb3d2017-09-29 19:44:25 +000031 defines = [ "ADLER32_SIMD_SSSE3" ]
Hans Wennborg2a6432e2020-01-24 22:31:29 +000032 if (is_win) {
33 defines += [ "X86_WINDOWS" ]
34 } else {
35 defines += [ "X86_NOT_WINDOWS" ]
36 }
Adenilson Cavalcanti5de00af2020-01-08 22:12:31 +000037 } else if (use_arm_neon_optimizations) {
Daniel Bratelldde5ce52018-10-31 11:39:12 +000038 defines = [ "ADLER32_SIMD_NEON" ]
Noel Gordon17bbb3d2017-09-29 19:44:25 +000039 }
40}
41
42source_set("zlib_adler32_simd") {
43 visibility = [ ":*" ]
44
Daniel Bratelldde5ce52018-10-31 11:39:12 +000045 if (use_x86_x64_optimizations) {
Noel Gordon17bbb3d2017-09-29 19:44:25 +000046 sources = [
47 "adler32_simd.c",
48 "adler32_simd.h",
49 ]
50
51 if (!is_win || is_clang) {
52 cflags = [ "-mssse3" ]
53 }
54 }
55
Daniel Bratelldde5ce52018-10-31 11:39:12 +000056 if (use_arm_neon_optimizations) {
57 sources = [
58 "adler32_simd.c",
59 "adler32_simd.h",
60 ]
61 if (!is_debug) {
62 # Use optimize_speed (-O3) to output the _smallest_ code.
63 configs -= [ "//build/config/compiler:default_optimization" ]
64 configs += [ "//build/config/compiler:optimize_speed" ]
Noel Gordon17bbb3d2017-09-29 19:44:25 +000065 }
66 }
67
Tom Anderson20c7ae12019-04-08 20:51:48 +000068 configs += [ ":zlib_internal_config" ]
69
Noel Gordon17bbb3d2017-09-29 19:44:25 +000070 public_configs = [ ":zlib_adler32_simd_config" ]
71}
72
Daniel Bratelldde5ce52018-10-31 11:39:12 +000073if (use_arm_neon_optimizations) {
74 config("zlib_arm_crc32_config") {
Noel Gordon4bda75a2019-04-15 06:52:31 +000075 # Disabled for iPhone, as described in DDI0487C_a_armv8_arm:
76 # "All implementations of the ARMv8.1 architecture are required to
77 # implement the CRC32* instructions. These are optional in ARMv8.0."
78 if (!is_ios) {
Adenilson Cavalcanti72356722018-02-16 03:41:14 +000079 defines = [ "CRC32_ARMV8_CRC32" ]
80 if (is_android) {
81 defines += [ "ARMV8_OS_ANDROID" ]
82 } else if (is_linux || is_chromeos) {
83 defines += [ "ARMV8_OS_LINUX" ]
Noel Gordon4bda75a2019-04-15 06:52:31 +000084 } else if (is_fuchsia) {
85 defines += [ "ARMV8_OS_FUCHSIA" ]
Richard Townsend8f2b9d42019-04-18 16:45:43 +000086 } else if (is_win) {
87 defines += [ "ARMV8_OS_WINDOWS" ]
88 } else {
Noel Gordon4bda75a2019-04-15 06:52:31 +000089 assert(false, "Unsupported ARM OS")
Adenilson Cavalcanti72356722018-02-16 03:41:14 +000090 }
91 }
92 }
Adenilson Cavalcanti72356722018-02-16 03:41:14 +000093
Adenilson Cavalcanti72356722018-02-16 03:41:14 +000094 source_set("zlib_arm_crc32") {
95 visibility = [ ":*" ]
96
Jose Dapena Pazbbacb132019-06-10 09:16:22 +000097 if (!is_ios) {
Adenilson Cavalcanti72356722018-02-16 03:41:14 +000098 include_dirs = [ "." ]
99
Adenilson Cavalcanti5de00af2020-01-08 22:12:31 +0000100 if (!is_win && !is_clang) {
Tomasz Śniatowskiabd51832019-06-24 17:52:19 +0000101 assert(!use_thin_lto,
Jose Dapena Pazbbacb132019-06-10 09:16:22 +0000102 "ThinLTO fails mixing different module-level targets")
103 cflags_c = [ "-march=armv8-a+crc" ]
Adenilson Cavalcanti72356722018-02-16 03:41:14 +0000104 }
105
106 sources = [
Adenilson Cavalcanti72356722018-02-16 03:41:14 +0000107 "crc32_simd.c",
108 "crc32_simd.h",
109 ]
110
Adenilson Cavalcanti72356722018-02-16 03:41:14 +0000111 if (!is_debug) {
112 configs -= [ "//build/config/compiler:default_optimization" ]
113 configs += [ "//build/config/compiler:optimize_speed" ]
114 }
115 }
116
Tom Anderson20c7ae12019-04-08 20:51:48 +0000117 configs += [ ":zlib_internal_config" ]
118
Adenilson Cavalcanti72356722018-02-16 03:41:14 +0000119 public_configs = [ ":zlib_arm_crc32_config" ]
120 }
121}
122
Noel Gordon64ffef02017-12-08 11:39:34 +0000123config("zlib_inflate_chunk_simd_config") {
Daniel Bratelldde5ce52018-10-31 11:39:12 +0000124 if (use_x86_x64_optimizations) {
Noel Gordonbedc29e2018-02-12 01:46:01 +0000125 defines = [ "INFLATE_CHUNK_SIMD_SSE2" ]
126
127 if (current_cpu == "x64") {
128 defines += [ "INFLATE_CHUNK_READ_64LE" ]
129 }
Noel Gordon64ffef02017-12-08 11:39:34 +0000130 }
131
Daniel Bratelldde5ce52018-10-31 11:39:12 +0000132 if (use_arm_neon_optimizations) {
133 defines = [ "INFLATE_CHUNK_SIMD_NEON" ]
Adenilson Cavalcanti9972c362019-01-31 21:39:02 +0000134 if (current_cpu == "arm64") {
135 defines += [ "INFLATE_CHUNK_READ_64LE" ]
136 }
Noel Gordon64ffef02017-12-08 11:39:34 +0000137 }
138}
139
140source_set("zlib_inflate_chunk_simd") {
141 visibility = [ ":*" ]
142
Daniel Bratelldde5ce52018-10-31 11:39:12 +0000143 if (use_x86_x64_optimizations || use_arm_neon_optimizations) {
Noel Gordon64ffef02017-12-08 11:39:34 +0000144 include_dirs = [ "." ]
145
146 sources = [
147 "contrib/optimizations/chunkcopy.h",
148 "contrib/optimizations/inffast_chunk.c",
149 "contrib/optimizations/inffast_chunk.h",
150 "contrib/optimizations/inflate.c",
151 ]
Noel Gordon64ffef02017-12-08 11:39:34 +0000152
Daniel Bratelldde5ce52018-10-31 11:39:12 +0000153 if (use_arm_neon_optimizations && !is_debug) {
154 # Here we trade better performance on newer/bigger ARMv8 cores
Noel Gordon4bda75a2019-04-15 06:52:31 +0000155 # for less perf on ARMv7, per crbug.com/772870#c40
Daniel Bratelldde5ce52018-10-31 11:39:12 +0000156 configs -= [ "//build/config/compiler:default_optimization" ]
157 configs += [ "//build/config/compiler:optimize_speed" ]
Noel Gordon64ffef02017-12-08 11:39:34 +0000158 }
159 }
160
161 configs -= [ "//build/config/compiler:chromium_code" ]
Tom Anderson20c7ae12019-04-08 20:51:48 +0000162 configs += [
163 ":zlib_internal_config",
164 "//build/config/compiler:no_chromium_code",
165 ]
Noel Gordon64ffef02017-12-08 11:39:34 +0000166
167 public_configs = [ ":zlib_inflate_chunk_simd_config" ]
168}
169
Noel Gordon8e904b32018-01-04 12:10:08 +1100170config("zlib_crc32_simd_config") {
Daniel Bratelldde5ce52018-10-31 11:39:12 +0000171 if (use_x86_x64_optimizations) {
Noel Gordon8e904b32018-01-04 12:10:08 +1100172 defines = [ "CRC32_SIMD_SSE42_PCLMUL" ]
173 }
174}
175
176source_set("zlib_crc32_simd") {
177 visibility = [ ":*" ]
178
Daniel Bratelldde5ce52018-10-31 11:39:12 +0000179 if (use_x86_x64_optimizations) {
Noel Gordon8e904b32018-01-04 12:10:08 +1100180 sources = [
181 "crc32_simd.c",
182 "crc32_simd.h",
183 ]
184
185 if (!is_win || is_clang) {
186 cflags = [
187 "-msse4.2",
188 "-mpclmul",
189 ]
190 }
191 }
192
Tom Anderson20c7ae12019-04-08 20:51:48 +0000193 configs += [ ":zlib_internal_config" ]
194
Noel Gordon8e904b32018-01-04 12:10:08 +1100195 public_configs = [ ":zlib_crc32_simd_config" ]
196}
197
Tom Anderson20c7ae12019-04-08 20:51:48 +0000198source_set("zlib_x86_simd") {
Noel Gordon8e904b32018-01-04 12:10:08 +1100199 visibility = [ ":*" ]
200
Daniel Bratelldde5ce52018-10-31 11:39:12 +0000201 if (use_x86_x64_optimizations) {
scottmgb8135bf2014-12-02 23:28:00 -0800202 sources = [
203 "crc_folding.c",
204 "fill_window_sse.c",
205 ]
Noel Gordon8e904b32018-01-04 12:10:08 +1100206
Nico Weber0f60cc52014-11-18 15:21:17 -0800207 if (!is_win || is_clang) {
scottmgb8135bf2014-12-02 23:28:00 -0800208 cflags = [
209 "-msse4.2",
210 "-mpclmul",
211 ]
Nico Weber0f60cc52014-11-18 15:21:17 -0800212 }
robert.bradford10dd6862014-11-05 06:59:34 -0800213 }
dpranke73636152014-11-17 17:54:55 -0800214
215 configs -= [ "//build/config/compiler:chromium_code" ]
Tom Anderson20c7ae12019-04-08 20:51:48 +0000216 configs += [
217 ":zlib_internal_config",
218 "//build/config/compiler:no_chromium_code",
219 ]
robert.bradford10dd6862014-11-05 06:59:34 -0800220}
221
brettw3f3d1262015-09-02 10:57:05 -0700222config("zlib_warnings") {
Daniel Bratelldde5ce52018-10-31 11:39:12 +0000223 if (is_clang && use_x86_x64_optimizations) {
brettw3f3d1262015-09-02 10:57:05 -0700224 cflags = [ "-Wno-incompatible-pointer-types" ]
225 }
226}
227
Tom Anderson20c7ae12019-04-08 20:51:48 +0000228component("zlib") {
brettw@chromium.org069e2b82014-04-30 16:47:24 +0000229 if (!is_win) {
230 # Don't stomp on "libzlib" on other platforms.
231 output_name = "chrome_zlib"
232 }
233
234 sources = [
235 "adler32.c",
Tom Anderson20c7ae12019-04-08 20:51:48 +0000236 "chromeconf.h",
brettw@chromium.org069e2b82014-04-30 16:47:24 +0000237 "compress.c",
Adenilson Cavalcantid7f3ca92019-12-12 20:49:49 +0000238 "contrib/optimizations/insert_string.h",
Adenilson Cavalcanti5de00af2020-01-08 22:12:31 +0000239 "cpu_features.c",
240 "cpu_features.h",
brettw@chromium.org069e2b82014-04-30 16:47:24 +0000241 "crc32.c",
242 "crc32.h",
243 "deflate.c",
244 "deflate.h",
245 "gzclose.c",
246 "gzguts.h",
247 "gzlib.c",
248 "gzread.c",
249 "gzwrite.c",
250 "infback.c",
251 "inffast.c",
252 "inffast.h",
253 "inffixed.h",
brettw@chromium.org069e2b82014-04-30 16:47:24 +0000254 "inflate.h",
255 "inftrees.c",
256 "inftrees.h",
brettw@chromium.org069e2b82014-04-30 16:47:24 +0000257 "trees.c",
258 "trees.h",
259 "uncompr.c",
260 "zconf.h",
261 "zlib.h",
262 "zutil.c",
263 "zutil.h",
264 ]
265
Boris Sazonov0f473a12017-11-30 10:01:30 +0000266 defines = []
267 deps = []
Adenilson Cavalcanti5de00af2020-01-08 22:12:31 +0000268 if (!use_x86_x64_optimizations && !use_arm_neon_optimizations) {
269 # Apparently android_cronet bot builds with NEON disabled and
270 # we also should disable optimizations for iOS@x86 (a.k.a. simulator).
271 defines += [ "CPU_NO_SIMD" ]
272 }
273
274 if (is_ios) {
275 # iOS@ARM is a special case where we always have NEON but don't check
276 # for crypto extensions.
277 # TODO(cavalcantii): verify what is the current state of CPU features shipped
278 # on latest iOS devices.
279 defines += [ "ARM_OS_IOS" ]
280 }
Boris Sazonov0f473a12017-11-30 10:01:30 +0000281
Daniel Bratelldde5ce52018-10-31 11:39:12 +0000282 if (use_x86_x64_optimizations || use_arm_neon_optimizations) {
283 deps += [
284 ":zlib_adler32_simd",
285 ":zlib_inflate_chunk_simd",
286 ]
Noel Gordon8e904b32018-01-04 12:10:08 +1100287
Daniel Bratelldde5ce52018-10-31 11:39:12 +0000288 if (use_x86_x64_optimizations) {
Daniel Bratelldde5ce52018-10-31 11:39:12 +0000289 deps += [ ":zlib_crc32_simd" ]
290 } else if (use_arm_neon_optimizations) {
Adenilson Cavalcantid6d19612018-08-07 16:08:59 +0000291 sources += [ "contrib/optimizations/slide_hash_neon.h" ]
Daniel Bratelldde5ce52018-10-31 11:39:12 +0000292 deps += [ ":zlib_arm_crc32" ]
Noel Gordon17bbb3d2017-09-29 19:44:25 +0000293 }
Daniel Bratelldde5ce52018-10-31 11:39:12 +0000294 } else {
295 sources += [ "inflate.c" ]
robert.bradford10dd6862014-11-05 06:59:34 -0800296 }
297
Adenilson Cavalcanti5de00af2020-01-08 22:12:31 +0000298 if (is_android) {
299 import("//build/config/android/config.gni")
300 if (defined(android_ndk_root) && android_ndk_root != "") {
301 deps += [ "//third_party/android_ndk:cpu_features" ]
302 } else {
303 assert(false, "CPU detection requires the Android NDK")
304 }
305 }
306
brettw@chromium.org069e2b82014-04-30 16:47:24 +0000307 configs -= [ "//build/config/compiler:chromium_code" ]
brettw3f3d1262015-09-02 10:57:05 -0700308 configs += [
Tom Anderson20c7ae12019-04-08 20:51:48 +0000309 ":zlib_internal_config",
brettw3f3d1262015-09-02 10:57:05 -0700310 "//build/config/compiler:no_chromium_code",
311
312 # Must be after no_chromium_code for warning flags to be ordered correctly.
313 ":zlib_warnings",
314 ]
brettw@chromium.org069e2b82014-04-30 16:47:24 +0000315
Brett Wilson9bdea3f2014-09-23 16:41:46 -0700316 public_configs = [ ":zlib_config" ]
Noel Gordon17bbb3d2017-09-29 19:44:25 +0000317
Adenilson Cavalcantif44229b2017-10-30 18:39:29 +0000318 deps += [ ":zlib_x86_simd" ]
Daniel Bratelldde5ce52018-10-31 11:39:12 +0000319 allow_circular_includes_from = deps
brettw@chromium.org069e2b82014-04-30 16:47:24 +0000320}
321
brettw3f3d1262015-09-02 10:57:05 -0700322config("minizip_warnings") {
323 visibility = [ ":*" ]
Noel Gordon71eb81f2018-02-12 08:15:47 +0000324
brettw3f3d1262015-09-02 10:57:05 -0700325 if (is_clang) {
326 # zlib uses `if ((a == b))` for some reason.
327 cflags = [ "-Wno-parentheses-equality" ]
328 }
329}
330
brettw@chromium.org069e2b82014-04-30 16:47:24 +0000331static_library("minizip") {
332 sources = [
333 "contrib/minizip/ioapi.c",
334 "contrib/minizip/ioapi.h",
335 "contrib/minizip/iowin32.c",
336 "contrib/minizip/iowin32.h",
337 "contrib/minizip/unzip.c",
338 "contrib/minizip/unzip.h",
339 "contrib/minizip/zip.c",
340 "contrib/minizip/zip.h",
341 ]
342
343 if (!is_win) {
344 sources -= [
345 "contrib/minizip/iowin32.c",
346 "contrib/minizip/iowin32.h",
347 ]
348 }
Noel Gordon71eb81f2018-02-12 08:15:47 +0000349
takiseb3994102017-04-06 22:48:40 -0700350 if (is_mac || is_ios || is_android || is_nacl) {
brettw@chromium.org069e2b82014-04-30 16:47:24 +0000351 # Mac, Android and the BSDs don't have fopen64, ftello64, or fseeko64. We
352 # use fopen, ftell, and fseek instead on these systems.
Hans Wennborg814da1f2019-12-21 11:13:14 +0000353 defines = [ "USE_FILE32API" ]
brettw@chromium.org069e2b82014-04-30 16:47:24 +0000354 }
355
Nico Weberb9b9a5a2020-01-28 18:17:22 +0000356 deps = [ ":zlib" ]
brettw@chromium.org069e2b82014-04-30 16:47:24 +0000357
358 configs -= [ "//build/config/compiler:chromium_code" ]
brettw3f3d1262015-09-02 10:57:05 -0700359 configs += [
360 "//build/config/compiler:no_chromium_code",
361
362 # Must be after no_chromium_code for warning flags to be ordered correctly.
363 ":minizip_warnings",
364 ]
Noel Gordon17bbb3d2017-09-29 19:44:25 +0000365
Brett Wilson9bdea3f2014-09-23 16:41:46 -0700366 public_configs = [ ":zlib_config" ]
brettw@chromium.org069e2b82014-04-30 16:47:24 +0000367}
Noel Gordonc83e2162018-01-21 11:19:12 +0000368
369executable("zlib_bench") {
370 include_dirs = [ "." ]
371
Nico Weberb9b9a5a2020-01-28 18:17:22 +0000372 sources = [ "contrib/bench/zlib_bench.cc" ]
Noel Gordonc83e2162018-01-21 11:19:12 +0000373
374 if (!is_debug) {
375 configs -= [ "//build/config/compiler:default_optimization" ]
376 configs += [ "//build/config/compiler:optimize_speed" ]
377 }
378
379 configs -= [ "//build/config/compiler:chromium_code" ]
380 configs += [ "//build/config/compiler:no_chromium_code" ]
381
Nico Weberb9b9a5a2020-01-28 18:17:22 +0000382 deps = [ ":zlib" ]
Noel Gordonc83e2162018-01-21 11:19:12 +0000383}