# 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")
if (!is_starboard) {
import("//build/config/gclient_args.gni")
}
import("//build/config/mac/mac_sdk_overrides.gni")
import("//build/toolchain/goma.gni")
import("//build/toolchain/rbe.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.
  mac_deployment_target = "10.13"

  # The value of the `LSMinimumSystemVersion` 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 must be greater than or equal
  # to the `mac_deployment_target` version.
  mac_min_system_version = "10.13"

  # 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 = "13.3"

  # 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 = "21E226"

  # 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 || use_remoteexec)) {
  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_goma || 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)
}
