| # 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/chrome_build.gni") |
| import("//build/config/gclient_args.gni") |
| import("//build/config/mac/mac_sdk_overrides.gni") |
| import("//build/toolchain/rbe.gni") |
| import("//build/toolchain/siso.gni") |
| import("//build/toolchain/toolchain.gni") |
| |
| assert(current_os == "mac" || current_toolchain == default_toolchain) |
| |
| declare_args() { |
| # The following two variables control the minimum supported version for |
| # macOS: |
| # |
| # This variable affects how Chromium is compiled and corresponds to the |
| # `MACOSX_DEPLOYMENT_TARGET` define. Changing this controls which symbols |
| # the macOS SDK marks as available (via `__builtin_available` and |
| # `@available`) and deprecated (producing a warning if called). Modifying |
| # this variable often requires additional code changes to handle differences |
| # in availability and deprecation, which is why it is often changed |
| # separately from `mac_min_system_version` when dropping support for older |
| # macOSes. |
| mac_deployment_target = "11.0" |
| |
| # The value of the `LSMinimumSystemVersion` in `Info.plist` files. This value |
| # controls the minimum OS version that may launch the application, and OS |
| # releases older than this will refuse to launch the application. When |
| # dropping support for older macOSes, this variable is often changed before |
| # `mac_deployment_target` to increase the system requirement without changing |
| # how Chromium is compiled. This must be greater than or equal to the |
| # `mac_deployment_target` version. |
| mac_min_system_version = "11.0" |
| |
| # Path to a specific version of the Mac SDK, not including a slash at the end. |
| # If empty, the path to the lowest version greater than or equal to |
| # `mac_sdk_min` is used. |
| mac_sdk_path = "" |
| |
| # The SDK name as accepted by `xcodebuild`. |
| mac_sdk_name = "macosx" |
| |
| # The SDK version used when making official builds. This is a single exact |
| # version, not a minimum. If this version isn't available official builds |
| # will fail. |
| mac_sdk_official_version = "15.0" |
| |
| # The SDK build version used when making official builds. This is a single |
| # exact version found at "System/Library/CoreServices/SystemVersion.plist" |
| # inside the SDK. |
| mac_sdk_official_build_version = "24A336" |
| |
| # Production builds should use hermetic Xcode. If you want to do production |
| # builds with system Xcode to test new SDKs, set this. |
| # Don't set this on any bots. |
| mac_allow_system_xcode_for_official_builds_for_testing = false |
| } |
| |
| # Check that the version of macOS SDK used is the one requested when building |
| # a version of Chrome shipped to the users. Disable the check if building for |
| # iOS as the version macOS SDK used is not relevant for the tool build for the |
| # host (they are not shipped) --- this is required as Chrome on iOS is usually |
| # build with the latest version of Xcode that may not ship with the version of |
| # the macOS SDK used to build Chrome on mac. |
| # TODO(crbug.com/40479759): the check for target_os should be replaced by a |
| # check that current_toolchain is default_toolchain, and the file should |
| # assert that current_os is "mac" once this file is no longer included by |
| # iOS toolchains. |
| if (is_chrome_branded && is_official_build && target_os != "ios") { |
| assert(!use_system_xcode || |
| mac_allow_system_xcode_for_official_builds_for_testing, |
| "official branded builds should use hermetic xcode") |
| } |
| |
| # The path to the hermetic install of Xcode. Only relevant when |
| # use_system_xcode = false. |
| if (!use_system_xcode) { |
| _hermetic_xcode_path = "//build/mac_files/xcode_binaries" |
| } |
| |
| script_name = "//build/config/apple/sdk_info.py" |
| sdk_info_args = [] |
| if (!use_system_xcode) { |
| sdk_info_args += [ |
| "--developer_dir", |
| rebase_path(_hermetic_xcode_path, "", root_build_dir), |
| ] |
| } |
| |
| # Building crashpard requires some files that are part of the macOS 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. |
| mac_use_xcode_symlinks = use_system_xcode && use_remoteexec |
| |
| # RBE requires paths relative to source directory. When using system |
| # Xcode, this is done by creating symbolic links in root_build_dir. |
| if (mac_use_xcode_symlinks) { |
| sdk_info_args += [ |
| "--get_sdk_info", |
| "--create_symlink_at", |
| "sdk/xcode_links", |
| "--root_build_dir", |
| root_build_dir, |
| ] |
| } |
| sdk_info_args += [ mac_sdk_name ] |
| |
| _mac_sdk_result = exec_script(script_name, sdk_info_args, "scope") |
| xcode_version = _mac_sdk_result.xcode_version |
| xcode_build = _mac_sdk_result.xcode_build |
| if (mac_sdk_path == "" && use_system_xcode && use_remoteexec) { |
| mac_sdk_path = _mac_sdk_result.sdk_path |
| } |
| |
| if (use_system_xcode) { |
| # The tool will print the SDK path on the first line, and the version on the |
| # second line. |
| find_sdk_args = [ |
| "--print_sdk_path", |
| "--print_bin_path", |
| "--print_sdk_build", |
| mac_sdk_min, |
| ] |
| find_sdk_lines = |
| exec_script("//build/mac/find_sdk.py", find_sdk_args, "list lines") |
| mac_sdk_version = find_sdk_lines[3] |
| mac_sdk_build_version = find_sdk_lines[2] |
| if (mac_sdk_path == "") { |
| mac_sdk_path = find_sdk_lines[0] |
| mac_bin_path = find_sdk_lines[1] |
| } else { |
| mac_bin_path = find_sdk_lines[1] |
| } |
| } else { |
| mac_sdk_version = mac_sdk_official_version |
| mac_sdk_build_version = mac_sdk_official_build_version |
| _dev = _hermetic_xcode_path + "/Contents/Developer" |
| _sdk = "MacOSX${mac_sdk_version}.sdk" |
| mac_sdk_path = _dev + "/Platforms/MacOSX.platform/Developer/SDKs/$_sdk" |
| mac_bin_path = _dev + "/Toolchains/XcodeDefault.xctoolchain/usr/bin/" |
| |
| # If we're using hermetic Xcode, then we want the paths to be relative so that |
| # generated ninja files are independent of the directory location. |
| # TODO(thakis): Do this at the uses of this variable instead. |
| mac_bin_path = rebase_path(mac_bin_path, root_build_dir) |
| } |
| |
| _sdk_root = rebase_path(mac_sdk_path, root_build_dir) |
| mac_sdk_logs = [ "mac_sdk_path=${_sdk_root}" ] |