xref: /aosp_15_r20/external/zlib/BUILD.gn (revision 86ee64e75fa5f8bce2c8c356138035642429cd05)
1# Copyright 2013 The Chromium Authors
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5import("//build/config/compiler/compiler.gni")
6import("//build/config/dcheck_always_on.gni")
7
8declare_args() {
9  # Expose zlib's symbols, used by Node.js to provide zlib APIs for its native
10  # modules.
11  zlib_symbols_visible = false
12}
13
14if (build_with_chromium) {
15  import("//testing/test.gni")
16}
17
18if (current_cpu == "arm" || current_cpu == "arm64") {
19  import("//build/config/arm.gni")
20}
21
22config("zlib_config") {
23  include_dirs = [ "." ]
24
25  if (zlib_symbols_visible) {
26    defines = [ "ZLIB_DLL" ]
27  }
28}
29
30config("zlib_internal_config") {
31  defines = [ "ZLIB_IMPLEMENTATION" ]
32
33  if (!is_debug) {
34    # Build code using -O3, see: crbug.com/1084371.
35    configs = [ "//build/config/compiler:optimize_speed" ]
36  }
37  if (is_debug || dcheck_always_on || use_fuzzing_engine) {
38    # Enable zlib's asserts in debug and fuzzer builds.
39    defines += [ "ZLIB_DEBUG" ]
40  }
41
42  if (is_win && !is_clang) {
43    # V8 supports building with msvc, these silence some warnings that
44    # causes compilation to fail (https://crbug.com/1255096).
45    cflags = [
46      "/wd4244",
47      "/wd4100",
48      "/wd4702",
49      "/wd4127",
50    ]
51  }
52}
53
54source_set("zlib_common_headers") {
55  visibility = [ ":*" ]
56
57  sources = [
58    "chromeconf.h",
59    "deflate.h",
60    "inffast.h",
61    "inffixed.h",
62    "inflate.h",
63    "inftrees.h",
64    "zconf.h",
65    "zlib.h",
66    "zutil.h",
67  ]
68}
69
70use_arm_neon_optimizations = false
71if ((current_cpu == "arm" || current_cpu == "arm64") &&
72    !(is_win && !is_clang)) {
73  # TODO([email protected]): Optimizations temporarily disabled for
74  # Windows on Arm MSVC builds, see http://crbug.com/v8/10012.
75  if (arm_use_neon) {
76    use_arm_neon_optimizations = true
77  }
78}
79
80use_x86_x64_optimizations =
81    (current_cpu == "x86" || current_cpu == "x64") && !is_ios
82
83config("zlib_adler32_simd_config") {
84  if (use_x86_x64_optimizations) {
85    defines = [ "ADLER32_SIMD_SSSE3" ]
86    if (is_win) {
87      defines += [ "X86_WINDOWS" ]
88    } else {
89      defines += [ "X86_NOT_WINDOWS" ]
90    }
91  }
92
93  if (use_arm_neon_optimizations) {
94    defines = [ "ADLER32_SIMD_NEON" ]
95  }
96}
97
98source_set("zlib_adler32_simd") {
99  visibility = [ ":*" ]
100
101  if (use_x86_x64_optimizations) {
102    sources = [
103      "adler32_simd.c",
104      "adler32_simd.h",
105    ]
106
107    if (!is_win || is_clang) {
108      cflags = [ "-mssse3" ]
109    }
110  }
111
112  if (use_arm_neon_optimizations) {
113    sources = [
114      "adler32_simd.c",
115      "adler32_simd.h",
116    ]
117  }
118
119  configs += [ ":zlib_internal_config" ]
120
121  public_configs = [ ":zlib_adler32_simd_config" ]
122
123  public_deps = [ ":zlib_common_headers" ]
124}
125
126if (use_arm_neon_optimizations) {
127  config("zlib_arm_crc32_config") {
128    defines = [ "CRC32_ARMV8_CRC32" ]
129    if (is_android) {
130      defines += [ "ARMV8_OS_ANDROID" ]
131    } else if (is_linux || is_chromeos) {
132      defines += [ "ARMV8_OS_LINUX" ]
133    } else if (is_mac) {
134      defines += [ "ARMV8_OS_MACOS" ]
135    } else if (is_ios) {
136      defines += [ "ARMV8_OS_IOS" ]
137    } else if (is_fuchsia) {
138      defines += [ "ARMV8_OS_FUCHSIA" ]
139    } else if (is_win) {
140      defines += [ "ARMV8_OS_WINDOWS" ]
141    } else {
142      assert(false, "Unsupported ARM OS")
143    }
144  }
145
146  source_set("zlib_arm_crc32") {
147    visibility = [ ":*" ]
148
149    include_dirs = [ "." ]
150
151    if (!is_win && !is_clang) {
152      assert(!use_thin_lto,
153             "ThinLTO fails mixing different module-level targets")
154      cflags_c = [ "-march=armv8-a+aes+crc" ]
155    }
156
157    sources = [
158      "crc32_simd.c",
159      "crc32_simd.h",
160    ]
161
162    configs += [ ":zlib_internal_config" ]
163
164    public_configs = [ ":zlib_arm_crc32_config" ]
165
166    public_deps = [ ":zlib_common_headers" ]
167  }
168}
169
170config("zlib_inflate_chunk_simd_config") {
171  if (use_x86_x64_optimizations) {
172    defines = [ "INFLATE_CHUNK_SIMD_SSE2" ]
173
174    if (current_cpu == "x64") {
175      defines += [ "INFLATE_CHUNK_READ_64LE" ]
176    }
177  }
178
179  if (use_arm_neon_optimizations) {
180    defines = [ "INFLATE_CHUNK_SIMD_NEON" ]
181
182    if (current_cpu == "arm64") {
183      defines += [ "INFLATE_CHUNK_READ_64LE" ]
184    }
185  }
186}
187
188source_set("zlib_inflate_chunk_simd") {
189  visibility = [ ":*" ]
190
191  if (use_x86_x64_optimizations || use_arm_neon_optimizations) {
192    include_dirs = [ "." ]
193
194    sources = [
195      "contrib/optimizations/chunkcopy.h",
196      "contrib/optimizations/inffast_chunk.c",
197      "contrib/optimizations/inffast_chunk.h",
198      "contrib/optimizations/inflate.c",
199    ]
200  }
201
202  configs += [ ":zlib_internal_config" ]
203
204  # Needed for MSVC, which is still supported by V8 and PDFium. zlib uses K&R C
205  # style function declarations, which triggers warning C4131.
206  configs -= [ "//build/config/compiler:chromium_code" ]
207  configs += [ "//build/config/compiler:no_chromium_code" ]
208  configs += [ ":zlib_warnings" ]
209
210  public_configs = [ ":zlib_inflate_chunk_simd_config" ]
211
212  public_deps = [ ":zlib_common_headers" ]
213}
214
215config("zlib_crc32_simd_config") {
216  if (use_x86_x64_optimizations) {
217    defines = [ "CRC32_SIMD_SSE42_PCLMUL" ]
218  }
219}
220
221source_set("zlib_crc32_simd") {
222  visibility = [ ":*" ]
223
224  if (use_x86_x64_optimizations) {
225    sources = [
226      "crc32_simd.c",
227      "crc32_simd.h",
228      "crc_folding.c",
229    ]
230
231    if (!is_win || is_clang) {
232      cflags = [
233        "-msse4.2",
234        "-mpclmul",
235      ]
236    }
237  }
238
239  configs += [ ":zlib_internal_config" ]
240
241  public_configs = [ ":zlib_crc32_simd_config" ]
242
243  public_deps = [ ":zlib_common_headers" ]
244}
245
246config("zlib_slide_hash_simd_config") {
247  if (use_x86_x64_optimizations) {
248    defines = [ "DEFLATE_SLIDE_HASH_SSE2" ]
249  }
250
251  if (use_arm_neon_optimizations) {
252    defines = [ "DEFLATE_SLIDE_HASH_NEON" ]
253  }
254}
255
256source_set("zlib_slide_hash_simd") {
257  visibility = [ ":*" ]
258
259  if (use_x86_x64_optimizations) {
260    sources = [ "slide_hash_simd.h" ]
261  }
262
263  if (use_arm_neon_optimizations) {
264    sources = [ "slide_hash_simd.h" ]
265  }
266
267  configs += [ ":zlib_internal_config" ]
268
269  public_configs = [ ":zlib_slide_hash_simd_config" ]
270
271  public_deps = [ ":zlib_common_headers" ]
272}
273
274config("zlib_warnings") {
275  if (is_clang) {
276    cflags = [
277      "-Wno-incompatible-pointer-types",
278      "-Wunused-variable",
279    ]
280  }
281}
282
283component("zlib") {
284  if (!is_win) {
285    # Don't stomp on "libzlib" on other platforms.
286    output_name = "chrome_zlib"
287  }
288
289  sources = [
290    "adler32.c",
291    "chromeconf.h",
292    "compress.c",
293    "contrib/optimizations/insert_string.h",
294    "cpu_features.c",
295    "cpu_features.h",
296    "crc32.c",
297    "crc32.h",
298    "deflate.c",
299    "deflate.h",
300    "gzclose.c",
301    "gzguts.h",
302    "gzlib.c",
303    "gzread.c",
304    "gzwrite.c",
305    "infback.c",
306    "inffast.c",
307    "inffast.h",
308    "inffixed.h",
309    "inflate.h",
310    "inftrees.c",
311    "inftrees.h",
312    "trees.c",
313    "trees.h",
314    "uncompr.c",
315    "zconf.h",
316    "zlib.h",
317    "zutil.c",
318    "zutil.h",
319  ]
320
321  defines = []
322  deps = []
323
324  if (!use_x86_x64_optimizations && !use_arm_neon_optimizations) {
325    # Apparently android_cronet bot builds with NEON disabled and
326    # we also should disable optimizations for iOS@x86 (a.k.a. simulator).
327    defines += [ "CPU_NO_SIMD" ]
328  }
329
330  if (use_x86_x64_optimizations || use_arm_neon_optimizations) {
331    deps += [
332      ":zlib_adler32_simd",
333      ":zlib_inflate_chunk_simd",
334      ":zlib_slide_hash_simd",
335    ]
336
337    if (use_x86_x64_optimizations) {
338      deps += [ ":zlib_crc32_simd" ]
339    } else if (use_arm_neon_optimizations) {
340      deps += [ ":zlib_arm_crc32" ]
341    }
342  } else {
343    sources += [ "inflate.c" ]
344  }
345
346  if (is_android) {
347    import("//build/config/android/config.gni")
348    if (defined(android_ndk_root) && android_ndk_root != "") {
349      deps += [ "//third_party/cpu_features:ndk_compat" ]
350    } else {
351      assert(false, "CPU detection requires the Android NDK")
352    }
353  }
354
355  configs -= [ "//build/config/compiler:chromium_code" ]
356  configs += [ "//build/config/compiler:no_chromium_code" ]
357
358  if (zlib_symbols_visible) {
359    configs -= [ "//build/config/gcc:symbol_visibility_hidden" ]
360    configs += [ "//build/config/gcc:symbol_visibility_default" ]
361  }
362
363  public_configs = [ ":zlib_config" ]
364
365  configs += [
366    ":zlib_internal_config",
367
368    # Must be after no_chromium_code for warning flags to be ordered correctly.
369    ":zlib_warnings",
370  ]
371
372  allow_circular_includes_from = deps
373}
374
375config("minizip_warnings") {
376  visibility = [ ":*" ]
377
378  if (is_clang) {
379    cflags = [
380      # zlib uses `if ((a == b))` for some reason.
381      "-Wno-parentheses-equality",
382    ]
383  }
384}
385
386static_library("minizip") {
387  include_dirs = [
388    ".",
389    "//third_party/zlib",
390  ]
391
392  sources = [
393    "contrib/minizip/ioapi.c",
394    "contrib/minizip/ioapi.h",
395    "contrib/minizip/iowin32.c",
396    "contrib/minizip/iowin32.h",
397    "contrib/minizip/unzip.c",
398    "contrib/minizip/unzip.h",
399    "contrib/minizip/zip.c",
400    "contrib/minizip/zip.h",
401  ]
402
403  if (!is_win) {
404    sources -= [
405      "contrib/minizip/iowin32.c",
406      "contrib/minizip/iowin32.h",
407    ]
408  }
409
410  if (is_apple || is_android || is_nacl) {
411    # Mac, Android and the BSDs don't have fopen64, ftello64, or fseeko64. We
412    # use fopen, ftell, and fseek instead on these systems.
413    defines = [ "USE_FILE32API" ]
414  }
415
416  deps = [ ":zlib" ]
417
418  configs -= [ "//build/config/compiler:chromium_code" ]
419  configs += [ "//build/config/compiler:no_chromium_code" ]
420
421  public_configs = [ ":zlib_config" ]
422
423  configs += [
424    # Must be after no_chromium_code for warning flags to be ordered correctly.
425    ":minizip_warnings",
426  ]
427}
428
429executable("zlib_bench") {
430  include_dirs = [ "." ]
431
432  sources = [ "contrib/bench/zlib_bench.cc" ]
433  if (!is_debug) {
434    configs -= [ "//build/config/compiler:default_optimization" ]
435    configs += [ "//build/config/compiler:optimize_speed" ]
436  }
437
438  deps = [ ":zlib" ]
439
440  configs -= [ "//build/config/compiler:chromium_code" ]
441  configs += [ "//build/config/compiler:no_chromium_code" ]
442}
443
444executable("minigzip") {
445  include_dirs = [ "." ]
446
447  sources = [ "test/minigzip.c" ]
448  if (!is_debug) {
449    configs -= [ "//build/config/compiler:default_optimization" ]
450    configs += [ "//build/config/compiler:optimize_speed" ]
451  }
452
453  deps = [ ":zlib" ]
454
455  configs -= [ "//build/config/compiler:chromium_code" ]
456  configs += [ "//build/config/compiler:no_chromium_code" ]
457}
458
459executable("zpipe") {
460  include_dirs = [ "." ]
461
462  sources = [ "examples/zpipe.c" ]
463  if (!is_debug) {
464    configs -= [ "//build/config/compiler:default_optimization" ]
465    configs += [ "//build/config/compiler:optimize_speed" ]
466  }
467
468  deps = [ ":zlib" ]
469
470  configs -= [ "//build/config/compiler:chromium_code" ]
471  configs += [ "//build/config/compiler:no_chromium_code" ]
472}
473
474if (!is_win || target_os != "winuwp") {
475  executable("minizip_bin") {
476    include_dirs = [ "." ]
477
478    sources = [ "contrib/minizip/minizip.c" ]
479
480    if (is_clang) {
481      cflags = [
482        "-Wno-incompatible-pointer-types-discards-qualifiers",
483      ]
484    }
485
486    if (!is_debug) {
487      configs -= [ "//build/config/compiler:default_optimization" ]
488      configs += [ "//build/config/compiler:optimize_speed" ]
489    }
490
491    deps = [ ":minizip" ]
492
493    configs -= [ "//build/config/compiler:chromium_code" ]
494    configs += [ "//build/config/compiler:no_chromium_code" ]
495  }
496
497  executable("miniunz_bin") {
498    include_dirs = [ "." ]
499
500    sources = [ "contrib/minizip/miniunz.c" ]
501
502    if (is_clang) {
503      cflags = [
504        "-Wno-incompatible-pointer-types-discards-qualifiers",
505      ]
506    }
507
508    if (!is_debug) {
509      configs -= [ "//build/config/compiler:default_optimization" ]
510      configs += [ "//build/config/compiler:optimize_speed" ]
511    }
512
513    deps = [ ":minizip" ]
514
515    configs -= [ "//build/config/compiler:chromium_code" ]
516    configs += [ "//build/config/compiler:no_chromium_code" ]
517  }
518}
519
520if (build_with_chromium) {
521  test("zlib_unittests") {
522    testonly = true
523
524    sources = [
525      "contrib/tests/infcover.cc",
526      "contrib/tests/infcover.h",
527      "contrib/tests/run_all_unittests.cc",
528      "contrib/tests/utils_unittest.cc",
529      "google/compression_utils_unittest.cc",
530      "google/zip_reader_unittest.cc",
531      "google/zip_unittest.cc",
532    ]
533
534    data = [ "google/test/data/" ]
535
536    if (is_ios) {
537      bundle_deps = [ "google:zlib_pak_bundle_data" ]
538    }
539
540    deps = [
541      ":minizip",
542      ":zlib",
543      "google:compression_utils",
544      "google:zip",
545      "//base/test:test_support",
546      "//testing/gtest",
547    ]
548
549    configs -= [ "//build/config/compiler:chromium_code" ]
550    configs += [ "//build/config/compiler:no_chromium_code" ]
551
552    include_dirs = [
553      "//third_party/googletest/src/googletest/include/gtest",
554      ".",
555      "google",
556    ]
557  }
558}
559