# 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_apple) {
    deps += [ "../build:apple_enable_arc" ]
  }

  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_apple) {
    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" ]

  if (crashpad_is_apple) {
    deps += [ "../build:apple_enable_arc" ]
  }
}

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

source_set("client_test") {
  testonly = true

  sources = [
    "annotation_list_test.cc",
    "annotation_test.cc",
    "crash_report_database_test.cc",
    "crashpad_info_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_apple) {
    deps += [ "../build:apple_enable_arc" ]
  }

  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" ]
  }
}
