# 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/chrome_build.gni")
import("//build/config/gclient_args.gni")
import("//build/config/mac/mac_sdk_overrides.gni")
import("//build/toolchain/goma.gni")
import("//build/toolchain/toolchain.gni")

assert(current_os == "mac" || current_toolchain == default_toolchain)

declare_args() {
  # The MACOSX_DEPLOYMENT_TARGET variable used when compiling. This partially
  # controls the minimum supported version of macOS for Chromium by
  # affecting the symbol availability rules. This may differ from
  # mac_min_system_version when dropping support for older macOSes but where
  # additional code changes are required to be compliant with the availability
  # rules.
  # Must be of the form x.x.x for Info.plist files.
  mac_deployment_target = "10.11.0"

  # The value of the LSMinimmumSystemVersion in Info.plist files. This partially
  # controls the minimum supported version of macOS for Chromium by
  # affecting the Info.plist. This may differ from mac_deployment_target when
  # dropping support for older macOSes. This should be greater than or equal to
  # the mac_deployment_target version.
  # Must be of the form x.x.x for Info.plist files.
  mac_min_system_version = "10.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 = "11.1"

  # 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/635745): 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),
  ]
}

# Goma RBE requires paths relative to source directory. When using system
# Xcode, this is done by creating symbolic links in root_build_dir.
if (use_system_xcode && use_goma) {
  sdk_info_args += [
    "--get_sdk_info",
    "--create_symlink_at",
    "sdk/xcode_links",
  ]
}
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_goma) {
  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",
    mac_sdk_min,
  ]
  find_sdk_lines =
      exec_script("//build/mac/find_sdk.py", find_sdk_args, "list lines")
  mac_sdk_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
  _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)
}
