# 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_spv_writer) {
  libtint_source_set("common") {
    sources = [
      "binary_writer.cc",
      "binary_writer.h",
      "function.cc",
      "function.h",
      "instruction.cc",
      "instruction.h",
      "module.cc",
      "module.h",
      "operand.cc",
      "operand.h",
      "options.h",
    ]
    deps = [
      "${tint_src_dir}/api/common",
      "${tint_src_dir}/api/options",
      "${tint_src_dir}/lang/core",
      "${tint_src_dir}/utils/containers",
      "${tint_src_dir}/utils/ice",
      "${tint_src_dir}/utils/macros",
      "${tint_src_dir}/utils/math",
      "${tint_src_dir}/utils/memory",
      "${tint_src_dir}/utils/reflection",
      "${tint_src_dir}/utils/rtti",
      "${tint_src_dir}/utils/text",
      "${tint_src_dir}/utils/traits",
    ]

    if (tint_build_spv_reader || tint_build_spv_writer) {
      deps += [ "${tint_spirv_headers_dir}:spv_headers" ]
    }
  }
}
if (tint_build_unittests) {
  if (tint_build_spv_writer) {
    tint_unittests_source_set("unittests") {
      testonly = true
      sources = [
        "binary_writer_test.cc",
        "helper_test.h",
        "instruction_test.cc",
        "module_test.cc",
        "operand_test.cc",
        "spv_dump_test.cc",
        "spv_dump_test.h",
      ]
      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/type",
        "${tint_src_dir}/lang/spirv",
        "${tint_src_dir}/lang/spirv/intrinsic",
        "${tint_src_dir}/lang/spirv/ir",
        "${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 || tint_build_spv_writer) {
        deps += [
          "${tint_spirv_headers_dir}:spv_headers",
          "${tint_spirv_tools_dir}:spvtools_headers",
          "${tint_spirv_tools_dir}:spvtools_val",
        ]
      }

      if (tint_build_spv_writer) {
        deps += [
          "${tint_src_dir}/lang/spirv/writer/common",
          "${tint_src_dir}/lang/spirv/writer/printer",
          "${tint_src_dir}/lang/spirv/writer/raise",
        ]
      }
    }
  }
}
