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