# Copyright 2023 The Dawn & Tint Authors
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice, this
#    list of conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright notice,
#    this list of conditions and the following disclaimer in the documentation
#    and/or other materials provided with the distribution.
#
# 3. Neither the name of the copyright holder nor the names of its
#    contributors may be used to endorse or promote products derived from
#    this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

################################################################################
# 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/dawn_overrides_with_defaults.gni")
import("../../../../../../scripts/tint_overrides_with_defaults.gni")

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

if (tint_build_unittests || tint_build_benchmarks) {
  import("//testing/test.gni")
}
if (tint_build_spv_reader) {
  libtint_source_set("ast_parser") {
    sources = [
      "ast_parser.cc",
      "ast_parser.h",
      "attributes.h",
      "construct.cc",
      "construct.h",
      "entry_point_info.cc",
      "entry_point_info.h",
      "enum_converter.cc",
      "enum_converter.h",
      "fail_stream.h",
      "function.cc",
      "function.h",
      "namer.cc",
      "namer.h",
      "parse.cc",
      "parse.h",
      "type.cc",
      "type.h",
      "usage.cc",
      "usage.h",
    ]
    deps = [
      "${dawn_root}/src/utils:utils",
      "${tint_src_dir}/api/common",
      "${tint_src_dir}/lang/core",
      "${tint_src_dir}/lang/core/constant",
      "${tint_src_dir}/lang/core/type",
      "${tint_src_dir}/lang/wgsl",
      "${tint_src_dir}/lang/wgsl/ast",
      "${tint_src_dir}/lang/wgsl/ast/transform",
      "${tint_src_dir}/lang/wgsl/program",
      "${tint_src_dir}/lang/wgsl/resolver",
      "${tint_src_dir}/lang/wgsl/sem",
      "${tint_src_dir}/utils",
      "${tint_src_dir}/utils/containers",
      "${tint_src_dir}/utils/diagnostic",
      "${tint_src_dir}/utils/ice",
      "${tint_src_dir}/utils/macros",
      "${tint_src_dir}/utils/math",
      "${tint_src_dir}/utils/memory",
      "${tint_src_dir}/utils/rtti",
      "${tint_src_dir}/utils/symbol",
      "${tint_src_dir}/utils/text",
    ]

    if (tint_build_spv_reader) {
      deps += [
        "${tint_src_dir}/lang/spirv/reader/ast_lower",
        "${tint_src_dir}/lang/spirv/reader/common",
      ]
    }

    if (tint_build_spv_reader || tint_build_spv_writer) {
      deps += [
        "${tint_spirv_headers_dir}:spv_headers",
        "${tint_spirv_tools_dir}:spvtools",
        "${tint_spirv_tools_dir}:spvtools_headers",
        "${tint_spirv_tools_dir}:spvtools_opt",
        "${tint_spirv_tools_dir}:spvtools_val",
        "${tint_spirv_tools_dir}:spvtools_val",
      ]
    }
    public_configs = [ "${tint_spirv_tools_dir}/:spvtools_internal_config" ]
  }
}
if (tint_build_unittests) {
  if (tint_build_spv_reader && tint_build_wgsl_writer) {
    tint_unittests_source_set("unittests") {
      sources = [
        "ast_parser_test.cc",
        "barrier_test.cc",
        "constant_test.cc",
        "convert_member_decoration_test.cc",
        "convert_type_test.cc",
        "enum_converter_test.cc",
        "fail_stream_test.cc",
        "function_arithmetic_test.cc",
        "function_bit_test.cc",
        "function_call_test.cc",
        "function_cfg_test.cc",
        "function_composite_test.cc",
        "function_conversion_test.cc",
        "function_decl_test.cc",
        "function_glsl_std_450_test.cc",
        "function_logical_test.cc",
        "function_memory_test.cc",
        "function_misc_test.cc",
        "function_var_test.cc",
        "get_decorations_test.cc",
        "handle_test.cc",
        "helper_test.cc",
        "helper_test.h",
        "import_test.cc",
        "module_function_decl_test.cc",
        "module_var_test.cc",
        "named_types_test.cc",
        "namer_test.cc",
        "parser_test.cc",
        "row_major_matrix_test.cc",
        "spirv_tools_helpers_test.cc",
        "spirv_tools_helpers_test.h",
        "type_test.cc",
        "usage_test.cc",
        "user_name_test.cc",
      ]
      deps = [
        "${dawn_root}/src/utils:utils",
        "${tint_src_dir}:gmock_and_gtest",
        "${tint_src_dir}/api/common",
        "${tint_src_dir}/lang/core",
        "${tint_src_dir}/lang/core/constant",
        "${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",
        "${tint_src_dir}/utils/containers",
        "${tint_src_dir}/utils/diagnostic",
        "${tint_src_dir}/utils/ice",
        "${tint_src_dir}/utils/macros",
        "${tint_src_dir}/utils/math",
        "${tint_src_dir}/utils/memory",
        "${tint_src_dir}/utils/rtti",
        "${tint_src_dir}/utils/symbol",
        "${tint_src_dir}/utils/text",
        "${tint_src_dir}/utils/text_generator",
      ]

      if (tint_build_spv_reader) {
        deps += [
          "${tint_src_dir}/lang/spirv/reader/ast_parser",
          "${tint_src_dir}/lang/spirv/reader/common",
        ]
      }

      if (tint_build_spv_reader || tint_build_spv_writer) {
        deps += [
          "${tint_spirv_headers_dir}:spv_headers",
          "${tint_spirv_tools_dir}:spvtools",
          "${tint_spirv_tools_dir}:spvtools_headers",
          "${tint_spirv_tools_dir}:spvtools_opt",
          "${tint_spirv_tools_dir}:spvtools_val",
          "${tint_spirv_tools_dir}:spvtools_val",
        ]
      }

      if (tint_build_wgsl_writer) {
        deps += [
          "${tint_src_dir}/lang/wgsl/writer",
          "${tint_src_dir}/lang/wgsl/writer/ast_printer",
        ]
      }
      public_configs = [ "${tint_spirv_tools_dir}/:spvtools_internal_config" ]
    }
  }
}
