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

declare_args() {
  # Minimum supported version of macOS. Must be of the form x.x.x for
  # Info.plist files.
  mac_deployment_target = "10.9.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"
}

# 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.
_verify_sdk = is_chrome_branded && is_official_build && target_os != "ios"

find_sdk_args = [ "--print_sdk_path" ]
if (!use_system_xcode) {
  find_sdk_args += [
    "--developer_dir",
    hermetic_xcode_path,
  ]
}
if (_verify_sdk) {
  find_sdk_args += [
    "--verify",
    mac_sdk_min,
    "--sdk_path=" + mac_sdk_path,
  ]
} else {
  find_sdk_args += [ mac_sdk_min ]
}

# The tool will print the SDK path on the first line, and the version on the
# second line.
find_sdk_lines =
    exec_script("//build/mac/find_sdk.py", find_sdk_args, "list lines")
mac_sdk_version = find_sdk_lines[1]
if (mac_sdk_path == "") {
  mac_sdk_path = find_sdk_lines[0]
}

script_name = "//build/config/mac/sdk_info.py"
sdk_info_args = []
if (!use_system_xcode) {
  sdk_info_args += [
    "--developer_dir",
    hermetic_xcode_path,
  ]
}
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
machine_os_build = _mac_sdk_result.machine_os_build

if (mac_sdk_version != mac_sdk_min &&
    exec_script("//build/check_return_value.py",
                [
                  "test",
                  xcode_version,
                  "-ge",
                  "0730",
                ],
                "value") != 1) {
  print(
      "********************************************************************************")
  print(
      " WARNING: The Mac OS X SDK is incompatible with the version of Xcode. To fix,")
  print(
      "          either upgrade Xcode to the latest version or install the Mac OS X")
  print(
      "          $mac_sdk_min SDK. For more information, see https://crbug.com/620127.")
  print()
  print(" Current SDK Version:   $mac_sdk_version")
  print(" Current Xcode Version: $xcode_version ($xcode_build)")
  print(
      "********************************************************************************")
  assert(false, "SDK is incompatible with Xcode")
}
