# Copyright (c) 2013 The Chromium Authors. All rights reserved.
# 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")
if (current_cpu == "arm" || current_cpu == "arm64") {
  import("//build/config/arm.gni")
}

config("zlib_config") {
  include_dirs = [ "." ]
}

config("zlib_internal_config") {
  defines = [ "ZLIB_IMPLEMENTATION" ]
}

use_arm_neon_optimizations = false
if (current_cpu == "arm" || current_cpu == "arm64") {
  if (arm_use_neon) {
    use_arm_neon_optimizations = true
  }
}

# TODO(b/206642994): look into whether we should condition on the
# floating_point_fpu SABI variable, rather than sb_is_evergreen, here as we did
# in third_party/zlib/zlib.gyp.
if (is_starboard && sb_is_evergreen && use_arm_neon_optimizations) {
  config("zlib_neon_fpu_config") {
    cflags = [ "-mfpu=neon" ]
    asmflags = cflags
  }
}

use_x86_x64_optimizations =
    (current_cpu == "x86" || current_cpu == "x64") && !is_ios

config("zlib_adler32_simd_config") {
  if (use_x86_x64_optimizations) {
    defines = [ "ADLER32_SIMD_SSSE3" ]
  }

  if (use_arm_neon_optimizations) {
    defines = [ "ADLER32_SIMD_NEON" ]
  }
}

source_set("zlib_adler32_simd") {
  visibility = [ ":*" ]

  if (use_x86_x64_optimizations) {
    sources = [
      "adler32_simd.c",
      "adler32_simd.h",
    ]

    if (!is_win || is_clang) {
      cflags = [ "-mssse3" ]
    }
  }

  if (use_arm_neon_optimizations) {
    sources = [
      "adler32_simd.c",
      "adler32_simd.h",
    ]

    if (!is_debug) {
      # Use optimize_speed (-O3) to output the _smallest_ code.
      if(!is_starboard) {
        configs -= [ "//build/config/compiler:default_optimization" ]
      }
      configs += [ "//build/config/compiler:optimize_speed" ]
    }
  }

  configs += [ ":zlib_internal_config" ]
  if (is_starboard && !is_debug) {
    configs -= [ "//starboard/build/config:size" ]
    configs += [ "//starboard/build/config:speed" ]
  }

  if (is_starboard && sb_is_evergreen && use_arm_neon_optimizations) {
    configs += [ ":zlib_neon_fpu_config" ]
  }

  public_configs = [ ":zlib_adler32_simd_config" ]
}

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 && arm_version >= 8) {
      defines = [ "CRC32_ARMV8_CRC32" ]
      if (is_android) {
        defines += [ "ARMV8_OS_ANDROID" ]
      } else if (is_linux || is_chromeos) {
        defines += [ "ARMV8_OS_LINUX" ]
      } else if (is_fuchsia) {
        defines += [ "ARMV8_OS_FUCHSIA" ]
      } else if (is_win) {
        defines += [ "ARMV8_OS_WINDOWS" ]
      } else {
        assert(is_starboard, "Unsupported ARM OS")
      }
    }
  }

  source_set("zlib_arm_crc32") {
    visibility = [ ":*" ]

    if (!is_ios) {
      include_dirs = [ "." ]

      if (!is_starboard && 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")
        }
      } else if (!is_win && !is_clang) {
        assert(!use_thin_lto,
               "ThinLTO fails mixing different module-level targets")
        cflags_c = [ "-march=armv8-a+crc" ]
      }

      sources = [
        "arm_features.c",
        "arm_features.h",
        "crc32_simd.c",
        "crc32_simd.h",
      ]

      if (is_starboard && use_arm_neon_optimizations) {
        sources += [
          "contrib/optimizations/slide_hash_neon.c",
          "contrib/optimizations/slide_hash_neon.h",
        ]
      }

      if (!is_debug) {
        if(!is_starboard) {
          configs -= [ "//build/config/compiler:default_optimization" ]
        }
        configs += [ "//build/config/compiler:optimize_speed" ]
      }
    }

    configs += [ ":zlib_internal_config" ]
    if (is_starboard && !is_debug) {
      configs -= [ "//starboard/build/config:size" ]
      configs += [ "//starboard/build/config:speed" ]
    }
    if (is_starboard) {
      deps = [ "//starboard:starboard_headers_only" ]
    }

    if (is_starboard && sb_is_evergreen && use_arm_neon_optimizations) {
      configs += [ ":zlib_neon_fpu_config" ]
    }

    public_configs = [ ":zlib_arm_crc32_config" ]
  }
}

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) {
    defines = [ "INFLATE_CHUNK_SIMD_NEON" ]
    if (current_cpu == "arm64") {
      defines += [ "INFLATE_CHUNK_READ_64LE" ]
    }
  }
}

source_set("zlib_inflate_chunk_simd") {
  visibility = [ ":*" ]

  if (use_x86_x64_optimizations || use_arm_neon_optimizations) {
    include_dirs = [ "." ]

    sources = [
      "contrib/optimizations/chunkcopy.h",
      "contrib/optimizations/inffast_chunk.c",
      "contrib/optimizations/inffast_chunk.h",
      "contrib/optimizations/inflate.c",
    ]

    if (!is_win && is_starboard) {
      cflags_c = [ "-Wno-unused-function" ]
    }

    if (use_arm_neon_optimizations && !is_debug) {
      # Here we trade better performance on newer/bigger ARMv8 cores
      # for less perf on ARMv7, per crbug.com/772870#c40
      if(!is_starboard) {
        configs -= [ "//build/config/compiler:default_optimization" ]
      }
      configs += [ "//build/config/compiler:optimize_speed" ]
    }
  }

  if (!is_starboard) {
    configs -= [ "//build/config/compiler:chromium_code" ]
  }
  configs += [
    ":zlib_internal_config",
    "//build/config/compiler:no_chromium_code",
  ]
  if (is_starboard && !is_debug) {
    configs -= [ "//starboard/build/config:size" ]
    configs += [ "//starboard/build/config:speed" ]
  }

  if (is_starboard && sb_is_evergreen && use_arm_neon_optimizations) {
    configs += [ ":zlib_neon_fpu_config" ]
  }

  public_configs = [ ":zlib_inflate_chunk_simd_config" ]
}

config("zlib_crc32_simd_config") {
  if (use_x86_x64_optimizations) {
    defines = [ "CRC32_SIMD_SSE42_PCLMUL" ]
  }
}

source_set("zlib_crc32_simd") {
  visibility = [ ":*" ]

  if (use_x86_x64_optimizations) {
    sources = [
      "crc32_simd.c",
      "crc32_simd.h",
    ]

    if (!is_win || is_clang) {
      cflags = [
        "-msse4.2",
        "-mpclmul",
      ]
    }
  }

  configs += [ ":zlib_internal_config" ]

  public_configs = [ ":zlib_crc32_simd_config" ]
}

source_set("zlib_x86_simd") {
  visibility = [ ":*" ]

  if (use_x86_x64_optimizations) {
    sources = [
      "crc_folding.c",
      "fill_window_sse.c",
    ]

    if (!is_win || is_clang) {
      cflags = [
        "-msse4.2",
        "-mpclmul",
      ]
    }
  } else {
    sources = [
      "simd_stub.c",
    ]
  }

  if (!is_starboard) {
    configs -= [ "//build/config/compiler:chromium_code" ]
  }
  configs += [
    ":zlib_internal_config",
    "//build/config/compiler:no_chromium_code",
  ]
}

config("zlib_warnings") {
  if (is_clang && use_x86_x64_optimizations) {
    cflags = [ "-Wno-incompatible-pointer-types" ]
  }
}

component("zlib_hidden") {
  if (!is_win) {
    # Don't stomp on "libzlib" on other platforms.
    output_name = "chrome_zlib"
  }

  sources = [
    "adler32.c",
    "chromeconf.h",
    "compress.c",
    "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",
    "x86.h",
    "zconf.h",
    "zlib.h",
    "zutil.c",
    "zutil.h",
  ]

  defines = []
  deps = []
  cflags_c = []

  if (use_x86_x64_optimizations || use_arm_neon_optimizations) {
    deps += [
      ":zlib_adler32_simd",
      ":zlib_inflate_chunk_simd",
    ]

    if (use_x86_x64_optimizations) {
      sources += [
        "arm_stub.c",
        "x86.c",
      ]
      if (!is_win) {
        cflags_c += [ "-Wno-missing-braces" ]
      }
      deps += [ ":zlib_crc32_simd" ]
    } else if (use_arm_neon_optimizations) {
      if (!is_starboard) {
        # The slide_hash_neon sources are moved to zlib_arm_crc32 so that they
        # can be compiled with ARM NEON support.
        sources += [
          "contrib/optimizations/slide_hash_neon.c",
          "contrib/optimizations/slide_hash_neon.h",
        ]
      }
      deps += [ ":zlib_arm_crc32" ]
    }
  } else {
    sources += [
      "arm_stub.c",
      "inflate.c",
    ]
  }

  if (is_starboard) {
    check_includes = false
    sources += [ "inflate.c" ]
    sources -= [
      "gzclose.c",
      "gzguts.h",
      "gzlib.c",
      "gzread.c",
      "gzwrite.c",
    ]
  } else {
    configs -= [ "//build/config/compiler:chromium_code" ]
  }
  configs += [
    ":zlib_internal_config",
    "//build/config/compiler:no_chromium_code",

    # Must be after no_chromium_code for warning flags to be ordered correctly.
    ":zlib_warnings",
  ]

  public_configs = [ ":zlib_config" ]

  deps += [ ":zlib_x86_simd" ]
  allow_circular_includes_from = deps
}

if (is_starboard) {
  config("zlib_all_dependent_config") {
    # To prevent Zlib ever from redefining const keyword in zconf.h
    defines = [ "STDC" ]
  }

  group("zlib") {
    all_dependent_configs = [":zlib_all_dependent_config" ]
    public_deps = [ ":zlib_hidden" ]
  }
}

config("minizip_warnings") {
  visibility = [ ":*" ]

  if (is_clang) {
    # zlib uses `if ((a == b))` for some reason.
    cflags = [ "-Wno-parentheses-equality" ]
  }
}

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 -= [
      "contrib/minizip/iowin32.c",
      "contrib/minizip/iowin32.h",
    ]
  }

  if (is_mac || is_ios || 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",
  ]

  if (is_starboard) {
    sources += [
      "contrib/minizip/iostarboard.c",
      "contrib/minizip/iostarboard.h",
    ]
    deps += [ "//starboard:starboard_headers_only" ]
  } else {
    configs -= [ "//build/config/compiler:chromium_code" ]
  }
  configs += [
    "//build/config/compiler:no_chromium_code",

    # Must be after no_chromium_code for warning flags to be ordered correctly.
    ":minizip_warnings",
  ]

  public_configs = [ ":zlib_config" ]
}

if (!is_starboard) {
  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" ]
    }

    if (!is_starboard) {
      configs -= [ "//build/config/compiler:chromium_code" ]
    }
    configs += [ "//build/config/compiler:no_chromium_code" ]

    deps = [
      ":zlib",
    ]
  }
}

static_library("zip") {
  sources = [
    "google/zip.cc",
    "google/zip.h",
    "google/zip_internal.cc",
    "google/zip_internal.h",
    "google/zip_reader.cc",
    "google/zip_reader.h",
    "google/zip_writer.cc",
    "google/zip_writer.h",
  ]

  deps = [
    ":minizip",
    "//base",
  ]
}

target(gtest_target_type, "zip_unittests") {
  testonly = true

  sources = [
    "google/compression_utils_unittest.cc",
    "google/zip_reader_unittest.cc",
    "google/zip_unittest.cc",
    "google/compression_utils.cc",
    "google/compression_utils.h",
    "google/compression_utils_portable.cc",
    "google/compression_utils_portable.h",
  ]

  deps = [
    ":minizip",
    ":zip",
    ":zlib",
    "//base/test:run_all_unittests",
    "//base/test:test_support",
    "//starboard/common",
    "//testing/gmock",
    "//testing/gtest",
    "//third_party/zlib/google/test:zip_unittest_files",
  ]

  if (is_starboard) {
    configs -= [ "//starboard/build/config:size" ]
    configs += [ "//starboard/build/config:speed" ]

    content_deps = [ "//third_party/icu:icudata", "//third_party/zlib/google/test:zip_unittest_files" ]
  }
}
