# Copyright 2017 The Crashpad Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import("../../build/crashpad_buildconfig.gni")

if (crashpad_is_in_chromium || crashpad_is_in_fuchsia || crashpad_is_in_dart) {
  zlib_source = "external"
} else if (!crashpad_is_win && !crashpad_is_fuchsia) {
  zlib_source = "system"
} else if (crashpad_is_standalone) {
  zlib_source = "embedded"
} else if (crashpad_is_external) {
  zlib_source = "external_with_embedded_build"
}

config("zlib_config") {
  if (zlib_source == "external") {
    defines = [ "CRASHPAD_ZLIB_SOURCE_EXTERNAL" ]
  } else if (zlib_source == "system") {
    defines = [ "CRASHPAD_ZLIB_SOURCE_SYSTEM" ]
  } else if (zlib_source == "embedded") {
    defines = [ "CRASHPAD_ZLIB_SOURCE_EMBEDDED" ]
    include_dirs = [ "zlib" ]
  } else if (zlib_source == "external_with_embedded_build") {
    defines = [ "CRASHPAD_ZLIB_SOURCE_EXTERNAL_WITH_EMBEDDED_BUILD" ]
    include_dirs = [ "../../../../zlib/src" ]
  }
}

if (zlib_source == "external") {
  group("zlib") {
    public_configs = [ ":zlib_config" ]
    public_deps = [ "//third_party/zlib" ]
  }
} else if (zlib_source == "system") {
  source_set("zlib") {
    public_configs = [ ":zlib_config" ]
    libs = [ "z" ]
  }
} else if (zlib_source == "embedded" ||
           zlib_source == "external_with_embedded_build") {
  static_library("zlib") {
    if (zlib_source == "embedded") {
      zlib_dir = "zlib"
    } else if (zlib_source == "external_with_embedded_build") {
      zlib_dir = "../../../../zlib/src"
    }
    sources = [
      "$zlib_dir/adler32.c",
      "$zlib_dir/compress.c",
      "$zlib_dir/crc32.c",
      "$zlib_dir/crc32.h",
      "$zlib_dir/deflate.c",
      "$zlib_dir/deflate.h",
      "$zlib_dir/gzclose.c",
      "$zlib_dir/gzguts.h",
      "$zlib_dir/gzlib.c",
      "$zlib_dir/gzread.c",
      "$zlib_dir/gzwrite.c",
      "$zlib_dir/infback.c",
      "$zlib_dir/inffast.c",
      "$zlib_dir/inffast.h",
      "$zlib_dir/inffixed.h",
      "$zlib_dir/inflate.c",
      "$zlib_dir/inflate.h",
      "$zlib_dir/inftrees.c",
      "$zlib_dir/inftrees.h",
      "$zlib_dir/trees.c",
      "$zlib_dir/trees.h",
      "$zlib_dir/uncompr.c",
      "$zlib_dir/zconf.h",
      "$zlib_dir/zlib.h",
      "$zlib_dir/zutil.c",
      "$zlib_dir/zutil.h",
      "zlib_crashpad.h",
    ]

    cflags = []
    defines = [ "HAVE_STDARG_H" ]
    public_configs = [ ":zlib_config" ]

    if (crashpad_is_win) {
      cflags += [
        "/wd4131",  # uses old-style declarator
        "/wd4244",  # conversion from 't1' to 't2', possible loss of data
        "/wd4245",  # conversion from 't1' to 't2', signed/unsigned mismatch
        "/wd4267",  # conversion from 'size_t' to 't', possible loss of data
        "/wd4324",  # structure was padded due to alignment specifier
        "/wd4702",  # unreachable code
      ]
      if (current_cpu == "arm64" && !crashpad_is_clang) {
        # Select code path for clang in zlib to avoid using MSVC x86/x64
        # intrinsics for Windows ARM64.
        # TODO: https://crashpad.chromium.org/bug/267
        defines += [ "__clang__" ]
      }
    } else {
      defines += [
        "HAVE_HIDDEN",
        "HAVE_UNISTD_H",
      ]
    }

    if (crashpad_is_standalone) {
      configs -= [ "//third_party/mini_chromium/mini_chromium/build/config:Wimplicit_fallthrough" ]
    } else if (crashpad_is_external) {
      configs -= [ "//../../mini_chromium/mini_chromium/build/config:Wimplicit_fallthrough" ]
    }

    if (zlib_source == "embedded") {
      sources += [ "$zlib_dir/names.h" ]

      if (current_cpu == "x86" || current_cpu == "x64") {
        sources += [
          "$zlib_dir/crc_folding.c",
          "$zlib_dir/fill_window_sse.c",
          "$zlib_dir/x86.c",
          "$zlib_dir/x86.h",
        ]
        if (!crashpad_is_win || crashpad_is_clang) {
          cflags += [
            "-msse4.2",
            "-mpclmul",
          ]
        }
        if (crashpad_is_clang) {
          cflags += [ "-Wno-incompatible-pointer-types" ]
        }
      } else {
        sources += [ "$zlib_dir/simd_stub.c" ]
      }
    }
  }
}
