# 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 = "file",
  srcs = [
  ] + select({
    ":_not_is_linux__and__not_is_mac__and__not_is_win_": [
      "tmpfile_other.cc",
    ],
    "//conditions:default": [],
  }) + select({
    ":is_linux_or_is_mac": [
      "tmpfile_posix.cc",
    ],
    "//conditions:default": [],
  }) + select({
    ":is_win": [
      "tmpfile_windows.cc",
    ],
    "//conditions:default": [],
  }),
  hdrs = [
    "tmpfile.h",
  ],
  deps = [
    "//src/tint/utils/ice",
    "//src/tint/utils/macros",
    "//src/tint/utils/text",
  ],
  copts = COPTS,
  visibility = ["//visibility:public"],
)
cc_library(
  name = "test",
  alwayslink = True,
  srcs = [
    "tmpfile_test.cc",
  ],
  deps = [
    "//src/tint/utils/file",
    "//src/tint/utils/text",
    "@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_",
    ],
)

