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

load("//src/tint:flags.bzl", "COPTS")
load("@bazel_skylib//lib:selects.bzl", "selects")
cc_binary(
  name = "test_cmd",
  srcs = [
    "main_test.cc",
  ],
  deps = [
    "//src/tint/api",
    "//src/tint/cmd/common:test",
    "//src/tint/lang/core/constant:test",
    "//src/tint/lang/core/intrinsic:test",
    "//src/tint/lang/core/ir/transform:test",
    "//src/tint/lang/core/ir:test",
    "//src/tint/lang/core/type:test",
    "//src/tint/lang/core:test",
    "//src/tint/lang/wgsl/ast/transform:test",
    "//src/tint/lang/wgsl/ast:test",
    "//src/tint/lang/wgsl/helpers:test",
    "//src/tint/lang/wgsl/inspector:test",
    "//src/tint/lang/wgsl/program:test",
    "//src/tint/lang/wgsl/reader/parser:test",
    "//src/tint/lang/wgsl/reader/program_to_ir:test",
    "//src/tint/lang/wgsl/resolver:test",
    "//src/tint/lang/wgsl/sem:test",
    "//src/tint/lang/wgsl/writer/ast_printer:test",
    "//src/tint/lang/wgsl/writer/ir_to_program:test",
    "//src/tint/lang/wgsl:test",
    "//src/tint/utils/cli:test",
    "//src/tint/utils/command:test",
    "//src/tint/utils/containers:test",
    "//src/tint/utils/diagnostic:test",
    "//src/tint/utils/file:test",
    "//src/tint/utils/ice",
    "//src/tint/utils/ice:test",
    "//src/tint/utils/macros",
    "//src/tint/utils/macros:test",
    "//src/tint/utils/math:test",
    "//src/tint/utils/memory:test",
    "//src/tint/utils/reflection:test",
    "//src/tint/utils/result:test",
    "//src/tint/utils/rtti:test",
    "//src/tint/utils/strconv:test",
    "//src/tint/utils/symbol:test",
    "//src/tint/utils/text:test",
    "//src/tint/utils/traits:test",
    "@gtest",
  ] + select({
    ":tint_build_glsl_writer": [
      "//src/tint/lang/glsl/writer/ast_printer:test",
      "//src/tint/lang/glsl/writer/ast_raise:test",
    ],
    "//conditions:default": [],
  }) + select({
    ":tint_build_hlsl_writer": [
      "//src/tint/lang/hlsl/writer/ast_printer:test",
      "//src/tint/lang/hlsl/writer/ast_raise:test",
    ],
    "//conditions:default": [],
  }) + select({
    ":tint_build_msl_writer": [
      "//src/tint/lang/msl/writer/ast_printer:test",
      "//src/tint/lang/msl/writer/ast_raise:test",
      "//src/tint/lang/msl/writer/common:test",
      "//src/tint/lang/msl/writer/printer:test",
    ],
    "//conditions:default": [],
  }) + select({
    ":tint_build_spv_reader": [
      "//src/tint/lang/spirv/reader/ast_lower:test",
      "//src/tint/lang/spirv/reader/ast_parser:test",
    ],
    "//conditions:default": [],
  }) + select({
    ":tint_build_spv_writer": [
      "//src/tint/lang/spirv/writer/ast_printer:test",
      "//src/tint/lang/spirv/writer/ast_raise:test",
      "//src/tint/lang/spirv/writer/common:test",
      "//src/tint/lang/spirv/writer/raise:test",
      "//src/tint/lang/spirv/writer:test",
    ],
    "//conditions:default": [],
  }),
  copts = COPTS,
  visibility = ["//visibility:public"],
)

alias(
  name = "tint_build_glsl_writer",
  actual = "//src/tint:tint_build_glsl_writer_true",
)

alias(
  name = "tint_build_hlsl_writer",
  actual = "//src/tint:tint_build_hlsl_writer_true",
)

alias(
  name = "tint_build_msl_writer",
  actual = "//src/tint:tint_build_msl_writer_true",
)

alias(
  name = "tint_build_spv_reader",
  actual = "//src/tint:tint_build_spv_reader_true",
)

alias(
  name = "tint_build_spv_writer",
  actual = "//src/tint:tint_build_spv_writer_true",
)

