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

import("//build/config/ios/config.gni")
import("//build/config/ios/ios_sdk_overrides.gni")
import("//build/toolchain/goma.gni")
import("//build/toolchain/goma.gni")
import("//build/toolchain/toolchain.gni")
import("//build_overrides/build.gni")

assert(current_os == "ios")
assert(use_system_xcode, "Hermetic xcode doesn't work for ios.")

declare_args() {
  # SDK path to use. When empty this will use the default SDK based on the
  # value of target_environment.
  ios_bin_path = ""
  ios_sdk_path = ""
  ios_sdk_name = ""
  ios_sdk_version = ""
  ios_sdk_platform = ""
  ios_sdk_platform_path = ""
  ios_toolchains_path = ""
  xcode_version = ""
  xcode_version_int = 0
  xcode_build = ""
  machine_os_build = ""

  # Set DEVELOPER_DIR while running sdk_info.py.
  ios_sdk_developer_dir = ""

  # Control whether codesiging is enabled (ignored for simulator builds).
  ios_enable_code_signing = true

  # Explicitly select the identity to use for codesigning. If defined, must
  # be set to a non-empty string that will be passed to codesigning. Can be
  # left unspecified if ios_code_signing_identity_description is used instead.
  ios_code_signing_identity = ""

  # Pattern used to select the identity to use for codesigning. If defined,
  # must be a substring of the description of exactly one of the identities by
  # `security find-identity -v -p codesigning`.
  ios_code_signing_identity_description = "Apple Development"

  # Prefix for CFBundleIdentifier property of iOS bundles (correspond to the
  # "Organization Identifier" in Xcode). Code signing will fail if no mobile
  # provisioning for the selected code signing identify support that prefix.
  ios_app_bundle_id_prefix = "org.chromium"

  # If non-empty, this list must contain valid cpu architecture, and the final
  # build will be a multi-architecture build (aka fat build) supporting the
  # main $target_cpu architecture and all of $additional_target_cpus.
  #
  # For example to build an application that will run on both arm64 and armv7
  # devices, you would use the following in args.gn file when running "gn args":
  #
  #   target_os = "ios"
  #   target_cpu = "arm64"
  #   additional_target_cpus = [ "arm" ]
  #
  # You can also pass the value via "--args" parameter for "gn gen" command by
  # using the syntax --args='additional_target_cpus=["arm"] target_cpu="arm64"'.
  additional_target_cpus = []
}

declare_args() {
  # This variable is set by the toolchain. It is set to true if the toolchain
  # is a secondary toolchain as part of a "fat" build.
  is_fat_secondary_toolchain = false

  # This variable is set by the toolchain. It is the name of the primary
  # toolchain for the fat build (could be current_toolchain).
  primary_fat_toolchain_name = ""
}

# Official builds may not use goma.
assert(!(use_goma && is_chrome_branded && is_official_build &&
             target_cpu == "arm64"),
       "goma use is forbidden for official iOS builds.")

assert(custom_toolchain == "" || additional_target_cpus == [],
       "cannot define both custom_toolchain and additional_target_cpus")

# If codesigning is enabled, use must configure either a codesigning identity
# or a filter to automatically select the codesigning identity.
if (target_environment == "device" && ios_enable_code_signing) {
  assert(ios_code_signing_identity == "" ||
             ios_code_signing_identity_description == "",
         "You should either specify the precise identity to use with " +
             "ios_code_signing_identity or let the code select an identity " +
             "automatically (via find_signing_identity.py which use the " +
             "variable ios_code_signing_identity_description to set the " +
             "pattern to match the identity to use).")
}

# Initialize additional_toolchains from additional_target_cpus. Assert here
# that the list does not contains $target_cpu nor duplicates as this would
# cause weird errors during the build.
additional_toolchains = []
if (additional_target_cpus != []) {
  foreach(_additional_target_cpu, additional_target_cpus) {
    assert(_additional_target_cpu != target_cpu,
           "target_cpu must not be listed in additional_target_cpus")

    _toolchain = "//build/toolchain/ios:ios_clang_${_additional_target_cpu}_fat"
    foreach(_additional_toolchain, additional_toolchains) {
      assert(_toolchain != _additional_toolchain,
             "additional_target_cpus must not contains duplicate values")
    }

    additional_toolchains += [ _toolchain ]
  }
}

if (ios_sdk_path == "") {
  # Compute default target.
  if (target_environment == "simulator") {
    ios_sdk_name = "iphonesimulator"
    ios_sdk_platform = "iPhoneSimulator"
  } else if (target_environment == "device") {
    ios_sdk_name = "iphoneos"
    ios_sdk_platform = "iPhoneOS"
  } else if (target_environment == "catalyst") {
    ios_sdk_name = "macosx"
    ios_sdk_platform = "MacOSX"
  } else {
    assert(false, "unsupported environment: $target_environment")
  }

  ios_sdk_info_args = [
    "--get_sdk_info",
    "--get_machine_info",
  ]
  ios_sdk_info_args += [ ios_sdk_name ]
  if (ios_sdk_developer_dir != "") {
    ios_sdk_info_args += [
      "--developer_dir",
      ios_sdk_developer_dir,
    ]
  }
  if (use_system_xcode && use_goma) {
    ios_sdk_info_args += [
      "--create_symlink_at",
      "sdk/xcode_links",
    ]
  }
  script_name = "//build/config/apple/sdk_info.py"
  _ios_sdk_result = exec_script(script_name, ios_sdk_info_args, "scope")
  ios_bin_path =
      rebase_path("${_ios_sdk_result.toolchains_path}/usr/bin/", root_build_dir)
  ios_sdk_path = _ios_sdk_result.sdk_path
  ios_sdk_platform_path = _ios_sdk_result.sdk_platform_path
  ios_sdk_version = _ios_sdk_result.sdk_version
  ios_sdk_build = _ios_sdk_result.sdk_build
  ios_toolchains_path = _ios_sdk_result.toolchains_path
  xcode_version = _ios_sdk_result.xcode_version
  xcode_version_int = _ios_sdk_result.xcode_version_int
  xcode_build = _ios_sdk_result.xcode_build
  machine_os_build = _ios_sdk_result.machine_os_build
  if (target_environment == "simulator") {
    # This is weird, but Xcode sets DTPlatformBuild to an empty field for
    # simulator builds.
    ios_platform_build = ""
  } else {
    ios_platform_build = ios_sdk_build
  }
}

if (target_environment == "device" && ios_enable_code_signing) {
  # Automatically select a codesigning identity if no identity is configured.
  # This only applies to device build as simulator builds are not signed.
  if (ios_code_signing_identity == "") {
    find_signing_identity_args = []
    if (ios_code_signing_identity_description != "") {
      find_signing_identity_args = [
        "--matching-pattern",
        ios_code_signing_identity_description,
      ]
    }
    ios_code_signing_identity = exec_script("find_signing_identity.py",
                                            find_signing_identity_args,
                                            "trim string")
  }
}
