# 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" ])
}

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

  import("//build/config/win/visual_studio_version.gni")
  copy("copy_compiler_dll") {
    sources = [ "$windows_sdk_path/Redist/D3D/$cpu_arch/d3dcompiler_47.dll" ]
    outputs = [ "$root_build_dir/d3dcompiler_47.dll" ]
  }

  config("libANGLE_config") {
    defines = []
    if (angle_enable_d3d9) {
      defines += [ "ANGLE_ENABLE_D3D9" ]
    }
    if (angle_enable_d3d11) {
      defines += [ "ANGLE_ENABLE_D3D11" ]
    }
    defines += [
      "GL_APICALL=",
      "GL_GLEXT_PROTOTYPES=",
      "EGLAPI=",
    ]
  }

  static_library("libANGLE") {
    sources = rebase_path(gles_gypi.libangle_sources, ".", "src")
    sources += rebase_path(gles_gypi.libangle_common_sources, ".", "src")

    libs = []
    defines = []

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

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

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

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

    defines += [
      "LIBANGLE_IMPLEMENTATION",
      "ANGLE_PRELOADED_D3DCOMPILER_MODULE_NAMES={ " +
        "\"d3dcompiler_47.dll\", \"d3dcompiler_46.dll\", \"d3dcompiler_43.dll\" }",
    ]

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

    deps = [
      ":commit_id",
      ":includes",
      ":translator",
      ":copy_compiler_dll",
    ]
  }

  shared_library("libGLESv2") {
    sources = rebase_path(gles_gypi.libglesv2_sources, ".", "src")

    ldflags = [ "/DEF:" +
               rebase_path("src/libGLESv2/libGLESv2.def", root_build_dir) ]

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

    defines = [
      "LIBGLESV2_IMPLEMENTATION",
    ]

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

  shared_library("libEGL") {
    sources = rebase_path(gles_gypi.libegl_sources, ".", "src")

    ldflags = [ "/DEF:" +
               rebase_path("src/libEGL/libEGL.def", root_build_dir) ]

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

    defines = [
      "LIBEGL_IMPLEMENTATION",
    ]

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