# Copyright 2015 The Crashpad Authors. All rights reserved.
#
# 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")

static_library("client") {
  sources = [
    "annotation.cc",
    "annotation.h",
    "annotation_list.cc",
    "annotation_list.h",
    "crash_report_database.cc",
    "crash_report_database.h",
    "crashpad_client.h",
    "crashpad_info.cc",
    "crashpad_info.h",
    "prune_crash_reports.cc",
    "prune_crash_reports.h",
    "settings.cc",
    "settings.h",
    "simple_address_range_bag.h",
    "simple_string_dictionary.h",
    "simulate_crash.h",
  ]

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

  if (crashpad_is_ios) {
    sources += [
      "crash_report_database_mac.mm",
      "crashpad_client_ios.cc",
    ]
  }

  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",
      "crashpad_info_note.S",
    ]
  }

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

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

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

  public_configs = [ "..:crashpad_config" ]

  public_deps = [
    "../third_party/mini_chromium:base",
    "../util",
  ]

  if (crashpad_is_in_starboard) {
    public_deps += [ "//starboard/elf_loader:evergreen_info" ]
  }

  deps = []

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

  # TODO(justincohen): Temporary dependency to bring up the iOS client.
  if (crashpad_is_ios) {
    deps += [
      "../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 += [ "//zircon/public/lib/fdio" ]
    }
  }
}

if (!crashpad_is_in_starboard) {
  source_set("client_test") {
    testonly = true

    sources = [
      "annotation_list_test.cc",
      "annotation_test.cc",
      "crash_report_database_test.cc",
      "prune_crash_reports_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.cc" ]
      sources -= [
        "annotation_list_test.cc",
        "annotation_test.cc",
        "crash_report_database_test.cc",
        "prune_crash_reports_test.cc",
        "settings_test.cc",
      ]
    }

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

    deps = [
      ":client",
      "../compat",
      "../snapshot",
      "../test",
      "../third_party/gtest:gmock",
      "../third_party/gtest:gtest",
      "../third_party/mini_chromium:base",
      "../util",
    ]

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

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