# 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 += [
      "crash_handler_base_ios.cc",
      "crash_handler_base_ios.h",
      "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_tvos) {
      sources += [
        "crash_handler_ios.cc",
        "crash_handler_ios.h",
      ]
    } else {
      sources += [
        "crash_handler_tvos.cc",
        "crash_handler_tvos.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" ]

  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",
    "../third_party/googletest:googlemock",
    "../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_ios) {
    deps += [ "../minidump" ]
  }
}

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

    deps = [ ":client" ]
  }
}
