# 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/shaderc.gni")

glslang_dir = shaderc_glslang_dir
spirv_tools_dir = shaderc_spirv_tools_dir
spirv_cross_dir = shaderc_spirv_cross_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",
  ]

  public_configs = [ ":shaderc_util_public" ]

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

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

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

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

component("libshaderc_spvc") {
  public_configs = [
    ":shaderc_spvc_public",
    ":shaderc_util_public",
  ]

  defines = [ "SHADERC_IMPLEMENTATION" ]

  sources = [
    "libshaderc/include/shaderc/env.h",
    "libshaderc/include/shaderc/status.h",
    "libshaderc/include/shaderc/visibility.h",
    "libshaderc_spvc/include/shaderc/spvc.h",
    "libshaderc_spvc/include/shaderc/spvc.hpp",
    "libshaderc_spvc/src/spvc.cc",
  ]

  deps = [
    ":shaderc_util_sources",
    "${spirv_tools_dir}:spvtools",
    "${spirv_tools_dir}:spvtools_val",
    "${spirv_tools_dir}:spvtools_opt",
    "${spirv_cross_dir}:spirv_cross_full_for_fuzzers",
  ]

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