# Copyright 2023 The Tint Authors.
#
# 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.

################################################################################
# File generated by tools/src/cmd/gen
# using the template:
#   tools/src/cmd/gen/build/BUILD.gn.tmpl
#
# Do not modify this file directly
################################################################################

import("../../../../tint_overrides_with_defaults.gni")

import("${tint_src_dir}/tint.gni")

libtint_source_set("common") {
  sources = [
    "generate_external_texture_bindings.cc",
    "generate_external_texture_bindings.h",
    "helper.cc",
    "helper.h",
  ]
  deps = [
    "${tint_src_dir}/api/common",
    "${tint_src_dir}/api/options",
    "${tint_src_dir}/lang/core",
    "${tint_src_dir}/lang/core/constant",
    "${tint_src_dir}/lang/core/type",
    "${tint_src_dir}/lang/spirv/reader/common",
    "${tint_src_dir}/lang/wgsl/ast",
    "${tint_src_dir}/lang/wgsl/inspector",
    "${tint_src_dir}/lang/wgsl/program",
    "${tint_src_dir}/lang/wgsl/reader",
    "${tint_src_dir}/lang/wgsl/sem",
    "${tint_src_dir}/lang/wgsl/writer",
    "${tint_src_dir}/utils/containers",
    "${tint_src_dir}/utils/diagnostic",
    "${tint_src_dir}/utils/ice",
    "${tint_src_dir}/utils/id",
    "${tint_src_dir}/utils/macros",
    "${tint_src_dir}/utils/math",
    "${tint_src_dir}/utils/memory",
    "${tint_src_dir}/utils/reflection",
    "${tint_src_dir}/utils/result",
    "${tint_src_dir}/utils/rtti",
    "${tint_src_dir}/utils/symbol",
    "${tint_src_dir}/utils/text",
    "${tint_src_dir}/utils/traits",
  ]

  if (tint_build_spv_reader) {
    deps += [ "${tint_src_dir}/lang/spirv/reader" ]
  }

  if (tint_build_spv_reader || tint_build_spv_writer) {
    deps += [
      "${tint_spirv_tools_dir}:spvtools_headers",
      "${tint_spirv_tools_dir}:spvtools_val",
    ]
  }
}

tint_unittests_source_set("unittests") {
  testonly = true
  sources = [ "generate_external_texture_bindings_test.cc" ]
  deps = [
    "${tint_src_dir}:gmock_and_gtest",
    "${tint_src_dir}/api/common",
    "${tint_src_dir}/api/options",
    "${tint_src_dir}/cmd/common",
    "${tint_src_dir}/lang/core",
    "${tint_src_dir}/lang/core/constant",
    "${tint_src_dir}/lang/core/type",
    "${tint_src_dir}/lang/wgsl/ast",
    "${tint_src_dir}/lang/wgsl/program",
    "${tint_src_dir}/lang/wgsl/resolver",
    "${tint_src_dir}/lang/wgsl/sem",
    "${tint_src_dir}/utils/containers",
    "${tint_src_dir}/utils/diagnostic",
    "${tint_src_dir}/utils/ice",
    "${tint_src_dir}/utils/id",
    "${tint_src_dir}/utils/macros",
    "${tint_src_dir}/utils/math",
    "${tint_src_dir}/utils/memory",
    "${tint_src_dir}/utils/reflection",
    "${tint_src_dir}/utils/result",
    "${tint_src_dir}/utils/rtti",
    "${tint_src_dir}/utils/symbol",
    "${tint_src_dir}/utils/text",
    "${tint_src_dir}/utils/traits",
  ]
}
