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

glslang_dir = shaderc_glslang_dir
spirv_tools_dir = shaderc_spirv_tools_dir

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