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

source_set("tool_support") {
  check_includes = false

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

  public_configs = [ "..:crashpad_config" ]

  deps = [ "../third_party/mini_chromium:base" ]

  if (crashpad_is_in_native_target_build) {
    configs -= [ "//build/config/compiler:default_include_dirs" ]
  }
}

# TODO(b/251521595): resolve GN error and enable this target to be built for
# android.
if (!crashpad_is_ios && !crashpad_is_android) {
  crashpad_executable("crashpad_database_util") {
    check_includes = !crashpad_is_in_starboard && !crashpad_is_in_native_target_build

    sources = [ "crashpad_database_util.cc" ]

    deps = [
      ":tool_support",
      "../build:default_exe_manifest_win",
      "../client",
      "../compat",
      "../third_party/mini_chromium:base",
      "../util",
    ]

    if (crashpad_is_in_starboard) {
      deps += [
        "//starboard",
      ]
    }
  }

  if (!crashpad_is_in_starboard && !crashpad_is_in_native_target_build) {
    crashpad_executable("crashpad_http_upload") {
      sources = [ "crashpad_http_upload.cc" ]

      deps = [
        ":tool_support",
        "../build:default_exe_manifest_win",
        "../compat",
        "../third_party/mini_chromium:base",
        "../util",
      ]
    }
  }
}

if (!crashpad_is_in_starboard && !crashpad_is_in_native_target_build) {
  crashpad_executable("base94_encoder") {
    sources = [ "base94_encoder.cc" ]
    deps = [
      ":tool_support",
      "../build:default_exe_manifest_win",
      "../third_party/mini_chromium:base",
      "../util",
    ]
  }
}

if (!crashpad_is_fuchsia && !crashpad_is_ios && !crashpad_is_in_starboard
    && !crashpad_is_in_native_target_build) {
  crashpad_executable("generate_dump") {
    sources = [ "generate_dump.cc" ]

    deps = [
      ":tool_support",
      "../build:default_exe_manifest_win",
      "../compat",
      "../minidump",
      "../snapshot",
      "../third_party/mini_chromium:base",
      "../util",
    ]

    if (crashpad_is_mac) {
      # This would be better as a config so that it could be shared with
      # exception_port_tool, but configs can’t alter “inputs”.
      # https://crbug.com/781858.
      inputs = [ "mac/sectaskaccess_info.plist" ]
      ldflags = [
        "-sectcreate",
        "__TEXT",
        "__info_plist",
        rebase_path(inputs[0], root_build_dir),
      ]
    }

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

if (crashpad_is_mac || crashpad_is_fuchsia) {
  crashpad_executable("run_with_crashpad") {
    sources = [ "run_with_crashpad.cc" ]

    deps = [
      ":tool_support",
      "../client",
      "../compat",
      "../third_party/mini_chromium:base",
      "../util",
    ]
  }
}

if (crashpad_is_mac) {
  crashpad_executable("catch_exception_tool") {
    sources = [ "mac/catch_exception_tool.cc" ]

    deps = [
      ":tool_support",
      "../compat",
      "../third_party/mini_chromium:base",
      "../util",
    ]
  }

  crashpad_executable("exception_port_tool") {
    sources = [ "mac/exception_port_tool.cc" ]

    # This would be better as a config so that it could be shared with
    # generate_dump, but configs can’t alter “inputs”. https://crbug.com/781858.
    inputs = [ "mac/sectaskaccess_info.plist" ]
    ldflags = [
      "-sectcreate",
      "__TEXT",
      "__info_plist",
      rebase_path(inputs[0], root_build_dir),
    ]

    deps = [
      ":tool_support",
      "../compat",
      "../third_party/mini_chromium:base",
      "../util",
    ]
  }

  crashpad_executable("on_demand_service_tool") {
    sources = [ "mac/on_demand_service_tool.mm" ]

    libs = [
      "CoreFoundation.framework",
      "Foundation.framework",
    ]

    deps = [
      ":tool_support",
      "../compat",
      "../third_party/mini_chromium:base",
      "../util",
    ]
  }
}
