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

  skia_moltenvk_path = ""
  werror = false
}
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"

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 ||
           (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"
  }
}

msvc = ""
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.
  vc_2017_ent_default =
      "C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Enterprise\\VC"
  vc_2017_pro_default =
      "C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Professional\\VC"
  vc_2017_com_default =
      "C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC"
  vc_2017_bt_default =
      "C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\BuildTools\\VC"
  vc_2015_default = "C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC"

  if (win_vc == "") {
    if ("True" == exec_script("//gn/checkdir.py",
                              [ "$vc_2017_ent_default" ],
                              "trim string")) {
      win_vc = vc_2017_ent_default
      msvc = 2017
    } else if ("True" == exec_script("//gn/checkdir.py",
                                     [ "$vc_2017_pro_default" ],
                                     "trim string")) {
      win_vc = vc_2017_pro_default
      msvc = 2017
    } else if ("True" == exec_script("//gn/checkdir.py",
                                     [ "$vc_2017_com_default" ],
                                     "trim string")) {
      win_vc = vc_2017_com_default
      msvc = 2017
    } else if ("True" == exec_script("//gn/checkdir.py",
                                     [ "$vc_2017_bt_default" ],
                                     "trim string")) {
      win_vc = vc_2017_bt_default
      msvc = 2017
    } else if ("True" == exec_script("//gn/checkdir.py",
                                     [ "$vc_2015_default" ],
                                     "trim string")) {
      win_vc = vc_2015_default
      msvc = 2015
    }
  }
  assert(win_vc != "")  # Could not find VC installation. Set win_vc to your VC directory.

  if (msvc == "") {
    if ("True" ==
        exec_script("//gn/checkdir.py", [ "$win_vc/Tools" ], "trim string")) {
      msvc = 2017
    } else {
      msvc = 2015
    }
  }
}

if (target_os == "win") {
  if (msvc == 2017 && 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")
  }
}

# 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",
]
if (sanitize == "MSVC") {
  default_configs += [ "//gn:msvc_rtc" ]
}

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"
}
