# Copyright 2021 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.

import("//build_overrides/build.gni")
import("../../../tint_overrides_with_defaults.gni")

source_set("tint_cmd_helper") {
  sources = [
    "generate_external_texture_bindings.cc",
    "generate_external_texture_bindings.h",
    "helper.cc",
    "helper.h",
  ]

  deps = [ "${tint_root_dir}/src/tint:libtint" ]
  if (tint_build_spv_reader || tint_build_spv_writer) {
    deps += [ "${tint_spirv_tools_dir}/:spvtools_headers" ]
  }
}

executable("tint") {
  sources = [ "main.cc" ]
  deps = [
    ":tint_cmd_helper",
    "${tint_root_dir}/src/tint:libtint",
    "${tint_root_dir}/src/tint:libtint_base_src",
    "${tint_root_dir}/src/tint:tint_utils_io",
    "${tint_root_dir}/src/tint:tint_val",
    "${tint_spirv_tools_dir}/:spvtools",
    "${tint_spirv_tools_dir}/:spvtools_opt",
    "${tint_spirv_tools_dir}/:spvtools_val",
  ]

  if (tint_build_glsl_writer) {
    deps += [
      "${tint_root_dir}/third_party/vulkan-deps/glslang/src:glslang_default_resource_limits_sources",
      "${tint_root_dir}/third_party/vulkan-deps/glslang/src:glslang_lib_sources",
    ]
  }

  configs += [
    "${tint_root_dir}/src/tint:tint_common_config",
    "${tint_root_dir}/src/tint:tint_config",
  ]

  if (build_with_chromium) {
    configs -= [ "//build/config/compiler:chromium_code" ]
    configs += [ "//build/config/compiler:no_chromium_code" ]
  }
}

executable("tint_info") {
  sources = [ "info.cc" ]
  deps = [
    ":tint_cmd_helper",
    "${tint_root_dir}/src/tint:libtint",
    "${tint_root_dir}/src/tint:libtint_base_src",
    "${tint_root_dir}/src/tint:tint_utils_io",
    "${tint_root_dir}/src/tint:tint_val",
    "${tint_spirv_tools_dir}/:spvtools",
    "${tint_spirv_tools_dir}/:spvtools_opt",
    "${tint_spirv_tools_dir}/:spvtools_val",
  ]

  configs += [
    "${tint_root_dir}/src/tint:tint_common_config",
    "${tint_root_dir}/src/tint:tint_config",
  ]

  if (build_with_chromium) {
    configs -= [ "//build/config/compiler:chromium_code" ]
    configs += [ "//build/config/compiler:no_chromium_code" ]
  }
}
