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

if (is_win) {
  # Only needed on Windows.
  gles_gypi = exec_script(
      "//build/gypi_to_gn.py",
      [ rebase_path("src/libGLESv2.gypi") ],
      "scope",
      [ "src/libGLESv2.gypi" ])

  egl_gypi = exec_script(
      "//build/gypi_to_gn.py",
      [ rebase_path("src/libEGL.gypi") ],
      "scope",
      [ "src/libEGL.gypi" ])
}

compiler_gypi = exec_script(
    "//build/gypi_to_gn.py",
    [ rebase_path("src/compiler.gypi") ],
    "scope",
    [ "src/compiler.gypi" ])

# This config is exported to dependent targets (and also applied to internal
# ones).
config("external_config") {
  include_dirs = [
    "include",
  ]
}

# This config is applied to internal Angle targets (not pushed to dependents).
config("internal_config") {
  include_dirs = [
    "include",
    "src",
  ]
}

component("translator") {
  sources = [
    "src/compiler/translator/ShaderLang.cpp",
    "src/compiler/translator/ShaderVars.cpp",
  ]

  defines = [ "ANGLE_TRANSLATOR_IMPLEMENTATION" ]

  configs -= [ "//build/config/compiler:chromium_code" ]
  configs += [
    ":internal_config",
    "//build/config/compiler:no_chromium_code",
  ]

  public_deps = [
    ":translator_lib",
  ]
}

# Holds the shared includes so we only need to list them once.
source_set("includes") {
  sources = [
    "include/EGL/egl.h",
    "include/EGL/eglext.h",
    "include/EGL/eglplatform.h",
    "include/GLES2/gl2.h",
    "include/GLES2/gl2ext.h",
    "include/GLES2/gl2platform.h",
    "include/GLES3/gl3.h",
    "include/GLES3/gl3ext.h",
    "include/GLES3/gl3platform.h",
    "include/GLSLANG/ShaderLang.h",
    "include/KHR/khrplatform.h",
  ]
}

static_library("preprocessor") {
  sources = rebase_path(compiler_gypi.angle_preprocessor_sources, ".", "src")

  configs -= [ "//build/config/compiler:chromium_code" ]
  configs += [
    ":internal_config",
    "//build/config/compiler:no_chromium_code",
  ]
}

config("translator_static_config") {
  defines = [ "ANGLE_TRANSLATOR_STATIC" ]
}

static_library("translator_lib") {
  sources = rebase_path(compiler_gypi.angle_translator_lib_sources, ".", "src")

  configs -= [ "//build/config/compiler:chromium_code" ]
  configs += [
    ":internal_config",
    ":translator_static_config",
    "//build/config/compiler:no_chromium_code",
  ]
  public_configs = [ ":external_config" ]

  deps = [
    ":includes",
    ":preprocessor",
  ]
}

static_library("translator_static") {
  sources = [
    "src/compiler/translator/ShaderLang.cpp",
    "src/compiler/translator/ShaderVars.cpp",
  ]

  configs -= [ "//build/config/compiler:chromium_code" ]
  configs += [
    ":internal_config",
    "//build/config/compiler:no_chromium_code",
  ]
  public_configs = [ ":translator_static_config" ]

  public_deps = [
    ":translator_lib",
  ]
}

config("commit_id_config") {
  include_dirs = [ "$root_gen_dir/angle" ]
}

action("commit_id") {
  script = "src/commit_id.py"

  output_file = "$root_gen_dir/angle/id/commit.h"
  outputs = [ output_file ]

  args = [
    "gen",
    rebase_path(".", root_build_dir),
    rebase_path(output_file, root_build_dir),
  ]

  public_configs = [ ":commit_id_config" ]
}

if (is_win) {
  angle_enable_d3d9 = true
  angle_enable_d3d11 = true

  shared_library("libGLESv2") {
    sources = rebase_path(gles_gypi.angle_libangle_sources, ".", "src")
    sources += [
      "src/libGLESv2/libGLESv2.cpp",
      "src/libGLESv2/libGLESv2.def",
      "src/libGLESv2/libGLESv2.rc",
    ]

    defines = [
      "ANGLE_PRELOADED_D3DCOMPILER_MODULE_NAMES={ " +
        "\"d3dcompiler_46.dll\", \"d3dcompiler_43.dll\" }",
      "GL_APICALL=",
      "GL_GLEXT_PROTOTYPES=",
      "EGLAPI=",
    ]
    libs = []

    # Shared D3dD sources.
    if (angle_enable_d3d9 || angle_enable_d3d11) {
      sources += rebase_path(gles_gypi.angle_d3d_shared_sources, ".", "src")
    }

    if (angle_enable_d3d9) {
      sources += rebase_path(gles_gypi.angle_d3d9_sources, ".", "src")
      defines += [ "ANGLE_ENABLE_D3D9" ]
      libs += [ "d3d9.lib" ]
    }

    if (angle_enable_d3d11) {
      sources += rebase_path(gles_gypi.angle_d3d11_sources, ".", "src")
      defines += [ "ANGLE_ENABLE_D3D11" ]
      libs += [ "dxguid.lib" ]
    }

    if (is_debug) {
      defines += [ "ANGLE_ENABLE_PERF" ]
      libs += [ "d3d9.lib" ]
    }

    configs -= [ "//build/config/compiler:chromium_code" ]
    configs += [
      ":internal_config",
      "//build/config/compiler:no_chromium_code",
    ]

    include_dirs = [ "src/libGLESv2" ]

    deps = [
      ":commit_id",
      ":includes",
      ":translator",
      #":copy_compiler_dll",  TODO(GYP)
    ]
  }

  shared_library("libEGL") {
    sources = rebase_path(egl_gypi.angle_libegl_sources, ".", "src")

    defines = [
      "GL_APICALL=",
      "GL_GLEXT_PROTOTYPES=",
      "EGLAPI=",
    ]

    configs -= [ "//build/config/compiler:chromium_code" ]
    configs += [
      ":internal_config",
      "//build/config/compiler:no_chromium_code",
    ]

    if (is_debug) {
      defines += [ "ANGLE_ENABLE_PERF" ]
    }

    include_dirs = [ "src/libGLESv2" ]
    libs = [ "d3d9.lib" ]

    deps = [
      ":commit_id",
      ":includes",
      ":libGLESv2",
    ]
  }
}  # is_win
