| # Copyright 2014 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/ios_sdk.gni") |
| import("//build/toolchain/apple/toolchain.gni") |
| import("//build/toolchain/rbe.gni") |
| import("//build/toolchain/siso.gni") |
| import("//build/toolchain/toolchain.gni") |
| import("//build_overrides/build.gni") |
| |
| # 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", |
| ] |
| |
| cflags_objcc = [ |
| # When using -std=c++20 or higher, clang automatically returns true for |
| # `__has_feature(modules)` as it enables cxx modules. This is problematic |
| # because Objective-C code uses this to detect whether `@import` can be |
| # used (this feature is also named modules). |
| # |
| # Since Chromium does not yet enable cxx modules, nor clang modules, |
| # force disable the cxx modules, which cause `__has_features(modules)` |
| # to return false unless clang modules are explicitly enabled. |
| "-Xclang", |
| "-fno-cxx-modules", |
| ] |
| if (ios_chrome_generate_order_file) { |
| cflags_objcc += [ "-fsanitize-coverage=func,trace-pc-guard" ] |
| } |
| |
| ldflags = common_flags |
| |
| # This is on by default in ld64 for our deployment target, but not yet |
| # in ld64.lld. Force it on. |
| if (ios_deployment_target != "11.0" && ios_deployment_target != "12.0" && |
| ios_deployment_target != "13.0" && ios_deployment_target != "13.4" && |
| ios_deployment_target != "14.0") { |
| ldflags += [ "-Wl,-fixup_chains" ] |
| } |
| |
| if (ios_is_app_extension) { |
| ldflags += [ "-fapplication-extension" ] |
| cflags += [ "-fapplication-extension" ] |
| } |
| } |
| |
| # 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 RBE |
| # and system Xcode (since 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_remoteexec || use_siso)) { |
| _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", |
| ] |
| |
| swiftflags += [ |
| "-isystem", |
| "$_sdk_root/System/iOSSupport/usr/include", |
| "-Fsystem", |
| "$_sdk_root/System/iOSSupport/System/Library/Frameworks", |
| ] |
| } |
| |
| 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", |
| ] |
| |
| # 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", |
| ] |
| |
| # 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 when using the |
| # system toolchain. When using the hermetic swift toolchain instead, those |
| # libraries are relative to $swift_toolchain_path. |
| if (swift_toolchain_path == "") { |
| _swift_compatibility_libs_prefix = ios_toolchains_path |
| } else { |
| _swift_compatibility_libs_prefix = swift_toolchain_path |
| } |
| |
| if (target_environment == "simulator") { |
| _swift_compatibility_libs_suffix = "iphonesimulator" |
| } else if (target_environment == "device") { |
| _swift_compatibility_libs_suffix = "iphoneos" |
| } else if (target_environment == "catalyst") { |
| # The Swift compatibility libraries have changed location starting with |
| # Xcode 13.0, so check the version of Xcode when deciding which path to |
| # use. |
| if (xcode_version_int >= 1300) { |
| _swift_compatibility_libs_suffix = "macosx" |
| } else { |
| _swift_compatibility_libs_suffix = "maccatalyst" |
| } |
| } |
| |
| lib_dirs = [ |
| "$ios_sdk_path/usr/lib/swift", |
| "$_swift_compatibility_libs_prefix/usr/lib/swift/" + |
| "$_swift_compatibility_libs_suffix", |
| ] |
| |
| # When building for catalyst, some Swift support libraries are in a |
| # different directory which needs to be added to the search path. |
| if (target_environment == "catalyst") { |
| lib_dirs += [ "$ios_sdk_path/System/iOSSupport/usr/lib/swift" ] |
| } |
| } |
| |
| config("ios_shared_library_flags") { |
| ldflags = [ |
| "-Wl,-rpath,@executable_path/Frameworks", |
| "-Wl,-rpath,@loader_path/Frameworks", |
| ] |
| } |
| |
| config("xctest_config") { |
| # Add some directories to the system framework search path to make |
| # them available to the compiler while silencing warnings in the |
| # framework headers. This is required for XCTest. |
| common_flags = [ |
| "-iframework", |
| rebase_path("$ios_sdk_platform_path/Developer/Library/Frameworks", |
| root_build_dir), |
| "-iframework", |
| rebase_path("$ios_sdk_path/Developer/Library/Frameworks", root_build_dir), |
| ] |
| cflags = common_flags |
| ldflags = common_flags |
| swiftflags = common_flags |
| |
| include_dirs = [ "$ios_sdk_platform_path/Developer/usr/lib" ] |
| lib_dirs = [ "$ios_sdk_platform_path/Developer/usr/lib" ] |
| frameworks = [ |
| "Foundation.framework", |
| "XCTest.framework", |
| ] |
| } |
| |
| # TODO(crbug.com/1444308): any target that uses this config will miscompile. |
| # This needs to be fixed if we want to use Swift - C++ interop. |
| config("enable_swift_cxx_interop") { |
| swiftflags = [ "-enable-experimental-cxx-interop" ] |
| } |
| |
| group("xctest") { |
| public_configs = [ ":xctest_config" ] |
| } |
| |
| _xctrunner_path = |
| "$ios_sdk_platform_path/Developer/Library/Xcode/Agents/XCTRunner.app" |
| |
| # When building with 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_remoteexec || use_siso)) { |
| 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, |
| ] |
| |
| # When running under ASan, the ASan runtime library must be packaged alongside |
| # the test runner binary. |
| deps = [ "//build/config/sanitizers:deps" ] |
| if (use_system_xcode && (use_remoteexec || use_siso)) { |
| deps += [ ":copy_xctrunner_app" ] |
| } |
| } |