blob: fbff8b433acf7f7018c1c199020662c041fbd9fa [file] [log] [blame]
# 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")
}
}