###############################################################################
# @generated
# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To
# regenerate this file, run the following:
#
#     bazel run //bindgen/3rdparty:crates_vendor
###############################################################################

load(
    "@bazel_skylib//lib:selects.bzl",
    "selects",
)
load(
    "@rules_rust//cargo:defs.bzl",
    "cargo_build_script",
)

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

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

# licenses([
#     "TODO",  # BSD-3-Clause
# ])

rust_library(
    name = "bindgen",
    srcs = glob(
        include = [
            "**/*.rs",
        ],
        exclude = [
        ],
    ),
    aliases = selects.with_or({
        "//conditions:default": {
        },
    }),
    compile_data = glob(
        include = ["**"],
        exclude = [
            "BUILD",
            "BUILD.bazel",
            "WORKSPACE",
            "WORKSPACE.bazel",
        ],
    ) + select_with_or({
        "//conditions:default": [
        ],
    }),
    crate_features = [
        "clap",
        "default",
        "env_logger",
        "log",
        "logging",
        "runtime",
        "which",
        "which-rustfmt",
    ],
    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.58.1",
    deps = [
    ] + select_with_or({
        "//conditions:default": [
            "@rules_rust_bindgen__bindgen-0.58.1//:build_script_build",
            "@rules_rust_bindgen__bitflags-1.3.2//:bitflags",
            "@rules_rust_bindgen__cexpr-0.4.0//:cexpr",
            "@rules_rust_bindgen__clang-sys-1.3.3//:clang_sys",
            "@rules_rust_bindgen__clap-2.34.0//:clap",
            "@rules_rust_bindgen__env_logger-0.8.4//:env_logger",
            "@rules_rust_bindgen__lazy_static-1.4.0//:lazy_static",
            "@rules_rust_bindgen__lazycell-1.3.0//:lazycell",
            "@rules_rust_bindgen__log-0.4.17//:log",
            "@rules_rust_bindgen__peeking_take_while-0.1.2//:peeking_take_while",
            "@rules_rust_bindgen__proc-macro2-1.0.40//:proc_macro2",
            "@rules_rust_bindgen__quote-1.0.20//:quote",
            "@rules_rust_bindgen__regex-1.6.0//:regex",
            "@rules_rust_bindgen__rustc-hash-1.1.0//:rustc_hash",
            "@rules_rust_bindgen__shlex-1.1.0//:shlex",
            "@rules_rust_bindgen__which-3.1.1//:which",
        ],
    }),
)

rust_binary(
    name = "bindgen__bin",
    srcs = glob(
        include = [
            "**/*.rs",
        ],
        exclude = [
        ],
    ),
    aliases = selects.with_or({
        "//conditions:default": {
        },
    }),
    compile_data = glob(
        include = ["**"],
        exclude = [
            "BUILD",
            "BUILD.bazel",
            "WORKSPACE",
            "WORKSPACE.bazel",
        ],
    ) + select_with_or({
        "//conditions:default": [
        ],
    }),
    crate_features = [
        "clap",
        "default",
        "env_logger",
        "log",
        "logging",
        "runtime",
        "which",
        "which-rustfmt",
    ],
    crate_root = "src/main.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.58.1",
    deps = [
        ":bindgen",
    ] + select_with_or({
        "//conditions:default": [
            "@rules_rust_bindgen__bindgen-0.58.1//:build_script_build",
            "@rules_rust_bindgen__bitflags-1.3.2//:bitflags",
            "@rules_rust_bindgen__cexpr-0.4.0//:cexpr",
            "@rules_rust_bindgen__clang-sys-1.3.3//:clang_sys",
            "@rules_rust_bindgen__clap-2.34.0//:clap",
            "@rules_rust_bindgen__env_logger-0.8.4//:env_logger",
            "@rules_rust_bindgen__lazy_static-1.4.0//:lazy_static",
            "@rules_rust_bindgen__lazycell-1.3.0//:lazycell",
            "@rules_rust_bindgen__log-0.4.17//:log",
            "@rules_rust_bindgen__peeking_take_while-0.1.2//:peeking_take_while",
            "@rules_rust_bindgen__proc-macro2-1.0.40//:proc_macro2",
            "@rules_rust_bindgen__quote-1.0.20//:quote",
            "@rules_rust_bindgen__regex-1.6.0//:regex",
            "@rules_rust_bindgen__rustc-hash-1.1.0//:rustc_hash",
            "@rules_rust_bindgen__shlex-1.1.0//:shlex",
            "@rules_rust_bindgen__which-3.1.1//:which",
        ],
    }),
)

cargo_build_script(
    # See comment associated with alias. Do not change this name
    name = "bindgen_build_script",
    srcs = glob(
        include = [
            "**/*.rs",
        ],
        exclude = [
        ],
    ),
    aliases = selects.with_or({
        "//conditions:default": {
        },
    }),
    build_script_env = {
    },
    compile_data = select_with_or({
        "//conditions:default": [
        ],
    }),
    crate_features = [
        "clap",
        "default",
        "env_logger",
        "log",
        "logging",
        "runtime",
        "which",
        "which-rustfmt",
    ],
    crate_name = "build_script_build",
    crate_root = "build.rs",
    data = glob(["**"]) + 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",
    ],
    tools = select_with_or({
        "//conditions:default": [
        ],
    }),
    version = "0.58.1",
    visibility = ["//visibility:private"],
    deps = [
    ] + select_with_or({
        "//conditions:default": [
        ],
    }),
)

alias(
    # Because `cargo_build_script` does some invisible target name mutating to
    # determine the package and crate name for a build script, the Bazel
    # target namename of any build script cannot be the Cargo canonical name
    # of `build_script_build` without losing out on having certain Cargo
    # environment variables set.
    name = "build_script_build",
    actual = "bindgen_build_script",
    tags = [
        "manual",
    ],
)
