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

declare_args() {
}

angle_root = "../externals/angle2"

import("$angle_root/src/compiler.gni")
import("$angle_root/src/libGLESv2.gni")
import("../third_party.gni")

third_party("angle2") {
  public_include_dirs = [ "$angle_root/include" ]
  deps = [
    ":libEGL",
    ":libGLESv2",
  ]
}

config("common") {
  defines = [
    "ANGLE_ENABLE_ESSL",
    "ANGLE_ENABLE_GLSL",
    "ANGLE_ENABLE_HLSL",
    "ANGLE_ENABLE_OPENGL",
    "EGL_EGLEXT_PROTOTYPES",
    "GL_GLEXT_PROTOTYPES",
  ]
  include_dirs = [
    "$root_gen_dir/angle2",
    "$angle_root/include",
    "$angle_root/src",
    "$angle_root/src/common/third_party/base",
    "$angle_root/src/third_party/khronos",
  ]
  cflags_cc = []
  assert(is_linux || is_win)  # TODO: is_mac?
  if (is_linux) {
    defines += [
      "ANGLE_USE_X11",
      "GL_APICALL=__attribute__((visibility(\"default\")))",
      "GL_API=__attribute__((visibility(\"default\")))",
      "EGLAPI=__attribute__((visibility(\"default\")))",
    ]
    cflags_cc += [ "-std=c++14" ]
  } else if (is_win) {
    defines += [
      "ANGLE_ENABLE_D3D11",
      "ANGLE_ENABLE_D3D9",
      "GL_APICALL=",
      "GL_API=",
      "EGLAPI=",
    ]

    # Allow noexcept, even though we build without exceptions
    cflags_cc += [ "/wd4577" ]
    if (is_clang) {
      cflags_cc += [
        # utilities.cpp includes an 'unsigned long' <= UINT_MAX check
        "-Wno-tautological-constant-compare",

        # With distributed Windows builds, files may lose their case during copy, causing
        # case-sensitivity mismatch on remote machines.
        "-Wno-nonportable-include-path",
      ]
    }
  }
}

copy("commit_id") {
  sources = [
    "$angle_root/src/commit.h",
  ]
  outputs = [
    "$root_gen_dir/angle2/id/commit.h",
  ]
}

shared_library("libGLESv2") {
  configs += [ ":common" ]
  configs -= [ "//gn:warnings" ]
  defines = [
    "LIBANGLE_IMPLEMENTATION",
    "LIBGLESV2_IMPLEMENTATION",
  ]
  deps = [
    ":commit_id",
  ]
  libs = []
  sources =
      rebase_path(
          angle_preprocessor_sources + angle_translator_sources +
              angle_translator_essl_sources + angle_translator_glsl_sources +
              angle_translator_hlsl_sources + libangle_sources +
              libangle_headers + libangle_common_sources +
              libangle_image_util_sources + libglesv2_sources +
              libangle_gl_sources + angle_system_utils_sources + xxhash_sources,
          ".",
          angle_root) + [ "$angle_root/src/libANGLE/FrameCapture_mock.cpp" ]
  if (is_win) {
    sources += [ "$angle_root/src/libGLESv2/libGLESv2_autogen.def" ]
  }
  if (is_linux) {
    libs += [
      "X11",
      "Xi",
      "Xext",
    ]
    sources += rebase_path(libangle_gl_glx_sources, ".", angle_root) +
               [ "$angle_root/src/third_party/libXNVCtrl/NVCtrl.c" ]
  } else if (is_win) {
    defines += [
      # TODO: ANGLE_PRELOADED_D3DCOMPILER_MODULE_NAMES
    ]
    sources +=
        rebase_path(libangle_gl_wgl_sources + libangle_d3d_shared_sources +
                        libangle_d3d9_sources + libangle_d3d11_sources +
                        libangle_d3d11_win32_sources,
                    ".",
                    angle_root)
    libs += [
      "d3d9.lib",
      "dxguid.lib",
      "gdi32.lib",
      "user32.lib",
    ]
    deps += [
      # TODO: copy_compiler_dll?
    ]
  }
}

shared_library("libEGL") {
  configs += [ ":common" ]
  configs -= [ "//gn:warnings" ]
  defines = [ "LIBEGL_IMPLEMENTATION" ]
  deps = [
    ":libGLESv2",
  ]
  sources = rebase_path(libegl_sources, ".", angle_root)
  if (is_win) {
    sources += [ "$angle_root/src/libEGL/libEGL.def" ]
  }
}
