# Copyright 2013 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# This header file defines the "sysroot" variable which is the absolute path
# of the sysroot. If no sysroot applies, the variable will be an empty string.

declare_args() {
  # The path of the sysroot that is applied when compiling using the target
  # toolchain.
  target_sysroot = ""

  # The path to directory containing linux sysroot images.
  target_sysroot_dir = "//build/linux"

  # The path of the sysroot for the current toolchain. If empty, default
  # sysroot is used.
  sysroot = ""

  # Controls default is_linux sysroot. If set to true, and sysroot
  # is empty, default sysroot is calculated.
  use_sysroot = current_cpu == "x86" || current_cpu == "x64" ||
                current_cpu == "arm" || current_cpu == "arm64" ||
                current_cpu == "mipsel" || current_cpu == "mips64el"

  if (use_cobalt_customizations) {
    use_sysroot = false
  }
}

if (sysroot == "") {
  if (current_os == target_os && current_cpu == target_cpu &&
      target_sysroot != "") {
    sysroot = target_sysroot
  } else if (is_android) {
    import("//build/config/android/config.gni")

    # Android uses unified headers, and thus a single compile time sysroot
    sysroot = "$android_toolchain_root/sysroot"
  } else if ((is_linux || is_chromeos) && use_sysroot) {
    # By default build against a sysroot image downloaded from Cloud Storage
    # during gclient runhooks.
    if (current_cpu == "x64") {
      sysroot = "$target_sysroot_dir/debian_bullseye_amd64-sysroot"
    } else if (current_cpu == "x86") {
      sysroot = "$target_sysroot_dir/debian_bullseye_i386-sysroot"
    } else if (current_cpu == "mipsel") {
      sysroot = "$target_sysroot_dir/debian_bullseye_mips-sysroot"
    } else if (current_cpu == "mips64el") {
      sysroot = "$target_sysroot_dir/debian_bullseye_mips64el-sysroot"
    } else if (current_cpu == "arm") {
      sysroot = "$target_sysroot_dir/debian_bullseye_arm-sysroot"
    } else if (current_cpu == "arm64") {
      sysroot = "$target_sysroot_dir/debian_bullseye_arm64-sysroot"
    } else {
      assert(false, "No linux sysroot for cpu: $target_cpu")
    }

    if (sysroot != "") {
      _script_arch = current_cpu
      if (_script_arch == "x86") {
        _script_arch = "i386"
      } else if (_script_arch == "x64") {
        _script_arch = "amd64"
      }
      assert(
          exec_script("//build/dir_exists.py",
                      [ rebase_path(sysroot) ],
                      "string") == "True",
          "Missing sysroot ($sysroot). To fix, run: build/linux/sysroot_scripts/install-sysroot.py --arch=$_script_arch")
    }
  } else if (is_mac) {
    import("//build/config/mac/mac_sdk.gni")
    sysroot = mac_sdk_path
  } else if (is_ios) {
    import("//build/config/ios/ios_sdk.gni")
    sysroot = ios_sdk_path
  } else if (is_fuchsia) {
    if (current_cpu == "arm64" || current_cpu == "x64") {
      sysroot = "//third_party/fuchsia-sdk/sdk/arch/$current_cpu/sysroot"
    }
  }
}
