cargo_build_script(
    # See comment associated with alias. Do not change this name
    name = "{{ crate.name }}_build_script",
    aliases = {% set selectable = build_aliases %}{% include "partials/crate/aliases.j2" -%},
    build_script_env = {% set selectable = crate.build_script_attrs | get(key="build_script_env", default=Null) %}{% include "partials/starlark/selectable_dict.j2" -%},
    compile_data = {% if crate.build_script_attrs | get(key="compile_data_glob") %}glob({{ crate.build_script_attrs.compile_data_glob | json_encode | safe }}) + {% endif %}{% set selectable = crate.build_script_attrs | get(key="compile_data", default=Null) %}{% include "partials/starlark/selectable_list.j2" %},
    crate_name = "{{ sanitize_module_name(crate_name=target.crate_name) }}",
    crate_root = "{{ target.crate_root }}",
    crate_features = [
        {%- if crate.common_attrs | get(key="crate_features", default=Null) %}
        {%- for feature in crate.common_attrs.crate_features %}
        "{{ feature }}",
        {%- endfor %}
        {%- endif %}
    ],
    data = {% if crate.build_script_attrs | get(key="data_glob") %}glob({{ crate.build_script_attrs.data_glob | json_encode | safe }}) + {% endif %}{% set selectable = crate.build_script_attrs | get(key="data", default=Null) %}{% include "partials/starlark/selectable_list.j2" %},
    deps = [
        {%- for dep in crate.build_script_attrs | get(key="extra_deps", default=[]) %}
        "{{ dep }}",
        {%- endfor %}
    ] + {% set deps = crate.build_script_attrs | get(key="deps", default=Null) %}{% include "partials/crate/deps.j2" %},
    edition = "{{ crate.common_attrs.edition }}",
    {%- if crate.common_attrs.linker_script %}
    linker_script = "{{ crate.common_attrs.linker_script }}",
    {%- endif %}
    {%- if crate.build_script_attrs | get(key="links", default=Null) %}
    links = "{{ crate.build_script_attrs.links }}",
    {%- endif %}
    proc_macro_deps = [
        {%- for dep in crate.build_script_attrs | get(key="extra_proc_macro_deps", default=[]) %}
        "{{ dep }}",
        {%- endfor %}
    ] + {% set deps = crate.build_script_attrs | get(key="proc_macro_deps", default=Null) %}{% include "partials/crate/deps.j2" %},
    rustc_env = {% set selectable = crate.build_script_attrs | get(key="rustc_env", default=Null) %}{% include "partials/starlark/selectable_dict.j2" -%},
    rustc_env_files = {% set selectable = crate.build_script_attrs | get(key="rustc_env_files", default=Null) %}{% include "partials/starlark/selectable_list.j2" %},
    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",
        {%- if crate.common_attrs | get(key="rustc_flags", default=Null) %}

        # User provided rustc_flags
        {%- for rustc_flag in crate.common_attrs.rustc_flags %}
        "{{ rustc_flag }}",
        {%- endfor %}
        {%- endif %}
    ],
    srcs = {% set glob = target.srcs %}{% include "partials/starlark/glob.j2" -%},
    tools = {% set selectable = crate.build_script_attrs | get(key="tools", default=Null) %}{% include "partials/starlark/selectable_list.j2" %},
    version = "{{ crate.common_attrs.version }}",
    tags = [
        {%- if crate.common_attrs | get(key="tags", default=Null) %}
        {%- for tag in crate.common_attrs.tags %}
        "{{ tag }}",
        {%- endfor %}
        {%- endif %}
        "cargo-bazel",
        "manual",
        "noclippy",
        "norustfmt",
    ],
    {%- if crate.build_script_attrs | get(key="toolchains", default=Null) %}
    toolchains = [
        {%- for toolchain in crate.build_script_attrs.toolchains %}
        "{{ toolchain }}",
        {%- endfor %}
    ],
    {%- endif %}
    visibility = ["//visibility:private"],
)
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 = "{{ target.crate_name }}",
    actual = "{{ crate.name }}_build_script",
    tags = [
        "manual",
    ],
)
