# Copyright 2015 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/buildflag_header.gni")

declare_args() {
  # If set to true, this will stub out and disable the entire crash key system.
  use_crash_key_stubs = is_fuchsia
}

group("common") {
  public_deps = [
    ":crash_key",
    ":crash_key_utils",
  ]

  if (is_mac || is_ios) {
    public_deps += [ ":zombies" ]
  }
}

use_crashpad_annotation = (is_mac || is_win) && !use_crash_key_stubs

buildflag_header("crash_buildflags") {
  header = "crash_buildflags.h"
  flags = [
    "USE_CRASHPAD_ANNOTATION=$use_crashpad_annotation",
    "USE_CRASH_KEY_STUBS=$use_crash_key_stubs",
  ]
}

# Crashpad's annotation system can store data on a per-module basis (i.e.,
# in different shared libraries in the component build) without issue. The
# Breakpad implementation uses a static global variable, so ensure there is
# only one instance of the symbol in the component build by making this
# target a component.
if (use_crash_key_stubs || use_crashpad_annotation) {
  crash_key_target_type = "static_library"
} else {
  crash_key_target_type = "component"
}
target(crash_key_target_type, "crash_key") {
  sources = [
    "crash_export.h",
    "crash_key.cc",
    "crash_key.h",
    "crash_key_base_support.cc",
    "crash_key_base_support.h",
  ]

  defines = []

  # This target is not always a component, depending on the implementation.
  # When it is not a component, annotating functions with the standard
  # CRASH_EXPORT macro causes linking errors on Windows (clients of this target
  # expect it to be dllimport but it is linked statically). Instead, provide a
  # wrapper macro CRASH_KEY_EXPORT that only evaluates to CRASH_EXPORT if this
  # target is really a component.
  if (crash_key_target_type == "component") {
    defines += [
      "CRASH_KEY_EXPORT=CRASH_EXPORT",
      "CRASH_CORE_COMMON_IMPLEMENTATION",
    ]
  }

  deps = [
    ":crash_buildflags",
    "//base",
  ]

  if (use_crash_key_stubs) {
    sources += [ "crash_key_stubs.cc" ]
  } else if (use_crashpad_annotation) {
    sources += [ "crash_key_crashpad.cc" ]
    deps += [ "//third_party/crashpad/crashpad/client" ]
  } else {
    include_dirs = [ "//third_party/breakpad/breakpad/src" ]

    if (is_ios) {
      sources += [ "crash_key_breakpad_ios.mm" ]

      configs += [ "//build/config/compiler:enable_arc" ]
    } else {
      sources += [
        "crash_key_breakpad.cc",
        "crash_key_internal.h",
      ]
    }

    deps += [ "//third_party/breakpad:client" ]
  }
}

static_library("crash_key_utils") {
  visibility = [ ":*" ]

  sources = [
    "crash_keys.cc",
    "crash_keys.h",
  ]

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

if (is_mac || is_ios) {
  component("zombies") {
    visibility = [ ":common" ]

    sources = [
      "objc_zombie.h",
      "objc_zombie.mm",
    ]

    defines = [ "CRASH_CORE_COMMON_IMPLEMENTATION" ]

    deps = [
      ":crash_key",
      "//base",
    ]

    libs = [ "Foundation.framework" ]
  }
}

source_set("unit_tests") {
  testonly = true
  sources = [
    "crash_key_unittest.cc",
    "crash_keys_unittest.cc",
  ]

  deps = [
    ":common",
    "//base",
    "//testing/gtest",
  ]

  if (is_mac || is_ios) {
    sources += [ "objc_zombie_unittest.mm" ]
  }

  if (!is_mac && !is_win && !is_fuchsia) {
    include_dirs = [ "//third_party/breakpad/breakpad/src/" ]
    sources += [ "crash_key_breakpad_unittest.cc" ]
  }

  if (is_fuchsia) {
    sources -= [ "crash_key_unittest.cc" ]
  }
}
