# 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 || tint_build_benchmarks) {
  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",
    "combine_access_instructions.cc",
    "combine_access_instructions.h",
    "conversion_polyfill.cc",
    "conversion_polyfill.h",
    "demote_to_helper.cc",
    "demote_to_helper.h",
    "direct_variable_access.cc",
    "direct_variable_access.h",
    "multiplanar_external_texture.cc",
    "multiplanar_external_texture.h",
    "preserve_padding.cc",
    "preserve_padding.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/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") {
    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",
      "combine_access_instructions_test.cc",
      "conversion_polyfill_test.cc",
      "demote_to_helper_test.cc",
      "direct_variable_access_test.cc",
      "helper_test.h",
      "multiplanar_external_texture_test.cc",
      "preserve_padding_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/ir",
      "${tint_src_dir}/lang/core/ir/transform",
      "${tint_src_dir}/lang/core/type",
      "${tint_src_dir}/lang/wgsl",
      "${tint_src_dir}/lang/wgsl/ast",
      "${tint_src_dir}/lang/wgsl/program",
      "${tint_src_dir}/lang/wgsl/sem",
      "${tint_src_dir}/lang/wgsl/writer/ir_to_program",
      "${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_wgsl_reader) {
      deps += [
        "${tint_src_dir}/lang/wgsl/reader",
        "${tint_src_dir}/lang/wgsl/reader/program_to_ir",
      ]
    }

    if (tint_build_wgsl_reader && tint_build_wgsl_writer) {
      sources += [ "direct_variable_access_wgsl_test.cc" ]
    }

    if (tint_build_wgsl_writer) {
      deps += [ "${tint_src_dir}/lang/wgsl/writer" ]
    }
  }
}
