| # 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" ] |
| } |
| } |