# 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 = "14.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 = "23A334" # 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}" ]