# 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")
}
if (tint_build_ir) {
  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",
      "shader_io.cc",
      "shader_io.h",
      "std140.cc",
      "std140.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}/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_ir) {
      deps += [ "${tint_src_dir}/lang/core/ir" ]
    }
  }
}
if (tint_build_unittests) {
  if (tint_build_ir) {
    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",
        "std140_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/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_ir) {
        deps += [
          "${tint_src_dir}/lang/core/ir",
          "${tint_src_dir}/lang/core/ir/transform",
        ]
      }
    }
  }
}
