upstream status: https://github.com/dart-lang/sdk/issues/51535 diff --git a/third_party/zlib/BUILD.gn b/third_party/zlib/BUILD.gn index 3a71693..ce9fb5c 100644 --- a/third_party/zlib/BUILD.gn +++ b/third_party/zlib/BUILD.gn @@ -1,8 +1,9 @@ -# Copyright (c) 2013 The Chromium Authors. All rights reserved. +# Copyright 2013 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. import("//build/config/compiler/compiler.gni") +import("system.gni") if (build_with_chromium) { import("//testing/test.gni") @@ -12,417 +13,471 @@ if (current_cpu == "arm" || current_cpu == "arm64") { import("//build/config/arm.gni") } -config("zlib_config") { - include_dirs = [ "." ] +if (use_system_zlib) { + import("//build/shim_headers.gni") } -config("zlib_internal_config") { - defines = [ "ZLIB_IMPLEMENTATION" ] - - if (!is_debug) { - # Build code using -O3, see: crbug.com/1084371. - configs = [ "//build/config/compiler:optimize_speed" ] - } - if (is_debug || use_libfuzzer) { - # Enable zlib's asserts in debug and fuzzer builds. - defines += [ "ZLIB_DEBUG" ] - } - - if (is_win && !is_clang) { - # V8 supports building with msvc, these silence some warnings that - # causes compilation to fail (https://crbug.com/1255096). - cflags = [ - "/wd4244", - "/wd4100", - "/wd4702", - "/wd4127", - ] - } -} - -source_set("zlib_common_headers") { - sources = [ - "chromeconf.h", - "deflate.h", - "inffast.h", - "inffixed.h", - "inflate.h", - "inftrees.h", - "zconf.h", - "zlib.h", - "zutil.h", - ] +config("system_zlib") { + defines = [ "USE_SYSTEM_ZLIB=1" ] } -use_arm_neon_optimizations = false -if ((current_cpu == "arm" || current_cpu == "arm64") && - !(is_win && !is_clang)) { - # TODO(richard.townsend@arm.com): Optimizations temporarily disabled for - # Windows on Arm MSVC builds, see http://crbug.com/v8/10012. - if (arm_use_neon) { - use_arm_neon_optimizations = true +config("zlib_config") { + if (use_system_zlib) { + configs = [ ":system_zlib" ] + } else { + include_dirs = [ "." ] } } -use_x86_x64_optimizations = - (current_cpu == "x86" || current_cpu == "x64") && !is_ios +if (!use_system_zlib) { + config("zlib_internal_config") { + defines = [ "ZLIB_IMPLEMENTATION" ] -config("zlib_adler32_simd_config") { - if (use_x86_x64_optimizations) { - defines = [ "ADLER32_SIMD_SSSE3" ] - if (is_win) { - defines += [ "X86_WINDOWS" ] - } else { - defines += [ "X86_NOT_WINDOWS" ] + if (!is_debug) { + # Build code using -O3, see: crbug.com/1084371. + configs = [ "//build/config/compiler:optimize_speed" ] + } + if (is_debug || use_libfuzzer) { + # Enable zlib's asserts in debug and fuzzer builds. + defines += [ "ZLIB_DEBUG" ] } - } - if (use_arm_neon_optimizations) { - defines = [ "ADLER32_SIMD_NEON" ] + if (is_win && !is_clang) { + # V8 supports building with msvc, these silence some warnings that + # causes compilation to fail (https://crbug.com/1255096). + cflags = [ + "/wd4244", + "/wd4100", + "/wd4702", + "/wd4127", + ] + } } -} -source_set("zlib_adler32_simd") { - visibility = [ ":*" ] + source_set("zlib_common_headers") { + visibility = [ ":*" ] - if (use_x86_x64_optimizations) { sources = [ - "adler32_simd.c", - "adler32_simd.h", + "chromeconf.h", + "deflate.h", + "inffast.h", + "inffixed.h", + "inflate.h", + "inftrees.h", + "zconf.h", + "zlib.h", + "zutil.h", ] - - if (!is_win || is_clang) { - cflags = [ "-mssse3" ] - } } - if (use_arm_neon_optimizations) { - sources = [ - "adler32_simd.c", - "adler32_simd.h", - ] + use_arm_neon_optimizations = false + if ((current_cpu == "arm" || current_cpu == "arm64") && + !(is_win && !is_clang)) { + # TODO(richard.townsend@arm.com): Optimizations temporarily disabled for + # Windows on Arm MSVC builds, see http://crbug.com/v8/10012. + if (arm_use_neon) { + use_arm_neon_optimizations = true + } } - configs += [ ":zlib_internal_config" ] + use_x86_x64_optimizations = + (current_cpu == "x86" || current_cpu == "x64") && !is_ios - public_configs = [ ":zlib_adler32_simd_config" ] - - public_deps = [ ":zlib_common_headers" ] -} - -if (use_arm_neon_optimizations) { - config("zlib_arm_crc32_config") { - # Disabled for iPhone, as described in DDI0487C_a_armv8_arm: - # "All implementations of the ARMv8.1 architecture are required to - # implement the CRC32* instructions. These are optional in ARMv8.0." - if (!is_ios) { - defines = [ "CRC32_ARMV8_CRC32" ] - if (is_android) { - defines += [ "ARMV8_OS_ANDROID" ] - } else if (is_linux || is_chromeos) { - defines += [ "ARMV8_OS_LINUX" ] - } else if (is_mac) { - defines += [ "ARMV8_OS_MACOS" ] - } else if (is_fuchsia) { - defines += [ "ARMV8_OS_FUCHSIA" ] - } else if (is_win) { - defines += [ "ARMV8_OS_WINDOWS" ] + config("zlib_adler32_simd_config") { + if (use_x86_x64_optimizations) { + defines = [ "ADLER32_SIMD_SSSE3" ] + if (is_win) { + defines += [ "X86_WINDOWS" ] } else { - assert(false, "Unsupported ARM OS") + defines += [ "X86_NOT_WINDOWS" ] } } + + if (use_arm_neon_optimizations) { + defines = [ "ADLER32_SIMD_NEON" ] + } } - source_set("zlib_arm_crc32") { + source_set("zlib_adler32_simd") { visibility = [ ":*" ] - if (!is_ios) { - include_dirs = [ "." ] + if (use_x86_x64_optimizations) { + sources = [ + "adler32_simd.c", + "adler32_simd.h", + ] - if (!is_win && !is_clang) { - assert(!use_thin_lto, - "ThinLTO fails mixing different module-level targets") - cflags_c = [ "-march=armv8-a+crc" ] + if (!is_win || is_clang) { + cflags = [ "-mssse3" ] } + } + if (use_arm_neon_optimizations) { sources = [ - "crc32_simd.c", - "crc32_simd.h", + "adler32_simd.c", + "adler32_simd.h", ] } configs += [ ":zlib_internal_config" ] - public_configs = [ ":zlib_arm_crc32_config" ] + public_configs = [ ":zlib_adler32_simd_config" ] public_deps = [ ":zlib_common_headers" ] } -} - -config("zlib_inflate_chunk_simd_config") { - if (use_x86_x64_optimizations) { - defines = [ "INFLATE_CHUNK_SIMD_SSE2" ] - if (current_cpu == "x64") { - defines += [ "INFLATE_CHUNK_READ_64LE" ] + if (use_arm_neon_optimizations) { + config("zlib_arm_crc32_config") { + # Disabled for iPhone, as described in DDI0487C_a_armv8_arm: + # "All implementations of the ARMv8.1 architecture are required to + # implement the CRC32* instructions. These are optional in ARMv8.0." + if (!is_ios) { + defines = [ "CRC32_ARMV8_CRC32" ] + if (is_android) { + defines += [ "ARMV8_OS_ANDROID" ] + } else if (is_linux || is_chromeos) { + defines += [ "ARMV8_OS_LINUX" ] + } else if (is_mac) { + defines += [ "ARMV8_OS_MACOS" ] + } else if (is_fuchsia) { + defines += [ "ARMV8_OS_FUCHSIA" ] + } else if (is_win) { + defines += [ "ARMV8_OS_WINDOWS" ] + } else { + assert(false, "Unsupported ARM OS") + } + } } - } - if (use_arm_neon_optimizations) { - defines = [ "INFLATE_CHUNK_SIMD_NEON" ] + source_set("zlib_arm_crc32") { + visibility = [ ":*" ] - if (current_cpu == "arm64") { - defines += [ "INFLATE_CHUNK_READ_64LE" ] - } - } -} + if (!is_ios) { + include_dirs = [ "." ] -source_set("zlib_inflate_chunk_simd") { - visibility = [ ":*" ] + if (!is_win && !is_clang) { + assert(!use_thin_lto, + "ThinLTO fails mixing different module-level targets") + cflags_c = [ "-march=armv8-a+aes+crc" ] + } - if (use_x86_x64_optimizations || use_arm_neon_optimizations) { - include_dirs = [ "." ] + sources = [ + "crc32_simd.c", + "crc32_simd.h", + ] + } - sources = [ - "contrib/optimizations/chunkcopy.h", - "contrib/optimizations/inffast_chunk.c", - "contrib/optimizations/inffast_chunk.h", - "contrib/optimizations/inflate.c", - ] - } + configs += [ ":zlib_internal_config" ] - configs += [ ":zlib_internal_config" ] + public_configs = [ ":zlib_arm_crc32_config" ] - # Needed for MSVC, which is still supported by V8 and PDFium. zlib uses K&R C - # style function declarations, which triggers warning C4131. - configs -= [ "//build/config/compiler:chromium_code" ] - configs += [ "//build/config/compiler:no_chromium_code" ] + public_deps = [ ":zlib_common_headers" ] + } + } - public_configs = [ ":zlib_inflate_chunk_simd_config" ] + config("zlib_inflate_chunk_simd_config") { + if (use_x86_x64_optimizations) { + defines = [ "INFLATE_CHUNK_SIMD_SSE2" ] - public_deps = [ ":zlib_common_headers" ] -} + if (current_cpu == "x64") { + defines += [ "INFLATE_CHUNK_READ_64LE" ] + } + } + + if (use_arm_neon_optimizations) { + defines = [ "INFLATE_CHUNK_SIMD_NEON" ] -config("zlib_crc32_simd_config") { - if (use_x86_x64_optimizations) { - defines = [ "CRC32_SIMD_SSE42_PCLMUL" ] + if (current_cpu == "arm64") { + defines += [ "INFLATE_CHUNK_READ_64LE" ] + } + } } -} -source_set("zlib_crc32_simd") { - visibility = [ ":*" ] + source_set("zlib_inflate_chunk_simd") { + visibility = [ ":*" ] - if (use_x86_x64_optimizations) { - sources = [ - "crc32_simd.c", - "crc32_simd.h", - "crc_folding.c", - ] + if (use_x86_x64_optimizations || use_arm_neon_optimizations) { + include_dirs = [ "." ] - if (!is_win || is_clang) { - cflags = [ - "-msse4.2", - "-mpclmul", + sources = [ + "contrib/optimizations/chunkcopy.h", + "contrib/optimizations/inffast_chunk.c", + "contrib/optimizations/inffast_chunk.h", + "contrib/optimizations/inflate.c", ] } - } - configs += [ ":zlib_internal_config" ] + configs += [ ":zlib_internal_config" ] - public_configs = [ ":zlib_crc32_simd_config" ] + # Needed for MSVC, which is still supported by V8 and PDFium. zlib uses K&R C + # style function declarations, which triggers warning C4131. + configs -= [ "//build/config/compiler:chromium_code" ] + configs += [ "//build/config/compiler:no_chromium_code" ] + configs += [ ":zlib_warnings" ] - public_deps = [ ":zlib_common_headers" ] -} + public_configs = [ ":zlib_inflate_chunk_simd_config" ] -config("zlib_slide_hash_simd_config") { - if (use_x86_x64_optimizations) { - defines = [ "DEFLATE_SLIDE_HASH_SSE2" ] + public_deps = [ ":zlib_common_headers" ] } - if (use_arm_neon_optimizations) { - defines = [ "DEFLATE_SLIDE_HASH_NEON" ] + config("zlib_crc32_simd_config") { + if (use_x86_x64_optimizations) { + defines = [ "CRC32_SIMD_SSE42_PCLMUL" ] + } } -} -source_set("zlib_slide_hash_simd") { - visibility = [ ":*" ] + source_set("zlib_crc32_simd") { + visibility = [ ":*" ] - if (use_x86_x64_optimizations) { - sources = [ "slide_hash_simd.h" ] + if (use_x86_x64_optimizations) { + sources = [ + "crc32_simd.c", + "crc32_simd.h", + "crc_folding.c", + ] + + if (!is_win || is_clang) { + cflags = [ + "-msse4.2", + "-mpclmul", + ] + } + } + + configs += [ ":zlib_internal_config" ] + + public_configs = [ ":zlib_crc32_simd_config" ] + + public_deps = [ ":zlib_common_headers" ] } - if (use_arm_neon_optimizations) { - sources = [ "slide_hash_simd.h" ] + config("zlib_slide_hash_simd_config") { + if (use_x86_x64_optimizations) { + defines = [ "DEFLATE_SLIDE_HASH_SSE2" ] + } + + if (use_arm_neon_optimizations) { + defines = [ "DEFLATE_SLIDE_HASH_NEON" ] + } } - configs += [ ":zlib_internal_config" ] + source_set("zlib_slide_hash_simd") { + visibility = [ ":*" ] - public_configs = [ ":zlib_slide_hash_simd_config" ] + if (use_x86_x64_optimizations) { + sources = [ "slide_hash_simd.h" ] + } - public_deps = [ ":zlib_common_headers" ] -} + if (use_arm_neon_optimizations) { + sources = [ "slide_hash_simd.h" ] + } -config("zlib_warnings") { - if (is_clang && use_x86_x64_optimizations) { - cflags = [ "-Wno-incompatible-pointer-types" ] - } -} + configs += [ ":zlib_internal_config" ] -component("zlib") { - if (!is_win) { - # Don't stomp on "libzlib" on other platforms. - output_name = "chrome_zlib" - } + public_configs = [ ":zlib_slide_hash_simd_config" ] - sources = [ - "adler32.c", - "chromeconf.h", - "compress.c", - "contrib/optimizations/insert_string.h", - "cpu_features.c", - "cpu_features.h", - "crc32.c", - "crc32.h", - "deflate.c", - "deflate.h", - "gzclose.c", - "gzguts.h", - "gzlib.c", - "gzread.c", - "gzwrite.c", - "infback.c", - "inffast.c", - "inffast.h", - "inffixed.h", - "inflate.h", - "inftrees.c", - "inftrees.h", - "trees.c", - "trees.h", - "uncompr.c", - "zconf.h", - "zlib.h", - "zutil.c", - "zutil.h", - ] - - defines = [] - deps = [] - - if (!use_x86_x64_optimizations && !use_arm_neon_optimizations) { - # Apparently android_cronet bot builds with NEON disabled and - # we also should disable optimizations for iOS@x86 (a.k.a. simulator). - defines += [ "CPU_NO_SIMD" ] + public_deps = [ ":zlib_common_headers" ] } - if (is_ios) { - # iOS@ARM is a special case where we always have NEON but don't check - # for crypto extensions. - # TODO(cavalcantii): verify what is the current state of CPU features - # shipped on latest iOS devices. - defines += [ "ARM_OS_IOS" ] + config("zlib_warnings") { + if (is_clang) { + cflags = [ + "-Wno-deprecated-non-prototype", + "-Wno-incompatible-pointer-types", + "-Wunused-variable", + ] + } } - if (use_x86_x64_optimizations || use_arm_neon_optimizations) { - deps += [ - ":zlib_adler32_simd", - ":zlib_inflate_chunk_simd", - ":zlib_slide_hash_simd", + component("zlib") { + if (!is_win) { + # Don't stomp on "libzlib" on other platforms. + output_name = "chrome_zlib" + } + + sources = [ + "adler32.c", + "chromeconf.h", + "compress.c", + "contrib/optimizations/insert_string.h", + "cpu_features.c", + "cpu_features.h", + "crc32.c", + "crc32.h", + "deflate.c", + "deflate.h", + "gzclose.c", + "gzguts.h", + "gzlib.c", + "gzread.c", + "gzwrite.c", + "infback.c", + "inffast.c", + "inffast.h", + "inffixed.h", + "inflate.h", + "inftrees.c", + "inftrees.h", + "trees.c", + "trees.h", + "uncompr.c", + "zconf.h", + "zlib.h", + "zutil.c", + "zutil.h", ] - if (use_x86_x64_optimizations) { - deps += [ ":zlib_crc32_simd" ] - } else if (use_arm_neon_optimizations) { - deps += [ ":zlib_arm_crc32" ] + defines = [] + deps = [] + + if (!use_x86_x64_optimizations && !use_arm_neon_optimizations) { + # Apparently android_cronet bot builds with NEON disabled and + # we also should disable optimizations for iOS@x86 (a.k.a. simulator). + defines += [ "CPU_NO_SIMD" ] } - } else { - sources += [ "inflate.c" ] - } - if (is_android) { - import("//build/config/android/config.gni") - if (defined(android_ndk_root) && android_ndk_root != "") { - deps += [ "//third_party/android_ndk:cpu_features" ] + if (is_ios) { + # iOS@ARM is a special case where we always have NEON but don't check + # for crypto extensions. + # TODO(cavalcantii): verify what is the current state of CPU features + # shipped on latest iOS devices. + defines += [ "ARM_OS_IOS" ] + } + + if (use_x86_x64_optimizations || use_arm_neon_optimizations) { + deps += [ + ":zlib_adler32_simd", + ":zlib_inflate_chunk_simd", + ":zlib_slide_hash_simd", + ] + + if (use_x86_x64_optimizations) { + deps += [ ":zlib_crc32_simd" ] + } else if (use_arm_neon_optimizations) { + deps += [ ":zlib_arm_crc32" ] + } } else { - assert(false, "CPU detection requires the Android NDK") + sources += [ "inflate.c" ] } - } - configs -= [ "//build/config/compiler:chromium_code" ] - configs += [ "//build/config/compiler:no_chromium_code" ] + if (is_android) { + import("//build/config/android/config.gni") + if (defined(android_ndk_root) && android_ndk_root != "") { + deps += [ "//third_party/android_ndk:cpu_features" ] + } else { + assert(false, "CPU detection requires the Android NDK") + } + } + + configs -= [ "//build/config/compiler:chromium_code" ] + configs += [ "//build/config/compiler:no_chromium_code" ] - public_configs = [ ":zlib_config" ] + public_configs = [ ":zlib_config" ] - configs += [ - ":zlib_internal_config", + configs += [ + ":zlib_internal_config", - # Must be after no_chromium_code for warning flags to be ordered correctly. - ":zlib_warnings", - ] + # Must be after no_chromium_code for warning flags to be ordered correctly. + ":zlib_warnings", + ] - allow_circular_includes_from = deps + allow_circular_includes_from = deps + } +} else { + shim_headers("zlib_shim") { + root_path = "//zlib" + headers = [ "zlib.h" ] + } + source_set("zlib") { + deps = [ ":zlib_shim" ] + libs = [ "z" ] + public_configs = [ ":system_zlib" ] + } } -config("minizip_warnings") { - visibility = [ ":*" ] +if (!use_system_zlib) { + config("minizip_warnings") { + visibility = [ ":*" ] - if (is_clang) { - # zlib uses `if ((a == b))` for some reason. - cflags = [ "-Wno-parentheses-equality" ] + if (is_clang) { + cflags = [ + # zlib uses `if ((a == b))` for some reason. + "-Wno-parentheses-equality", + "-Wno-deprecated-non-prototype", + ] + } } -} -static_library("minizip") { - sources = [ - "contrib/minizip/ioapi.c", - "contrib/minizip/ioapi.h", - "contrib/minizip/iowin32.c", - "contrib/minizip/iowin32.h", - "contrib/minizip/unzip.c", - "contrib/minizip/unzip.h", - "contrib/minizip/zip.c", - "contrib/minizip/zip.h", - ] - - if (!is_win) { - sources -= [ + static_library("minizip") { + sources = [ + "contrib/minizip/ioapi.c", + "contrib/minizip/ioapi.h", "contrib/minizip/iowin32.c", "contrib/minizip/iowin32.h", + "contrib/minizip/unzip.c", + "contrib/minizip/unzip.h", + "contrib/minizip/zip.c", + "contrib/minizip/zip.h", ] - } - if (is_apple || is_android || is_nacl) { - # Mac, Android and the BSDs don't have fopen64, ftello64, or fseeko64. We - # use fopen, ftell, and fseek instead on these systems. - defines = [ "USE_FILE32API" ] - } + if (!is_win) { + sources -= [ + "contrib/minizip/iowin32.c", + "contrib/minizip/iowin32.h", + ] + } + + if (is_apple || is_android || is_nacl) { + # Mac, Android and the BSDs don't have fopen64, ftello64, or fseeko64. We + # use fopen, ftell, and fseek instead on these systems. + defines = [ "USE_FILE32API" ] + } - deps = [ ":zlib" ] + deps = [ ":zlib" ] - configs -= [ "//build/config/compiler:chromium_code" ] - configs += [ "//build/config/compiler:no_chromium_code" ] + configs -= [ "//build/config/compiler:chromium_code" ] + configs += [ "//build/config/compiler:no_chromium_code" ] - public_configs = [ ":zlib_config" ] + public_configs = [ ":zlib_config" ] - configs += [ - # Must be after no_chromium_code for warning flags to be ordered correctly. - ":minizip_warnings", - ] + configs += [ + # Must be after no_chromium_code for warning flags to be ordered correctly. + ":minizip_warnings", + ] + } +} else { + shim_headers("minizip_shim") { + root_path = "contrib" + headers = [ + "minizip/crypt.h", + "minizip/ioapi.h", + "minizip/iowin32.h", + "minizip/mztools.h", + "minizip/unzip.h", + "minizip/zip.h", + ] + } + source_set("minizip") { + deps = [ ":minizip_shim" ] + libs = [ "minizip" ] + } } -executable("zlib_bench") { - include_dirs = [ "." ] +if (!use_system_zlib) { + executable("zlib_bench") { + include_dirs = [ "." ] - sources = [ "contrib/bench/zlib_bench.cc" ] - if (!is_debug) { - configs -= [ "//build/config/compiler:default_optimization" ] - configs += [ "//build/config/compiler:optimize_speed" ] - } + sources = [ "contrib/bench/zlib_bench.cc" ] + if (!is_debug) { + configs -= [ "//build/config/compiler:default_optimization" ] + configs += [ "//build/config/compiler:optimize_speed" ] + } - deps = [ ":zlib" ] + deps = [ ":zlib" ] - configs -= [ "//build/config/compiler:chromium_code" ] - configs += [ "//build/config/compiler:no_chromium_code" ] + configs -= [ "//build/config/compiler:chromium_code" ] + configs += [ "//build/config/compiler:no_chromium_code" ] + } } if (!is_win || target_os != "winuwp") { @@ -432,7 +487,11 @@ if (!is_win || target_os != "winuwp") { sources = [ "contrib/minizip/minizip.c" ] if (is_clang) { - cflags = [ "-Wno-incompatible-pointer-types-discards-qualifiers" ] + cflags = [ + "-Wno-incompatible-pointer-types-discards-qualifiers", + + "-Wno-deprecated-non-prototype", + ] } if (!is_debug) { @@ -452,7 +511,10 @@ if (!is_win || target_os != "winuwp") { sources = [ "contrib/minizip/miniunz.c" ] if (is_clang) { - cflags = [ "-Wno-incompatible-pointer-types-discards-qualifiers" ] + cflags = [ + "-Wno-incompatible-pointer-types-discards-qualifiers", + "-Wno-deprecated-non-prototype", + ] } if (!is_debug) { diff --git a/third_party/zlib/system.gni b/third_party/zlib/system.gni new file mode 100644 index 0000000..74604f9 --- /dev/null +++ b/third_party/zlib/system.gni @@ -0,0 +1,11 @@ +# Copyright 2023 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# Separate file, so unbundle toolchains that replace gn files +# can replace just this file and override the default +declare_args() { + # If true, find zlib and use as shared libraries. + # Useful for Linux distribution repository builds. + use_system_zlib = false +}