blob: 50540d97aebd4ff5cfbf84d240bf11a9d66554c5 [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")
Lei Zhang40c3a762020-04-22 04:07:41 +00006
7if (build_with_chromium) {
8 import("//testing/test.gni")
9}
Tomasz Śniatowskiabd51832019-06-24 17:52:19 +000010
Adenilson Cavalcanti3060dcb2017-09-29 03:24:52 +000011if (current_cpu == "arm" || current_cpu == "arm64") {
12 import("//build/config/arm.gni")
13}
14
brettw@chromium.org069e2b82014-04-30 16:47:24 +000015config("zlib_config") {
16 include_dirs = [ "." ]
17}
18
Tom Anderson20c7ae12019-04-08 20:51:48 +000019config("zlib_internal_config") {
20 defines = [ "ZLIB_IMPLEMENTATION" ]
Adenilson Cavalcanti9444fdb2020-05-21 21:44:13 +000021
22 if (!is_debug) {
23 # Build code using -O3, see: crbug.com/1084371.
24 configs = [ "//build/config/compiler:optimize_speed" ]
25 }
Hans Wennborg493d4292020-08-04 11:38:55 +000026 if (is_debug || use_libfuzzer) {
27 # Enable zlib's asserts in debug and fuzzer builds.
28 defines += [ "ZLIB_DEBUG" ]
29 }
Tom Anderson20c7ae12019-04-08 20:51:48 +000030}
31
Daniel Bratelldde5ce52018-10-31 11:39:12 +000032use_arm_neon_optimizations = false
Richard Townsendc2eb8a72020-02-14 01:15:01 +000033if ((current_cpu == "arm" || current_cpu == "arm64") &&
34 !(is_win && !is_clang)) {
35 # TODO(richard.townsend@arm.com): Optimizations temporarily disabled for
36 # Windows on Arm MSVC builds, see http://crbug.com/v8/10012.
Daniel Bratelldde5ce52018-10-31 11:39:12 +000037 if (arm_use_neon) {
38 use_arm_neon_optimizations = true
39 }
40}
41
Hans Wennborg2a6432e2020-01-24 22:31:29 +000042use_x86_x64_optimizations =
43 (current_cpu == "x86" || current_cpu == "x64") && !is_ios
Daniel Bratelldde5ce52018-10-31 11:39:12 +000044
Noel Gordon17bbb3d2017-09-29 19:44:25 +000045config("zlib_adler32_simd_config") {
Daniel Bratelldde5ce52018-10-31 11:39:12 +000046 if (use_x86_x64_optimizations) {
Noel Gordon17bbb3d2017-09-29 19:44:25 +000047 defines = [ "ADLER32_SIMD_SSSE3" ]
Hans Wennborg2a6432e2020-01-24 22:31:29 +000048 if (is_win) {
49 defines += [ "X86_WINDOWS" ]
50 } else {
51 defines += [ "X86_NOT_WINDOWS" ]
52 }
Noel Gordona0ea34a2020-04-20 20:32:01 +000053 }
54
55 if (use_arm_neon_optimizations) {
Daniel Bratelldde5ce52018-10-31 11:39:12 +000056 defines = [ "ADLER32_SIMD_NEON" ]
Noel Gordon17bbb3d2017-09-29 19:44:25 +000057 }
58}
59
60source_set("zlib_adler32_simd") {
61 visibility = [ ":*" ]
62
Daniel Bratelldde5ce52018-10-31 11:39:12 +000063 if (use_x86_x64_optimizations) {
Noel Gordon17bbb3d2017-09-29 19:44:25 +000064 sources = [
65 "adler32_simd.c",
66 "adler32_simd.h",
67 ]
68
69 if (!is_win || is_clang) {
70 cflags = [ "-mssse3" ]
71 }
72 }
73
Daniel Bratelldde5ce52018-10-31 11:39:12 +000074 if (use_arm_neon_optimizations) {
75 sources = [
76 "adler32_simd.c",
77 "adler32_simd.h",
78 ]
Noel Gordon17bbb3d2017-09-29 19:44:25 +000079 }
80
Tom Anderson20c7ae12019-04-08 20:51:48 +000081 configs += [ ":zlib_internal_config" ]
82
Noel Gordon17bbb3d2017-09-29 19:44:25 +000083 public_configs = [ ":zlib_adler32_simd_config" ]
84}
85
Daniel Bratelldde5ce52018-10-31 11:39:12 +000086if (use_arm_neon_optimizations) {
87 config("zlib_arm_crc32_config") {
Noel Gordon4bda75a2019-04-15 06:52:31 +000088 # Disabled for iPhone, as described in DDI0487C_a_armv8_arm:
89 # "All implementations of the ARMv8.1 architecture are required to
90 # implement the CRC32* instructions. These are optional in ARMv8.0."
91 if (!is_ios) {
Adenilson Cavalcanti72356722018-02-16 03:41:14 +000092 defines = [ "CRC32_ARMV8_CRC32" ]
93 if (is_android) {
94 defines += [ "ARMV8_OS_ANDROID" ]
95 } else if (is_linux || is_chromeos) {
96 defines += [ "ARMV8_OS_LINUX" ]
Nico Weber93be8462020-06-24 22:50:54 +000097 } else if (is_mac) {
98 defines += [ "ARMV8_OS_MACOS" ]
Noel Gordon4bda75a2019-04-15 06:52:31 +000099 } else if (is_fuchsia) {
100 defines += [ "ARMV8_OS_FUCHSIA" ]
Richard Townsend8f2b9d42019-04-18 16:45:43 +0000101 } else if (is_win) {
102 defines += [ "ARMV8_OS_WINDOWS" ]
103 } else {
Noel Gordon4bda75a2019-04-15 06:52:31 +0000104 assert(false, "Unsupported ARM OS")
Adenilson Cavalcanti72356722018-02-16 03:41:14 +0000105 }
106 }
107 }
Adenilson Cavalcanti72356722018-02-16 03:41:14 +0000108
Adenilson Cavalcanti72356722018-02-16 03:41:14 +0000109 source_set("zlib_arm_crc32") {
110 visibility = [ ":*" ]
111
Jose Dapena Pazbbacb132019-06-10 09:16:22 +0000112 if (!is_ios) {
Adenilson Cavalcanti72356722018-02-16 03:41:14 +0000113 include_dirs = [ "." ]
114
Adenilson Cavalcanti5de00af2020-01-08 22:12:31 +0000115 if (!is_win && !is_clang) {
Tomasz Śniatowskiabd51832019-06-24 17:52:19 +0000116 assert(!use_thin_lto,
Jose Dapena Pazbbacb132019-06-10 09:16:22 +0000117 "ThinLTO fails mixing different module-level targets")
118 cflags_c = [ "-march=armv8-a+crc" ]
Adenilson Cavalcanti72356722018-02-16 03:41:14 +0000119 }
120
121 sources = [
Adenilson Cavalcanti72356722018-02-16 03:41:14 +0000122 "crc32_simd.c",
123 "crc32_simd.h",
124 ]
Adenilson Cavalcanti72356722018-02-16 03:41:14 +0000125 }
126
Tom Anderson20c7ae12019-04-08 20:51:48 +0000127 configs += [ ":zlib_internal_config" ]
128
Adenilson Cavalcanti72356722018-02-16 03:41:14 +0000129 public_configs = [ ":zlib_arm_crc32_config" ]
130 }
131}
132
Noel Gordon64ffef02017-12-08 11:39:34 +0000133config("zlib_inflate_chunk_simd_config") {
Daniel Bratelldde5ce52018-10-31 11:39:12 +0000134 if (use_x86_x64_optimizations) {
Noel Gordonbedc29e2018-02-12 01:46:01 +0000135 defines = [ "INFLATE_CHUNK_SIMD_SSE2" ]
136
137 if (current_cpu == "x64") {
138 defines += [ "INFLATE_CHUNK_READ_64LE" ]
139 }
Noel Gordon64ffef02017-12-08 11:39:34 +0000140 }
141
Daniel Bratelldde5ce52018-10-31 11:39:12 +0000142 if (use_arm_neon_optimizations) {
143 defines = [ "INFLATE_CHUNK_SIMD_NEON" ]
Noel Gordona0ea34a2020-04-20 20:32:01 +0000144
Adenilson Cavalcanti9972c362019-01-31 21:39:02 +0000145 if (current_cpu == "arm64") {
146 defines += [ "INFLATE_CHUNK_READ_64LE" ]
147 }
Noel Gordon64ffef02017-12-08 11:39:34 +0000148 }
149}
150
151source_set("zlib_inflate_chunk_simd") {
152 visibility = [ ":*" ]
153
Daniel Bratelldde5ce52018-10-31 11:39:12 +0000154 if (use_x86_x64_optimizations || use_arm_neon_optimizations) {
Noel Gordon64ffef02017-12-08 11:39:34 +0000155 include_dirs = [ "." ]
156
157 sources = [
158 "contrib/optimizations/chunkcopy.h",
159 "contrib/optimizations/inffast_chunk.c",
160 "contrib/optimizations/inffast_chunk.h",
161 "contrib/optimizations/inflate.c",
162 ]
Noel Gordon64ffef02017-12-08 11:39:34 +0000163 }
164
Noel Gordona0ea34a2020-04-20 20:32:01 +0000165 configs += [ ":zlib_internal_config" ]
Noel Gordon64ffef02017-12-08 11:39:34 +0000166
K. Moon1b274912020-04-22 21:15:09 +0000167 # Needed for MSVC, which is still supported by V8 and PDFium. zlib uses K&R C
168 # style function declarations, which triggers warning C4131.
169 configs -= [ "//build/config/compiler:chromium_code" ]
170 configs += [ "//build/config/compiler:no_chromium_code" ]
171
Noel Gordon64ffef02017-12-08 11:39:34 +0000172 public_configs = [ ":zlib_inflate_chunk_simd_config" ]
173}
174
Noel Gordon8e904b32018-01-04 12:10:08 +1100175config("zlib_crc32_simd_config") {
Daniel Bratelldde5ce52018-10-31 11:39:12 +0000176 if (use_x86_x64_optimizations) {
Noel Gordon8e904b32018-01-04 12:10:08 +1100177 defines = [ "CRC32_SIMD_SSE42_PCLMUL" ]
178 }
179}
180
181source_set("zlib_crc32_simd") {
182 visibility = [ ":*" ]
183
Daniel Bratelldde5ce52018-10-31 11:39:12 +0000184 if (use_x86_x64_optimizations) {
Noel Gordon8e904b32018-01-04 12:10:08 +1100185 sources = [
186 "crc32_simd.c",
187 "crc32_simd.h",
188 ]
189
190 if (!is_win || is_clang) {
191 cflags = [
192 "-msse4.2",
193 "-mpclmul",
194 ]
195 }
196 }
197
Tom Anderson20c7ae12019-04-08 20:51:48 +0000198 configs += [ ":zlib_internal_config" ]
199
Noel Gordon8e904b32018-01-04 12:10:08 +1100200 public_configs = [ ":zlib_crc32_simd_config" ]
201}
202
Noel Gordon2ed8ded2020-04-21 12:11:09 +0000203config("zlib_x86_simd_config") {
204 if (use_x86_x64_optimizations) {
Noel Gordonf36fe822020-04-22 02:50:27 +0000205 defines = [
206 "CRC32_SIMD_SSE42_PCLMUL",
207 "DEFLATE_FILL_WINDOW_SSE2",
208 ]
Noel Gordon2ed8ded2020-04-21 12:11:09 +0000209 }
210}
211
Tom Anderson20c7ae12019-04-08 20:51:48 +0000212source_set("zlib_x86_simd") {
Noel Gordon8e904b32018-01-04 12:10:08 +1100213 visibility = [ ":*" ]
214
Daniel Bratelldde5ce52018-10-31 11:39:12 +0000215 if (use_x86_x64_optimizations) {
scottmgb8135bf2014-12-02 23:28:00 -0800216 sources = [
217 "crc_folding.c",
218 "fill_window_sse.c",
219 ]
Noel Gordon8e904b32018-01-04 12:10:08 +1100220
Nico Weber0f60cc52014-11-18 15:21:17 -0800221 if (!is_win || is_clang) {
scottmgb8135bf2014-12-02 23:28:00 -0800222 cflags = [
223 "-msse4.2",
224 "-mpclmul",
225 ]
Nico Weber0f60cc52014-11-18 15:21:17 -0800226 }
robert.bradford10dd6862014-11-05 06:59:34 -0800227 }
dpranke73636152014-11-17 17:54:55 -0800228
Noel Gordona0ea34a2020-04-20 20:32:01 +0000229 configs += [ ":zlib_internal_config" ]
Noel Gordon2ed8ded2020-04-21 12:11:09 +0000230
231 public_configs = [ ":zlib_x86_simd_config" ]
robert.bradford10dd6862014-11-05 06:59:34 -0800232}
233
brettw3f3d1262015-09-02 10:57:05 -0700234config("zlib_warnings") {
Daniel Bratelldde5ce52018-10-31 11:39:12 +0000235 if (is_clang && use_x86_x64_optimizations) {
brettw3f3d1262015-09-02 10:57:05 -0700236 cflags = [ "-Wno-incompatible-pointer-types" ]
237 }
238}
239
Tom Anderson20c7ae12019-04-08 20:51:48 +0000240component("zlib") {
brettw@chromium.org069e2b82014-04-30 16:47:24 +0000241 if (!is_win) {
242 # Don't stomp on "libzlib" on other platforms.
243 output_name = "chrome_zlib"
244 }
245
246 sources = [
247 "adler32.c",
Tom Anderson20c7ae12019-04-08 20:51:48 +0000248 "chromeconf.h",
brettw@chromium.org069e2b82014-04-30 16:47:24 +0000249 "compress.c",
Adenilson Cavalcantid7f3ca92019-12-12 20:49:49 +0000250 "contrib/optimizations/insert_string.h",
Adenilson Cavalcanti5de00af2020-01-08 22:12:31 +0000251 "cpu_features.c",
252 "cpu_features.h",
brettw@chromium.org069e2b82014-04-30 16:47:24 +0000253 "crc32.c",
254 "crc32.h",
255 "deflate.c",
256 "deflate.h",
257 "gzclose.c",
258 "gzguts.h",
259 "gzlib.c",
260 "gzread.c",
261 "gzwrite.c",
262 "infback.c",
263 "inffast.c",
264 "inffast.h",
265 "inffixed.h",
brettw@chromium.org069e2b82014-04-30 16:47:24 +0000266 "inflate.h",
267 "inftrees.c",
268 "inftrees.h",
brettw@chromium.org069e2b82014-04-30 16:47:24 +0000269 "trees.c",
270 "trees.h",
271 "uncompr.c",
272 "zconf.h",
273 "zlib.h",
274 "zutil.c",
275 "zutil.h",
276 ]
277
Boris Sazonov0f473a12017-11-30 10:01:30 +0000278 defines = []
279 deps = []
Noel Gordona0ea34a2020-04-20 20:32:01 +0000280
Adenilson Cavalcanti5de00af2020-01-08 22:12:31 +0000281 if (!use_x86_x64_optimizations && !use_arm_neon_optimizations) {
282 # Apparently android_cronet bot builds with NEON disabled and
283 # we also should disable optimizations for iOS@x86 (a.k.a. simulator).
284 defines += [ "CPU_NO_SIMD" ]
285 }
286
287 if (is_ios) {
288 # iOS@ARM is a special case where we always have NEON but don't check
289 # for crypto extensions.
Noel Gordona0ea34a2020-04-20 20:32:01 +0000290 # TODO(cavalcantii): verify what is the current state of CPU features
291 # shipped on latest iOS devices.
Adenilson Cavalcanti5de00af2020-01-08 22:12:31 +0000292 defines += [ "ARM_OS_IOS" ]
293 }
Boris Sazonov0f473a12017-11-30 10:01:30 +0000294
Daniel Bratelldde5ce52018-10-31 11:39:12 +0000295 if (use_x86_x64_optimizations || use_arm_neon_optimizations) {
296 deps += [
297 ":zlib_adler32_simd",
298 ":zlib_inflate_chunk_simd",
299 ]
Noel Gordon8e904b32018-01-04 12:10:08 +1100300
Daniel Bratelldde5ce52018-10-31 11:39:12 +0000301 if (use_x86_x64_optimizations) {
Daniel Bratelldde5ce52018-10-31 11:39:12 +0000302 deps += [ ":zlib_crc32_simd" ]
303 } else if (use_arm_neon_optimizations) {
Adenilson Cavalcantid6d19612018-08-07 16:08:59 +0000304 sources += [ "contrib/optimizations/slide_hash_neon.h" ]
Daniel Bratelldde5ce52018-10-31 11:39:12 +0000305 deps += [ ":zlib_arm_crc32" ]
Noel Gordon17bbb3d2017-09-29 19:44:25 +0000306 }
Daniel Bratelldde5ce52018-10-31 11:39:12 +0000307 } else {
308 sources += [ "inflate.c" ]
robert.bradford10dd6862014-11-05 06:59:34 -0800309 }
310
Noel Gordona0ea34a2020-04-20 20:32:01 +0000311 deps += [ ":zlib_x86_simd" ]
312
Adenilson Cavalcanti5de00af2020-01-08 22:12:31 +0000313 if (is_android) {
314 import("//build/config/android/config.gni")
315 if (defined(android_ndk_root) && android_ndk_root != "") {
316 deps += [ "//third_party/android_ndk:cpu_features" ]
317 } else {
318 assert(false, "CPU detection requires the Android NDK")
319 }
320 }
321
brettw@chromium.org069e2b82014-04-30 16:47:24 +0000322 configs -= [ "//build/config/compiler:chromium_code" ]
Noel Gordona0ea34a2020-04-20 20:32:01 +0000323 configs += [ "//build/config/compiler:no_chromium_code" ]
324
325 public_configs = [ ":zlib_config" ]
326
brettw3f3d1262015-09-02 10:57:05 -0700327 configs += [
Tom Anderson20c7ae12019-04-08 20:51:48 +0000328 ":zlib_internal_config",
Lei Zhang40c3a762020-04-22 04:07:41 +0000329
brettw3f3d1262015-09-02 10:57:05 -0700330 # Must be after no_chromium_code for warning flags to be ordered correctly.
331 ":zlib_warnings",
332 ]
brettw@chromium.org069e2b82014-04-30 16:47:24 +0000333
Daniel Bratelldde5ce52018-10-31 11:39:12 +0000334 allow_circular_includes_from = deps
brettw@chromium.org069e2b82014-04-30 16:47:24 +0000335}
336
brettw3f3d1262015-09-02 10:57:05 -0700337config("minizip_warnings") {
338 visibility = [ ":*" ]
Noel Gordon71eb81f2018-02-12 08:15:47 +0000339
brettw3f3d1262015-09-02 10:57:05 -0700340 if (is_clang) {
341 # zlib uses `if ((a == b))` for some reason.
342 cflags = [ "-Wno-parentheses-equality" ]
343 }
344}
345
brettw@chromium.org069e2b82014-04-30 16:47:24 +0000346static_library("minizip") {
347 sources = [
348 "contrib/minizip/ioapi.c",
349 "contrib/minizip/ioapi.h",
350 "contrib/minizip/iowin32.c",
351 "contrib/minizip/iowin32.h",
352 "contrib/minizip/unzip.c",
353 "contrib/minizip/unzip.h",
354 "contrib/minizip/zip.c",
355 "contrib/minizip/zip.h",
356 ]
357
358 if (!is_win) {
359 sources -= [
360 "contrib/minizip/iowin32.c",
361 "contrib/minizip/iowin32.h",
362 ]
363 }
Noel Gordon71eb81f2018-02-12 08:15:47 +0000364
Sylvain Defresne103247f2020-07-27 14:16:50 +0000365 if (is_apple || is_android || is_nacl) {
brettw@chromium.org069e2b82014-04-30 16:47:24 +0000366 # Mac, Android and the BSDs don't have fopen64, ftello64, or fseeko64. We
367 # use fopen, ftell, and fseek instead on these systems.
Hans Wennborg814da1f2019-12-21 11:13:14 +0000368 defines = [ "USE_FILE32API" ]
brettw@chromium.org069e2b82014-04-30 16:47:24 +0000369 }
370
Nico Weberb9b9a5a2020-01-28 18:17:22 +0000371 deps = [ ":zlib" ]
brettw@chromium.org069e2b82014-04-30 16:47:24 +0000372
373 configs -= [ "//build/config/compiler:chromium_code" ]
Noel Gordona0ea34a2020-04-20 20:32:01 +0000374 configs += [ "//build/config/compiler:no_chromium_code" ]
brettw3f3d1262015-09-02 10:57:05 -0700375
Noel Gordona0ea34a2020-04-20 20:32:01 +0000376 public_configs = [ ":zlib_config" ]
377
378 configs += [
brettw3f3d1262015-09-02 10:57:05 -0700379 # Must be after no_chromium_code for warning flags to be ordered correctly.
380 ":minizip_warnings",
381 ]
brettw@chromium.org069e2b82014-04-30 16:47:24 +0000382}
Noel Gordonc83e2162018-01-21 11:19:12 +0000383
384executable("zlib_bench") {
385 include_dirs = [ "." ]
386
Nico Weberb9b9a5a2020-01-28 18:17:22 +0000387 sources = [ "contrib/bench/zlib_bench.cc" ]
Noel Gordonc83e2162018-01-21 11:19:12 +0000388 if (!is_debug) {
389 configs -= [ "//build/config/compiler:default_optimization" ]
390 configs += [ "//build/config/compiler:optimize_speed" ]
391 }
392
Noel Gordona0ea34a2020-04-20 20:32:01 +0000393 deps = [ ":zlib" ]
394
Noel Gordonc83e2162018-01-21 11:19:12 +0000395 configs -= [ "//build/config/compiler:chromium_code" ]
396 configs += [ "//build/config/compiler:no_chromium_code" ]
Noel Gordonc83e2162018-01-21 11:19:12 +0000397}
Adenilson Cavalcanti61bddcc2020-04-08 23:34:58 +0000398
Lei Zhang40c3a762020-04-22 04:07:41 +0000399if (build_with_chromium) {
400 test("zlib_unittests") {
Adenilson Cavalcanti699e86d2020-04-29 03:44:04 +0000401 testonly = true
402
Lei Zhang40c3a762020-04-22 04:07:41 +0000403 sources = [
Adenilson Cavalcanti699e86d2020-04-29 03:44:04 +0000404 "contrib/tests/infcover.cc",
405 "contrib/tests/infcover.h",
Lei Zhang40c3a762020-04-22 04:07:41 +0000406 "contrib/tests/utils_unittest.cc",
407 "google/compression_utils_portable.cc",
408 "google/compression_utils_portable.h",
409 ]
Adenilson Cavalcanti61bddcc2020-04-08 23:34:58 +0000410
Lei Zhang40c3a762020-04-22 04:07:41 +0000411 deps = [
412 ":zlib",
413 "//testing/gtest",
414 "//testing/gtest:gtest_main",
415 ]
Adenilson Cavalcantif5eca0d2020-05-26 20:39:26 +0000416
417 include_dirs = [
418 "//third_party/googletest/src/googletest/include/gtest",
419 ".",
420 "google",
421 ]
Lei Zhang40c3a762020-04-22 04:07:41 +0000422 }
Adenilson Cavalcanti61bddcc2020-04-08 23:34:58 +0000423}