# Copyright 2016 Google Inc.
#
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

is_skia_standalone = true

# It's best to keep the names and defaults of is_foo flags consistent with Chrome.

declare_args() {
  is_official_build = false
  is_component_build = false
  ndk = ""

  # Android 5.0, Lollipop
  ndk_api = 21

  sanitize = ""

  ar = "ar"
  cc = "cc"
  cxx = "c++"

  win_sdk = "C:/Program Files (x86)/Windows Kits/10"
  win_sdk_version = ""

  win_vc = ""
  win_toolchain_version = ""

  clang_win = ""
  clang_win_version = ""

  ios_min_target = ""
}
declare_args() {
  is_debug = !is_official_build
}

assert(!(is_debug && is_official_build))

if (target_cpu == "wasm") {
  target_os = "wasm"
}

# Platform detection
if (target_os == "") {
  target_os = host_os
  if (ndk != "") {
    target_os = "android"
  }
}
if (current_os == "") {
  current_os = target_os
}

is_android = current_os == "android"
is_fuchsia = current_os == "fuchsia"
is_ios = current_os == "ios" || current_os == "tvos"
is_tvos = current_os == "tvos"
is_linux = current_os == "linux"
is_mac = current_os == "mac"
is_win = current_os == "win"

# This is just to make the Dawn build files happy. Skia itself uses target_os = "linux"
# for ChromeOS, so this variable will not affect Skia proper.
is_chromeos = false

if (target_cpu == "") {
  target_cpu = host_cpu
  if (is_android || is_ios) {
    target_cpu = "arm64"
  }
}
if (target_cpu == "x86_64") {
  target_cpu = "x64"
}
if (current_cpu == "") {
  current_cpu = target_cpu
}

is_clang = is_android || is_ios || is_mac || is_fuchsia ||
           (cc == "clang" && cxx == "clang++") || clang_win != ""
if (!is_clang && !is_win) {
  is_clang = exec_script("//gn/is_clang.py",
                         [
                           cc,
                           cxx,
                         ],
                         "value")
}

if (is_android) {
  ndk_host = ""
  ndk_target = ""
  ndk_gdbserver = ""

  if (host_os == "linux") {
    ndk_host = "linux-x86_64"
  } else if (host_os == "mac") {
    ndk_host = "darwin-x86_64"
  } else if (host_os == "win") {
    ndk_host = "windows-x86_64"
  }

  if (target_cpu == "arm64") {
    ndk_target = "aarch64-linux-android"
    ndk_gdbserver = "prebuilt/android-arm64/gdbserver/gdbserver"
  } else if (target_cpu == "arm") {
    ndk_target = "armv7a-linux-androideabi"
    ndk_gdbserver = "prebuilt/android-arm/gdbserver/gdbserver"
  } else if (target_cpu == "x64") {
    ndk_target = "x86_64-linux-android"
    ndk_gdbserver = "prebuilt/android-x86_64/gdbserver/gdbserver"
  } else if (target_cpu == "x86") {
    ndk_target = "i686-linux-android"
    ndk_gdbserver = "prebuilt/android-x86/gdbserver/gdbserver"
  }
}

if (target_os == "win") {
  # By default we look for 2017 (Enterprise, Pro, and Community), then 2015. If MSVC is installed in a
  # non-default location, you can set win_vc to inform us where it is.

  if (win_vc == "") {
    win_vc = exec_script("//gn/find_msvc.py", [], "trim string")
  }
  assert(win_vc != "")  # Could not find VC installation. Set win_vc to your VC
                        # directory.
}

if (target_os == "win") {
  if (win_toolchain_version == "") {
    win_toolchain_version = exec_script("//gn/highest_version_dir.py",
                                        [
                                          "$win_vc/Tools/MSVC",
                                          "[0-9]{2}\.[0-9]{2}\.[0-9]{5}",
                                        ],
                                        "trim string")
  }
  if (win_sdk_version == "") {
    win_sdk_version = exec_script("//gn/highest_version_dir.py",
                                  [
                                    "$win_sdk/Include",
                                    "[0-9]{2}\.[0-9]\.[0-9]{5}\.[0-9]",
                                  ],
                                  "trim string")
  }
  if (clang_win != "" && clang_win_version == "") {
    clang_win_version = exec_script("//gn/highest_version_dir.py",
                                    [
                                      "$clang_win/lib/clang",
                                      "[0-9]+\.[0-9]+\.[0-9]+",
                                    ],
                                    "trim string")
  }
}

# A component is either a static or a shared library.
template("component") {
  _component_mode = "static_library"
  if (is_component_build) {
    _component_mode = "shared_library"
  }

  target(_component_mode, target_name) {
    forward_variables_from(invoker, "*")
  }
}

# Default configs
default_configs = [
  "//gn:default",
  "//gn:no_exceptions",
  "//gn:no_rtti",
]
if (!is_debug) {
  default_configs += [
    "//gn:optimize",
    "//gn:NDEBUG",
  ]
}
if (!is_official_build) {
  default_configs += [
    "//gn:debug_symbols",
    "//gn:warnings",
  ]
}
default_configs += [
  "//gn:warnings_except_public_headers",
  "//gn:extra_flags",
]

set_defaults("executable") {
  configs = [ "//gn:executable" ] + default_configs
}

set_defaults("source_set") {
  configs = default_configs
}

set_defaults("static_library") {
  configs = default_configs
}

set_defaults("shared_library") {
  configs = default_configs
}

set_defaults("component") {
  configs = default_configs
  if (!is_component_build) {
    complete_static_lib = true
  }
}

if (is_win) {
  # Windows tool chain
  set_default_toolchain("//gn/toolchain:msvc")
  default_toolchain_name = "msvc"
  host_toolchain = "msvc"
} else {
  # GCC-like toolchains, including Clang.
  set_default_toolchain("//gn/toolchain:gcc_like")
  default_toolchain_name = "gcc_like"
  host_toolchain = "gcc_like_host"
}
