blob: c4cd317b4858f6f46e2fbf58f40d540aa2e57e14 [file] [log] [blame]
# Copyright 2014 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/ios_sdk.gni")
import("//build/toolchain/goma.gni")
import("//build/toolchain/toolchain.gni")
import("//build_overrides/build.gni")
declare_args() {
# Enabling this option makes clang compile to an intermediate
# representation ("bitcode"), and not to native code. This is preferred
# when including WebRTC in the apps that will be sent to Apple's App Store
# and mandatory for the apps that run on watchOS or tvOS.
# The option only works when building with Xcode (use_xcode_clang = true).
# Mimicking how Xcode handles it, the production builds (is_debug = false)
# get real bitcode sections added, while the debug builds (is_debug = true)
# only get bitcode-section "markers" added in them.
# NOTE: This option is ignored when building versions for the iOS simulator,
# where a part of libvpx is compiled from the assembly code written using
# Intel assembly syntax; Yasm / Nasm do not support emitting bitcode parts.
# That is not a limitation for now as Xcode mandates the presence of bitcode
# only when building bitcode-enabled projects for real devices (ARM CPUs).
enable_ios_bitcode = false
}
# This is included by reference in the //build/config/compiler config that
# is applied to all targets. It is here to separate out the logic.
config("compiler") {
# These flags are shared between the C compiler and linker.
common_flags = []
# CPU architecture.
if (current_cpu == "x64") {
triplet_cpu = "x86_64"
} else if (current_cpu == "x86") {
triplet_cpu = "i386"
} else if (current_cpu == "arm" || current_cpu == "armv7") {
triplet_cpu = "armv7"
} else if (current_cpu == "arm64") {
triplet_cpu = "arm64"
} else {
assert(false, "unsupported cpu: $current_cpu")
}
# Environment.
if (target_environment == "simulator") {
triplet_environment = "-simulator"
} else if (target_environment == "device") {
triplet_environment = ""
} else if (target_environment == "catalyst") {
triplet_environment = "-macabi"
} else {
assert(false, "unsupported environment: $target_environment")
}
# OS.
triplet_os = "apple-ios"
# Set target.
common_flags = [
"-target",
"$triplet_cpu-$triplet_os$ios_deployment_target$triplet_environment",
]
# This is here so that all files get recompiled after an Xcode update.
# (defines are passed via the command line, and build system rebuild things
# when their commandline changes). Nothing should ever read this define.
defines = [ "CR_XCODE_VERSION=$xcode_version" ]
asmflags = common_flags
cflags = common_flags
swiftflags = common_flags
swiftflags += [
"-swift-version",
"5",
]
# Without this, the constructors and destructors of a C++ object inside
# an Objective C struct won't be called, which is very bad.
cflags_objcc = [ "-fobjc-call-cxx-cdtors" ]
ldflags = common_flags
}
# This is included by reference in the //build/config/compiler:runtime_library
# config that is applied to all targets. It is here to separate out the logic
# that is iOS-only. Please see that target for advice on what should go in
# :runtime_library vs. :compiler.
config("runtime_library") {
# The variable ios_sdk_path is relative to root_build_dir when using Goma RBE
# and system Xcode (since Goma RBE only supports paths relative to source).
# Rebase the value in that case since gn does not convert paths in compiler
# flags (since it is not aware they are paths).
_sdk_root = ios_sdk_path
if (use_system_xcode && use_goma) {
_sdk_root = rebase_path(ios_sdk_path, root_build_dir)
}
common_flags = [
"-isysroot",
_sdk_root,
]
swiftflags = [
"-sdk",
_sdk_root,
]
if (target_environment == "catalyst") {
common_flags += [
"-isystem",
"$_sdk_root/System/iOSSupport/usr/include",
"-iframework",
"$_sdk_root/System/iOSSupport/System/Library/Frameworks",
]
}
if (use_xcode_clang && enable_ios_bitcode && target_environment == "device") {
if (is_debug) {
common_flags += [ "-fembed-bitcode-marker" ]
} else {
common_flags += [ "-fembed-bitcode" ]
}
}
asmflags = common_flags
cflags = common_flags
ldflags = common_flags
}
config("ios_executable_flags") {
ldflags = []
# On "catalyst", the bundle structure is different (uses the same structure
# as a regular macOS app), so an additional -rpath is required.
if (target_environment == "catalyst") {
ldflags += [ "-Wl,-rpath,@loader_path/../Frameworks" ]
}
ldflags += [ "-Wl,-rpath,@executable_path/Frameworks" ]
}
config("ios_extension_executable_flags") {
configs = default_executable_configs
ldflags = [
"-e",
"_NSExtensionMain",
"-fapplication-extension",
]
# On "catalyst", the bundle structure is different (uses the same structure
# as a regular macOS app), so an additional -rpath is required.
if (target_environment == "catalyst") {
ldflags += [ "-Wl,-rpath,@loader_path/../../../../Frameworks" ]
}
ldflags += [ "-Wl,-rpath,@executable_path/../../Frameworks" ]
}
config("ios_dynamic_flags") {
ldflags = [
# Always load Objective-C categories and class.
"-Wl,-ObjC",
# Uses version 2 of Objective-C ABI.
"-Wl,-objc_abi_version,2",
]
# The path to the Swift compatibility libraries (required to run code built
# with version N of the SDK on older version of the OS) is relative to the
# toolchains directory and changes with the environment.
_swift_compatibility_libs_dir_prefix = "$ios_toolchains_path/usr/lib/swift"
if (target_environment == "simulator") {
_swift_compatibility_libs_dir =
"$_swift_compatibility_libs_dir_prefix/iphonesimulator"
} else if (target_environment == "device") {
_swift_compatibility_libs_dir =
"$_swift_compatibility_libs_dir_prefix/iphoneos"
} else if (target_environment == "catalyst") {
_swift_compatibility_libs_dir =
"$_swift_compatibility_libs_dir_prefix/maccatalyst"
}
lib_dirs = [
"$ios_sdk_path/usr/lib/swift",
_swift_compatibility_libs_dir,
]
}
config("ios_shared_library_flags") {
ldflags = [
"-Wl,-rpath,@executable_path/Frameworks",
"-Wl,-rpath,@loader_path/Frameworks",
]
}
config("disable_implicit_retain_self_warning") {
cflags_objc = [ "-Wno-implicit-retain-self" ]
cflags_objcc = cflags_objc
}
config("xctest_config") {
framework_dirs = [ "$ios_sdk_platform_path/Developer/Library/Frameworks" ]
frameworks = [
"Foundation.framework",
"XCTest.framework",
]
}
group("xctest") {
public_configs = [ ":xctest_config" ]
}
_xctrunner_path =
"$ios_sdk_platform_path/Developer/Library/Xcode/Agents/XCTRunner.app"
# When building with Goma RBE, $ios_sdk_platform_path corresponds to a symlink
# below $root_build_dir that points to the real SDK to use. Because the files
# are below $root_build_dir, it is not possible to list them as a target input
# without gn complaining (as it can't find a target creating those files).
#
# The symlinks are created by //build/config/apple/sdk_info.py script invoked
# via exec_script() from //build/config/{ios/ios_sdk.gni,mac/mac_sdk.gni}.
# As the invocation is done by exec_script, there is no target that can list
# those files as output.
#
# To workaround this, add a target that pretends to create those files
# (but does nothing). See https://crbug.com/1061487 for why this is needed.
if (use_system_xcode && use_goma) {
action("copy_xctrunner_app") {
testonly = true
script = "//build/noop.py"
outputs = [
"$_xctrunner_path/Info.plist",
"$_xctrunner_path/PkgInfo",
"$_xctrunner_path/XCTRunner",
]
}
}
# When creating the test runner for an XCUITest, the arm64e slice of the binary
# must be removed (at least until the app ships with arm64e slice which is not
# yet supported by Apple).
action("xctest_runner_without_arm64e") {
testonly = true
script = "//build/config/ios/strip_arm64e.py"
sources = [ "$_xctrunner_path/XCTRunner" ]
outputs = [ "$target_out_dir/XCTRunner" ]
args = [
"--output",
rebase_path(outputs[0], root_build_dir),
"--input",
rebase_path(sources[0], root_build_dir),
"--xcode-version",
xcode_version,
]
if (use_system_xcode && use_goma) {
deps = [ ":copy_xctrunner_app" ]
}
}