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

if (!crashpad_is_ios) {
  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:starboard_group",
      ]
    }

    if (crashpad_is_in_native_target_build) {
      configs = [ "../build:native_target_executable_config" ]
    }
  }

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