# Copyright 2021 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//build/config/ios/ios_sdk.gni")
import("//build/toolchain/apple/toolchain.gni")

# Specialisation of the apple_toolchain template to declare the toolchain
# and its tools to build target for iOS platform.
template("ios_toolchain") {
  assert(defined(invoker.toolchain_args),
         "Toolchains must declare toolchain_args")

  apple_toolchain(target_name) {
    forward_variables_from(invoker, "*", [ "toolchain_args" ])

    sdk_developer_dir = ios_sdk_developer_dir
    deployment_target = ios_deployment_target
    target_environment = target_environment
    bin_path = ios_bin_path

    toolchain_args = {
      forward_variables_from(invoker.toolchain_args, "*")
      xcode_build = xcode_build
      current_os = "ios"
    }
  }
}

# Specialisation of the ios_toolchain template to declare the toolchain
# and its tools to build application extension for iOS platform.
template("ios_app_ext_toolchain") {
  assert(defined(invoker.toolchain_args),
         "Toolchains must declare toolchain_args")

  ios_toolchain(target_name) {
    forward_variables_from(invoker, "*", [ "toolchain_args" ])

    toolchain_args = {
      forward_variables_from(invoker.toolchain_args, "*")

      ios_is_app_extension = true

      # Those variables are defined outside of //build and thus only exists
      # when used as part of Chromium. Use build_with_chromium to check if
      # they can be overridden safely. This prevents breaking third-party
      # projects such as WebRTC that only uses //build but not //base.
      if (build_with_chromium) {
        use_partition_alloc = false
        ios_partition_alloc_enabled = false
      }
    }
  }
}

# Specialisation of the ios_toolchain template to declare the toolchain
# and its tools to build application extension for iOS platform.
template("ios_blink_app_ext_toolchain") {
  assert(defined(invoker.toolchain_args),
         "Toolchains must declare toolchain_args")

  ios_toolchain(target_name) {
    forward_variables_from(invoker, "*", [ "toolchain_args" ])

    toolchain_args = {
      forward_variables_from(invoker.toolchain_args, "*")

      ios_is_app_extension = true
    }
  }
}

ios_toolchain("ios_clang_arm64") {
  toolchain_args = {
    current_cpu = "arm64"
  }
}

ios_toolchain("ios_clang_arm64_16_0") {
  toolchain_args = {
    current_cpu = "arm64"
    ios_deployment_target = "16.0"
  }
}

ios_toolchain("ios_clang_x64") {
  toolchain_args = {
    current_cpu = "x64"
  }
}

ios_toolchain("ios_clang_x64_16_0") {
  toolchain_args = {
    current_cpu = "x64"
    ios_deployment_target = "16.0"
  }
}

ios_app_ext_toolchain("ios_clang_arm64_app_ext") {
  toolchain_args = {
    current_cpu = "arm64"
  }
}

ios_blink_app_ext_toolchain("ios_clang_arm64_blink_app_ext") {
  toolchain_args = {
    current_cpu = "arm64"
    use_blink = true
  }
}

ios_blink_app_ext_toolchain("ios_clang_x64_blink_app_ext") {
  toolchain_args = {
    current_cpu = "x64"
    use_blink = true
  }
}

ios_app_ext_toolchain("ios_clang_arm64_app_ext_13_4") {
  toolchain_args = {
    current_cpu = "arm64"
    ios_deployment_target = "13.4"
  }
}

ios_app_ext_toolchain("ios_clang_x64_app_ext") {
  toolchain_args = {
    current_cpu = "x64"
  }
}

ios_app_ext_toolchain("ios_clang_x64_app_ext_13_4") {
  toolchain_args = {
    current_cpu = "x64"
    ios_deployment_target = "13.4"
  }
}

ios_toolchain("ios_clang_arm64_blink") {
  toolchain_args = {
    current_cpu = "arm64"
    use_blink = true
  }
}
