###############################################################################
# @generated
# This file is auto-generated by the cargo-bazel tool.
#
# DO NOT MODIFY: Local changes may be replaced in future executions.
###############################################################################

load(
    "@bazel_skylib//lib:selects.bzl",
    "selects",
)

# buildifier: disable=bzl-visibility
load("@rules_rust//crate_universe/private:selects.bzl", "select_with_or")
load(
    "@rules_rust//rust:defs.bzl",
    "rust_library",
)

package(default_visibility = ["//visibility:public"])

# licenses([
#     "TODO",  # MIT OR Apache-2.0
# ])

rust_library(
    name = "windows_sys",
    srcs = glob(
        include = [
            "**/*.rs",
        ],
        exclude = [
        ],
    ),
    aliases = selects.with_or({
        "//conditions:default": {
        },
    }),
    compile_data = glob(["**"]) + select_with_or({
        "//conditions:default": [
        ],
    }),
    crate_features = [
        "Win32",
        "Win32_Foundation",
        "Win32_Networking",
        "Win32_Networking_WinSock",
        "Win32_Security",
        "Win32_Storage",
        "Win32_Storage_FileSystem",
        "Win32_System",
        "Win32_System_IO",
        "Win32_System_LibraryLoader",
        "Win32_System_Pipes",
        "Win32_System_SystemServices",
        "Win32_System_WindowsProgramming",
        "default",
    ],
    crate_root = "src/lib.rs",
    data = select_with_or({
        "//conditions:default": [
        ],
    }),
    edition = "2018",
    proc_macro_deps = [
    ] + select_with_or({
        "//conditions:default": [
        ],
    }),
    rustc_env = {
    },
    rustc_env_files = select_with_or({
        "//conditions:default": [
        ],
    }),
    rustc_flags = [
        # In most cases, warnings in 3rd party crates are not interesting as
        # they're out of the control of consumers. The flag here silences
        # warnings. For more details see:
        # https://doc.rust-lang.org/rustc/lints/levels.html
        "--cap-lints=allow",
    ],
    tags = [
        "cargo-bazel",
        "manual",
        "noclippy",
        "norustfmt",
    ],
    version = "0.36.1",
    deps = [
    ] + select_with_or({
        # aarch64-pc-windows-msvc
        #
        # No supported platform triples for cfg: 'aarch64-pc-windows-msvc'
        # Skipped dependencies: [{"id":"windows_aarch64_msvc 0.36.1","target":"windows_aarch64_msvc"}]
        #
        # aarch64-uwp-windows-msvc
        #
        # No supported platform triples for cfg: 'aarch64-uwp-windows-msvc'
        # Skipped dependencies: [{"id":"windows_aarch64_msvc 0.36.1","target":"windows_aarch64_msvc"}]
        #
        # i686-pc-windows-gnu
        #
        # No supported platform triples for cfg: 'i686-pc-windows-gnu'
        # Skipped dependencies: [{"id":"windows_i686_gnu 0.36.1","target":"windows_i686_gnu"}]
        #
        # i686-pc-windows-msvc
        (
            "@rules_rust//rust/platform:i686-pc-windows-msvc",
        ): [
            # Target Deps
            "@crates_vendor_manifests__windows_i686_msvc-0.36.1//:windows_i686_msvc",

            # Common Deps
        ],
        # i686-uwp-windows-gnu
        #
        # No supported platform triples for cfg: 'i686-uwp-windows-gnu'
        # Skipped dependencies: [{"id":"windows_i686_gnu 0.36.1","target":"windows_i686_gnu"}]
        #
        # i686-uwp-windows-msvc
        #
        # No supported platform triples for cfg: 'i686-uwp-windows-msvc'
        # Skipped dependencies: [{"id":"windows_i686_msvc 0.36.1","target":"windows_i686_msvc"}]
        #
        # x86_64-pc-windows-gnu
        #
        # No supported platform triples for cfg: 'x86_64-pc-windows-gnu'
        # Skipped dependencies: [{"id":"windows_x86_64_gnu 0.36.1","target":"windows_x86_64_gnu"}]
        #
        # x86_64-pc-windows-msvc
        (
            "@rules_rust//rust/platform:x86_64-pc-windows-msvc",
        ): [
            # Target Deps
            "@crates_vendor_manifests__windows_x86_64_msvc-0.36.1//:windows_x86_64_msvc",

            # Common Deps
        ],
        # x86_64-uwp-windows-gnu
        #
        # No supported platform triples for cfg: 'x86_64-uwp-windows-gnu'
        # Skipped dependencies: [{"id":"windows_x86_64_gnu 0.36.1","target":"windows_x86_64_gnu"}]
        #
        # x86_64-uwp-windows-msvc
        #
        # No supported platform triples for cfg: 'x86_64-uwp-windows-msvc'
        # Skipped dependencies: [{"id":"windows_x86_64_msvc 0.36.1","target":"windows_x86_64_msvc"}]
        #
        "//conditions:default": [
        ],
    }),
)
