chromium/build/config/ios/ios_sdk.gni

# Copyright 2015 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/config.gni")
import("//build/config/ios/ios_sdk_overrides.gni")
import("//build/toolchain/rbe.gni")
import("//build/toolchain/siso.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.ost"

  # Paths to the mobileprovision files for the chosen code signing
  # identity description and app bundle id prefix.
  ios_mobileprovision_files = []

  # Set to true if building an app extension.
  ios_is_app_extension = false
}

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

# Building XCTests requires copying XCTRunner.app which is part of the iOS
# SDK (and shipped inside Xcode.app) into the application. When using the
# system installation of Xcode, those files are outside of the checkout.
# Using absolute path works with gn, however the distributed build system
# requires that all paths are relative to the checkout. This is faked by
# using symbolic links to the SDK inside of Xcode. Additionally, each build
# directory may use a distinct version of Xcode (e.g. to build with beta),
# so the symlink needs to be present in the $root_build_dir. However, when
# doing that, we need to list inputs pointing to file in $root_build_dir,
# and gn requires all files in $root_build_dir to be listed as outputs of
# another target.
#
# To fulfill all of those requirements, we 1. create symlinks pointing to
# the SDK files in Xcode, 2. declare a target listing the files as outputs
# (the target is a script that does nothing, it only pretends to create
# the files but they already exists).
#
# This works, but results in some files in $root_build_dir being links to
# files outside of the build directory. Running `ninja -t clean` will try
# to delete those files breaking Xcode installation. The recommendation is
# to use `gn clean` or `ninja -t cleandead` instead.
#
# This variable controls whether we create the symlink and the workaround
# is needed or not. See https://crbug.com/336382863#comment16 for details.
ios_use_xcode_symlinks =
    ios_sdk_path == "" && use_system_xcode && use_remoteexec

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 (ios_use_xcode_symlinks) {
    ios_sdk_info_args += [
      "--create_symlink_at",
      "sdk/xcode_links",
      "--root_build_dir",
      root_build_dir,
    ]
  }
  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("//build/config/apple/find_signing_identity.py",
                    find_signing_identity_args,
                    "trim string")
  }
}

# As entitlements are tied to a specific bundle identifier, all the
# test application on iOS share the same identifier. This simplify
# adding new test application (since there is no need to investigate
# which entitlements they need, nor to wait for the mobile provision
# with those entitlements to be generated by Apple and then deployed
# to the infrastructure, ...). The drawback is that since only one
# test application can be installed at a time on a device/simulator
# (as the bundle identifier uniquely identify an application for iOS).
#
# This variable corresponds to the test bundle identifier.
shared_bundle_id_for_test_apps =
    "$ios_app_bundle_id_prefix.chrome.unittests.dev"

_sdk_root = rebase_path(ios_sdk_path, root_build_dir)
ios_sdk_logs = [ "ios_sdk_path=${_sdk_root}" ]