# 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_library(
  name = "diagnostic",
  srcs = [
    "diagnostic.cc",
    "formatter.cc",
    "printer.cc",
    "source.cc",
  ] + select({
    ":_not_is_linux__and__not_is_mac__and__not_is_win_": [
      "printer_other.cc",
    ],
    "//conditions:default": [],
  }) + select({
    ":is_linux_or_is_mac": [
      "printer_posix.cc",
    ],
    "//conditions:default": [],
  }) + select({
    ":is_win": [
      "printer_windows.cc",
    ],
    "//conditions:default": [],
  }),
  hdrs = [
    "diagnostic.h",
    "formatter.h",
    "printer.h",
    "source.h",
  ],
  deps = [
    "//src/tint/utils/text",
    "//src/tint/utils/traits",
  ],
  copts = COPTS,
  visibility = ["//visibility:public"],
)
cc_library(
  name = "test",
  alwayslink = True,
  srcs = [
    "diagnostic_test.cc",
    "formatter_test.cc",
    "printer_test.cc",
    "source_test.cc",
  ],
  deps = [
    "//src/tint/utils/diagnostic",
    "//src/tint/utils/text",
    "//src/tint/utils/traits",
    "@gtest",
  ],
  copts = COPTS,
  visibility = ["//visibility:public"],
)

alias(
  name = "is_linux",
  actual = "//src/tint:is_linux_true",
)

alias(
  name = "_not_is_linux_",
  actual = "//src/tint:is_linux_false",
)

alias(
  name = "is_mac",
  actual = "//src/tint:is_mac_true",
)

alias(
  name = "_not_is_mac_",
  actual = "//src/tint:is_mac_false",
)

alias(
  name = "is_win",
  actual = "//src/tint:is_win_true",
)

alias(
  name = "_not_is_win_",
  actual = "//src/tint:is_win_false",
)

selects.config_setting_group(
    name = "is_linux_or_is_mac",
    match_any = [
        "is_linux",
        "is_mac",
    ],
)

selects.config_setting_group(
    name = "_not_is_linux__and__not_is_mac__and__not_is_win_",
    match_all = [
        ":_not_is_linux_",
        ":_not_is_mac_",
        ":_not_is_win_",
    ],
)

