# 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
#
# To regenerate run: './tools/run gen'
#
#                       Do not modify this file directly
################################################################################

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

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

if (tint_build_unittests) {
  import("//testing/test.gni")
}

libtint_source_set("transform") {
  sources = [
    "add_empty_entry_point.cc",
    "add_empty_entry_point.h",
    "bgra8unorm_polyfill.cc",
    "bgra8unorm_polyfill.h",
    "binary_polyfill.cc",
    "binary_polyfill.h",
    "binding_remapper.cc",
    "binding_remapper.h",
    "block_decorated_structs.cc",
    "block_decorated_structs.h",
    "builtin_polyfill.cc",
    "builtin_polyfill.h",
    "demote_to_helper.cc",
    "demote_to_helper.h",
    "multiplanar_external_texture.cc",
    "multiplanar_external_texture.h",
    "robustness.cc",
    "robustness.h",
    "shader_io.cc",
    "shader_io.h",
    "std140.cc",
    "std140.h",
    "zero_init_workgroup_memory.cc",
    "zero_init_workgroup_memory.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/intrinsic",
    "${tint_src_dir}/lang/core/intrinsic/data",
    "${tint_src_dir}/lang/core/ir",
    "${tint_src_dir}/lang/core/type",
    "${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_unittests) {
  tint_unittests_source_set("unittests") {
    testonly = true
    sources = [
      "add_empty_entry_point_test.cc",
      "bgra8unorm_polyfill_test.cc",
      "binary_polyfill_test.cc",
      "binding_remapper_test.cc",
      "block_decorated_structs_test.cc",
      "builtin_polyfill_test.cc",
      "demote_to_helper_test.cc",
      "helper_test.h",
      "multiplanar_external_texture_test.cc",
      "robustness_test.cc",
      "std140_test.cc",
      "zero_init_workgroup_memory_test.cc",
    ]
    deps = [
      "${tint_src_dir}:gmock_and_gtest",
      "${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/intrinsic",
      "${tint_src_dir}/lang/core/intrinsic/data",
      "${tint_src_dir}/lang/core/ir",
      "${tint_src_dir}/lang/core/ir/transform",
      "${tint_src_dir}/lang/core/type",
      "${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",
    ]
  }
}
