# Copyright 2018 The Shaderc Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import("//build_overrides/build.gni")
import("//build_overrides/shaderc.gni")
import("shaderc_features.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

config("shaderc_util_public") {
  include_dirs = [ "libshaderc_util/include" ]
}

source_set("shaderc_util_sources") {
  sources = [
    "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",
  ]

  # 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",
  ]

  if (build_with_chromium) {
    configs -= [ "//build/config/compiler:chromium_code" ]
    configs += [ "//build/config/compiler:no_chromium_code" ]
  }
}

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

component("libshaderc") {
  public_configs = [
    ":shaderc_public",
    ":shaderc_util_public",
  ]

  defines = [ "SHADERC_IMPLEMENTATION" ]

  sources = [
    "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",
  ]

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

  if (build_with_chromium) {
    configs -= [ "//build/config/compiler:chromium_code" ]
    configs += [ "//build/config/compiler:no_chromium_code" ]
  }
}

config("spirv_cross_public") {
  include_dirs = [
    "${spirv_cross_dir}",
    "${spirv_cross_dir}/..",
  ]
  defines = [ "SPIRV_CROSS_EXCEPTIONS_TO_ASSERTIONS" ]
}

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

source_set("spirv_cross") {
  public_configs = [ ":spirv_cross_public" ]
  configs += [ ":spirv_cross_internal" ]
  
  sources = [
    "${spirv_cross_dir}/GLSL.std.450.h",
    "${spirv_cross_dir}/spirv.hpp",
    "${spirv_cross_dir}/spirv_cfg.cpp",
    "${spirv_cross_dir}/spirv_cfg.hpp",
    "${spirv_cross_dir}/spirv_common.hpp",
    "${spirv_cross_dir}/spirv_cross.cpp",
    "${spirv_cross_dir}/spirv_cross.hpp",
    "${spirv_cross_dir}/spirv_cross_containers.hpp",
    "${spirv_cross_dir}/spirv_cross_error_handling.hpp",
    "${spirv_cross_dir}/spirv_cross_parsed_ir.cpp",
    "${spirv_cross_dir}/spirv_cross_parsed_ir.hpp",
    "${spirv_cross_dir}/spirv_glsl.cpp",
    "${spirv_cross_dir}/spirv_glsl.hpp",
    "${spirv_cross_dir}/spirv_hlsl.cpp",
    "${spirv_cross_dir}/spirv_hlsl.hpp",
    "${spirv_cross_dir}/spirv_msl.cpp",
    "${spirv_cross_dir}/spirv_msl.hpp",
    "${spirv_cross_dir}/spirv_parser.cpp",
    "${spirv_cross_dir}/spirv_parser.hpp",
    "${spirv_cross_dir}/spirv_reflect.cpp",
    "${spirv_cross_dir}/spirv_reflect.hpp",
  ]
}

config("shaderc_spvc_public") {
  include_dirs = [
    "libshaderc/include",
    "libshaderc_spvc/include",
    "${spirv_headers_dir}/include",
    # Accessing a private spirv-tools headers.
    "${spirv_tools_dir}",
    # Accessing auto-generated spirv-tools headers. The headers are generated by
    # actions in ${spirv_tools_dir}/BUILD.gn, hence locate the action outputs
    # using the generated file directory corresponding to that build file.
    get_path_info("${spirv_tools_dir}/BUILD.gn", "gen_dir"),
  ]
  
  if (is_component_build) {
    defines = [ "SHADERC_SHAREDLIB" ]
  }
}

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

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 = [
    "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",
  ]

  public_deps = [ ":spirv_cross" ]

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

  if (build_with_chromium) {
    configs -= [ "//build/config/compiler:chromium_code" ]
    configs += [ "//build/config/compiler:no_chromium_code" ]
  }
}
