# Copyright 2015 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")

crashpad_static_library("client") {
  sources = [
    "crashpad_client.h",
    "prune_crash_reports.cc",
    "prune_crash_reports.h",
    "simulate_crash.h",
  ]

  if (crashpad_is_mac) {
    sources += [
      "crashpad_client_mac.cc",
      "simulate_crash_mac.cc",
      "simulate_crash_mac.h",
    ]
  }

  if (crashpad_is_ios) {
    sources += [
      "crashpad_client_ios.cc",
      "ios_handler/exception_processor.h",
      "ios_handler/exception_processor.mm",
      "ios_handler/in_process_handler.cc",
      "ios_handler/in_process_handler.h",
      "ios_handler/in_process_intermediate_dump_handler.cc",
      "ios_handler/in_process_intermediate_dump_handler.h",
      "ios_handler/prune_intermediate_dumps_and_crash_reports_thread.cc",
      "ios_handler/prune_intermediate_dumps_and_crash_reports_thread.h",
      "simulate_crash_ios.h",
      "upload_behavior_ios.h",
    ]
  }

  if (crashpad_is_linux || crashpad_is_android) {
    sources += [
      "crashpad_client_linux.cc",
      "simulate_crash_linux.h",
    ]
  }

  if (crashpad_is_linux || crashpad_is_android || crashpad_is_fuchsia) {
    sources += [
      "client_argv_handling.cc",
      "client_argv_handling.h",
    ]
  }

  if (crashpad_is_win) {
    sources += [
      "crashpad_client_win.cc",
      "simulate_crash_win.h",
    ]
  }

  if (crashpad_is_fuchsia) {
    sources += [ "crashpad_client_fuchsia.cc" ]
  }

  public_configs = [ "..:crashpad_config" ]

  public_deps = [
    ":common",
    "$mini_chromium_source_parent:base",
    "../util",
  ]

  deps = [
    ":common",
    "$mini_chromium_source_parent:chromeos_buildflags",
  ]

  if (crashpad_is_win) {
    libs = [ "rpcrt4.lib" ]
    cflags = [ "/wd4201" ]  # nonstandard extension used : nameless struct/union
  }

  if (crashpad_is_ios) {
    deps += [
      "../handler:common",
      "../minidump",
      "../snapshot",
    ]
  }

  if (crashpad_is_linux || crashpad_is_android) {
    deps += [ "../third_party/lss" ]
  }

  if (crashpad_is_fuchsia) {
    deps += [ "../third_party/fuchsia" ]
    if (crashpad_is_in_fuchsia) {
      deps += [ "//sdk/lib/fdio" ]
    }
  }
}

static_library("common") {
  sources = [
    "annotation.cc",
    "annotation.h",
    "annotation_list.cc",
    "annotation_list.h",
    "crash_report_database.cc",
    "crash_report_database.h",
    "crashpad_info.cc",
    "crashpad_info.h",
    "length_delimited_ring_buffer.h",
    "ring_buffer_annotation.h",
    "settings.cc",
    "settings.h",
    "simple_address_range_bag.h",
    "simple_string_dictionary.h",
  ]

  if (crashpad_is_mac || crashpad_is_ios) {
    sources += [ "crash_report_database_mac.mm" ]
  }
  if (crashpad_is_win) {
    sources += [ "crash_report_database_win.cc" ]
  }
  if (crashpad_is_linux || crashpad_is_android || crashpad_is_fuchsia) {
    sources += [
      "crash_report_database_generic.cc",
      "crashpad_info_note.S",
    ]
  }

  public_configs = [ "..:crashpad_config" ]
  public_deps = [
    "$mini_chromium_source_parent:base",
    "../util",
  ]
  deps = [ "../util" ]
  configs += [ "../build:flock_always_supported_defines" ]
}

crashpad_executable("ring_buffer_annotation_load_test") {
  testonly = true
  sources = [
    "ring_buffer_annotation_load_test_main.cc",
  ]
  deps = [
    ":client",
    "../tools:tool_support",
    "$mini_chromium_source_parent:base",
  ]
}

source_set("client_test") {
  testonly = true

  sources = [
    "annotation_list_test.cc",
    "annotation_test.cc",
    "crash_report_database_test.cc",
    "length_delimited_ring_buffer_test.cc",
    "prune_crash_reports_test.cc",
    "ring_buffer_annotation_test.cc",
    "settings_test.cc",
    "simple_address_range_bag_test.cc",
    "simple_string_dictionary_test.cc",
  ]

  if (crashpad_is_mac) {
    sources += [ "simulate_crash_mac_test.cc" ]
  }

  if (crashpad_is_win) {
    sources += [ "crashpad_client_win_test.cc" ]
  }

  if (crashpad_is_ios) {
    sources += [
      "crashpad_client_ios_test.mm",
      "ios_handler/exception_processor_test.mm",
      "ios_handler/in_process_handler_test.cc",
      "ios_handler/in_process_intermediate_dump_handler_test.cc",
    ]
  }

  if (crashpad_is_linux || crashpad_is_android) {
    sources += [ "crashpad_client_linux_test.cc" ]
  }

  deps = [
    ":client",
    "$mini_chromium_source_parent:base",
    "../compat",
    "../snapshot",
    "../test",
    "../third_party/googletest:googlemock",
    "../third_party/googletest:googletest",
    "../util",
  ]

  if (!crashpad_is_ios && !crashpad_is_fuchsia) {
    data_deps = [ "../handler:crashpad_handler" ]
  }

  if (crashpad_is_win) {
    data_deps += [
      "../handler:crashpad_handler_console",
      "../handler/win/wer:crashpad_wer_handler",
    ]
  }
}

if (crashpad_is_linux || crashpad_is_android) {
  source_set("pthread_create") {
    sources = [ "pthread_create_linux.cc" ]

    deps = [ ":client" ]
  }
}
