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

  # It's nice to keep ndk_api set to what Clank targets, but probably no big deal if we can't.
  if (target_cpu == "x86" || target_cpu == "arm") {
    ndk_api = 16
  } else {
    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_vulkan_sdk = getenv("VULKAN_SDK")
  skia_moltenvk_path = ""
}
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_platform = ""
  ndk_stdlib = ""
  ndk_gccdir = ""
  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_platform = "android-${ndk_api}/arch-arm64"
    ndk_stdlib = "arm64-v8a"
    ndk_gccdir = ndk_target
    ndk_gdbserver = "prebuilt/android-arm64/gdbserver/gdbserver"
  } else if (target_cpu == "arm") {
    ndk_target = "arm-linux-androideabi"
    ndk_platform = "android-${ndk_api}/arch-arm"
    ndk_stdlib = "armeabi-v7a"
    ndk_gccdir = ndk_target
    ndk_gdbserver = "prebuilt/android-arm/gdbserver/gdbserver"
  } else if (target_cpu == "x64") {
    ndk_target = "x86_64-linux-android"
    ndk_platform = "android-${ndk_api}/arch-x86_64"
    ndk_stdlib = "x86_64"
    ndk_gccdir = ndk_stdlib
    ndk_gdbserver = "prebuilt/android-x86_64/gdbserver/gdbserver"
  } else if (target_cpu == "x86") {
    ndk_target = "i686-linux-android"
    ndk_platform = "android-${ndk_api}/arch-x86"
    ndk_stdlib = "x86"
    ndk_gccdir = ndk_stdlib
    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",
]

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