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

# 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

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