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

shaderc_root = "../externals/shaderc"
spirv_tools_root = "../externals/spirv-tools"

import("//build_overrides/build.gni")
import("//build_overrides/shaderc.gni")
import("${shaderc_root}/shaderc_features.gni")
import("../third_party.gni")

glslang_dir = shaderc_glslang_dir
spirv_tools_dir = shaderc_spirv_tools_dir
spirv_cross_dir = shaderc_spirv_cross_dir
spirv_headers_dir = shaderc_spirv_headers_dir
use_direct_logging = shaderc_spvc_enable_direct_logging
use_context_logging = !shaderc_spvc_disable_context_logging

is_msvc = is_win && !is_clang

third_party_config("shaderc_util_public") {
  include_dirs = [ "${shaderc_root}/libshaderc_util/include" ]
}

source_set("shaderc_util_sources") {
  sources = rebase_path(
          [
            "libshaderc_util/include/libshaderc_util/counting_includer.h",
            "libshaderc_util/include/libshaderc_util/exceptions.h",
            "libshaderc_util/include/libshaderc_util/file_finder.h",
            "libshaderc_util/include/libshaderc_util/format.h",
            "libshaderc_util/include/libshaderc_util/io.h",
            "libshaderc_util/include/libshaderc_util/message.h",
            "libshaderc_util/include/libshaderc_util/mutex.h",
            "libshaderc_util/include/libshaderc_util/resources.h",
            "libshaderc_util/include/libshaderc_util/spirv_tools_wrapper.h",
            "libshaderc_util/include/libshaderc_util/string_piece.h",
            "libshaderc_util/include/libshaderc_util/universal_unistd.h",
            "libshaderc_util/include/libshaderc_util/version_profile.h",
            "libshaderc_util/src/compiler.cc",
            "libshaderc_util/src/file_finder.cc",
            "libshaderc_util/src/io.cc",
            "libshaderc_util/src/message.cc",
            "libshaderc_util/src/resources.cc",
            "libshaderc_util/src/shader_stage.cc",
            "libshaderc_util/src/spirv_tools_wrapper.cc",
            "libshaderc_util/src/version_profile.cc",
          ],
          ".",
          "$shaderc_root")

  # Configure Glslang's interface to include HLSL-related entry points.
  defines = [ "ENABLE_HLSL=1" ]

  public_configs = [ ":shaderc_util_public" ]

  deps = [
    "${glslang_dir}:glslang_sources",
    "${spirv_tools_dir}:spvtools",
  ]
}

third_party_config("shaderc_public") {
  include_dirs = [ "${shaderc_root}/libshaderc/include" ]
  if (is_component_build) {
    defines = [ "SHADERC_SHAREDLIB" ]
  }
}

third_party("libshaderc") {
  public_include_dirs = []
  configs += [
    ":shaderc_public",
    ":shaderc_util_public",
  ]

  defines = [ "SHADERC_IMPLEMENTATION" ]

  sources = rebase_path([
                          "libshaderc/include/shaderc/env.h",
                          "libshaderc/include/shaderc/shaderc.h",
                          "libshaderc/include/shaderc/shaderc.hpp",
                          "libshaderc/include/shaderc/status.h",
                          "libshaderc/include/shaderc/visibility.h",
                          "libshaderc/src/shaderc.cc",
                          "libshaderc/src/shaderc_private.h",
                        ],
                        ".",
                        "$shaderc_root")

  deps = [
    ":shaderc_util_sources",
    "${glslang_dir}:glslang_sources",
    "${spirv_tools_dir}:spvtools",
    "${spirv_tools_dir}:spvtools_val",
  ]
}

config("spirv_cross_internal") {
  if (!is_msvc) {
    cflags_cc = [
      "-Wno-implicit-fallthrough",
      "-Wno-return-type",
      "-Wno-sign-compare",
    ]
  } else {
    # Disable "not all control paths return a value" warning.
    cflags_cc = [ "/wd4715" ]
  }
}

config("shaderc_spvc_public") {
  include_dirs = [
    "${shaderc_root}/libshaderc/include",
    "${shaderc_root}/libshaderc_spvc/include",
    "${spirv_headers_dir}/include",

    # Accessing a private spirv-tools headers.
    "${spirv_tools_root}",
  ]

  include_dirs += [ "${target_gen_dir}/../spirv-tools" ]

  if (is_component_build) {
    defines = [ "SHADERC_SHAREDLIB" ]
  }
}

source_set("libshaderc_spvc_sources") {
  public_configs = [ ":shaderc_spvc_public" ]

  defines = [
    "SHADERC_IMPLEMENTATION",
    "SPIRV_CROSS_EXCEPTIONS_TO_ASSERTIONS",
  ]

  if (use_direct_logging) {
    defines += [ "SHADERC_SPVC_ENABLE_DIRECT_LOGGING" ]
  }

  if (!use_context_logging) {
    defines += [ "SHADERC_SPVC_DISABLE_CONTEXT_LOGGING" ]
  }

  sources = rebase_path([
                          "libshaderc/include/shaderc/env.h",
                          "libshaderc/include/shaderc/status.h",
                          "libshaderc/include/shaderc/visibility.h",
                          "libshaderc_spvc/include/spvc/spvc.h",
                          "libshaderc_spvc/include/spvc/spvc.hpp",
                          "libshaderc_spvc/src/spvc.cc",
                          "libshaderc_spvc/src/spvc_log.cc",
                          "libshaderc_spvc/src/spvc_log.h",
                          "libshaderc_spvc/src/spvc_private.cc",
                          "libshaderc_spvc/src/spvc_private.h",
                          "libshaderc_spvc/src/spvcir_pass.cc",
                          "libshaderc_spvc/src/spvcir_pass.h",
                        ],
                        ".",
                        "$shaderc_root")

  public_deps = [ "${spirv_cross_dir}:spirv_cross" ]

  deps = [
    "${spirv_tools_dir}:spvtools",
    "${spirv_tools_dir}:spvtools_core_enums_unified1",
    "${spirv_tools_dir}:spvtools_opt",
    "${spirv_tools_dir}:spvtools_val",
  ]

  configs += []
}

group("libshaderc_spvc") {
  public_deps = [ ":libshaderc_spvc_sources" ]
}

group("spirv_cross") {
  public_deps = [ "../spirv-cross:spirv_cross" ]
}
