# Copyright 2017 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.

declare_args() {
  # Determines various flavors of build configuration, and which concrete
  # targets to use for dependencies. Valid values are "standalone", "chromium",
  # "fuchsia", "dart" or "external".
  crashpad_dependencies = "standalone"

  if (defined(is_fuchsia_tree) && is_fuchsia_tree) {
    crashpad_dependencies = "fuchsia"
  }

  if (defined(is_starboard) && is_starboard) {
    crashpad_dependencies = "starboard"
  }

  if (defined(is_native_target_build) && is_native_target_build) {
    crashpad_dependencies = "native_target_build"
  }
}

assert(
    crashpad_dependencies == "chromium" || crashpad_dependencies == "starboard" ||
    crashpad_dependencies == "native_target_build" ||
    crashpad_dependencies == "fuchsia" || crashpad_dependencies == "standalone" ||
    crashpad_dependencies == "external" || crashpad_dependencies == "dart")

crashpad_is_in_chromium = crashpad_dependencies == "chromium"
crashpad_is_in_starboard = crashpad_dependencies == "starboard"
crashpad_is_in_native_target_build = crashpad_dependencies == "native_target_build"
crashpad_is_in_fuchsia = crashpad_dependencies == "fuchsia"
crashpad_is_in_dart = crashpad_dependencies == "dart"
crashpad_is_external = crashpad_dependencies == "external"
crashpad_is_standalone = crashpad_dependencies == "standalone"

if (crashpad_is_in_chromium) {
  crashpad_is_mac = is_mac
  crashpad_is_ios = is_ios
  crashpad_is_win = is_win
  crashpad_is_linux = is_linux
  crashpad_is_android = is_android
  crashpad_is_fuchsia = is_fuchsia

  crashpad_is_posix = is_posix

  crashpad_is_clang = is_clang
} else {
  # External and Dart SDK builds assume crashpad and mini_chromium are peers.
  if (crashpad_is_in_starboard || crashpad_is_in_native_target_build) {
    import("../../mini_chromium/build/compiler.gni")
    import("../../mini_chromium/build/platform.gni")
  } else if (crashpad_is_external || crashpad_is_in_dart) {
    import("../../../mini_chromium/mini_chromium/build/compiler.gni")
    import("../../../mini_chromium/mini_chromium/build/platform.gni")
  } else {
    # Both standalone and in Fuchsia tree use mini_chromium, and it's mapped into
    # the same location in both cases.
    import("../third_party/mini_chromium/mini_chromium/build/compiler.gni")
    import("../third_party/mini_chromium/mini_chromium/build/platform.gni")
  }
  crashpad_is_mac = mini_chromium_is_mac
  crashpad_is_ios = mini_chromium_is_ios
  crashpad_is_win = mini_chromium_is_win
  crashpad_is_linux = mini_chromium_is_linux
  crashpad_is_android = mini_chromium_is_android
  crashpad_is_fuchsia = mini_chromium_is_fuchsia

  crashpad_is_posix = mini_chromium_is_posix

  crashpad_is_clang = mini_chromium_is_clang
}

template("crashpad_executable") {
  executable(target_name) {
    forward_variables_from(invoker,
                           "*",
                           [
                             "configs",
                             "remove_configs",
                           ])
    if (defined(invoker.remove_configs)) {
      configs -= invoker.remove_configs
    }

    if (defined(invoker.configs)) {
      configs += invoker.configs
    }

    if (crashpad_is_in_fuchsia) {
      fdio_config = [ "//build/config/fuchsia:fdio_config" ]
      if (configs + fdio_config - fdio_config == configs) {
        configs += fdio_config
      }
    }
  }
}

template("crashpad_loadable_module") {
  loadable_module(target_name) {
    forward_variables_from(invoker,
                           "*",
                           [
                             "configs",
                             "remove_configs",
                           ])
    if (defined(invoker.remove_configs)) {
      configs -= invoker.remove_configs
    }

    if (defined(invoker.configs)) {
      configs += invoker.configs
    }

    if (crashpad_is_in_fuchsia) {
      configs += [ "//build/config/fuchsia:fdio_config" ]
    }
  }
}
