Cargo

cargo_bootstrap_repository

A rule for bootstrapping a Rust binary using Cargo

ATTRIBUTES

NameDescriptionTypeMandatoryDefault
nameA unique name for this repository.Namerequired
binaryThe binary to build (the --bin parameter for Cargo). If left empty, the repository name will be used.Stringoptional""
build_modeThe build mode the binary should be built withStringoptional“release”
cargo_lockfileThe lockfile of the crate_universe resolverLabelrequired
cargo_tomlThe path of the crate_universe resolver manifest (Cargo.toml file)Labelrequired
envA mapping of platform triple to a set of environment variables. See cargo_env for usage details. Additionally, the platform triple * applies to all platforms.Dictionary: String -> Stringoptional{}
env_labelA mapping of platform triple to a set of environment variables. This attribute differs from env in that all variables passed here must be fully qualified labels of files. See cargo_env for usage details. Additionally, the platform triple * applies to all platforms.Dictionary: String -> Stringoptional{}
iso_dateThe iso_date of cargo binary the resolver should use. Note: This can only be set if version is beta or nightlyStringoptional""
repo_mappingA dictionary from local repository name to global repository name. This allows controls over workspace dependency resolution for dependencies of this repository.<p>For example, an entry “@foo”: “@bar” declares that, for any time this repository depends on @foo (such as a dependency on @foo//some:target, it should actually resolve that dependency within globally-declared @bar (@bar//some:target).Dictionary: String -> Stringrequired
rust_toolchain_cargo_templateThe template to use for finding the host cargo binary. {version} (eg. ‘1.53.0’), {triple} (eg. ‘x86_64-unknown-linux-gnu’), {arch} (eg. ‘aarch64’), {vendor} (eg. ‘unknown’), {system} (eg. ‘darwin’), and {tool} (eg. ‘rustc.exe’) will be replaced in the string if present.Stringoptional“@rust_{system}_{arch}//:bin/{tool}”
rust_toolchain_repository_templateDeprecated: Please use rust_toolchain_cargo_template and rust_toolchain_rustc_templateStringoptional""
rust_toolchain_rustc_templateThe template to use for finding the host rustc binary. {version} (eg. ‘1.53.0’), {triple} (eg. ‘x86_64-unknown-linux-gnu’), {arch} (eg. ‘aarch64’), {vendor} (eg. ‘unknown’), {system} (eg. ‘darwin’), and {tool} (eg. ‘rustc.exe’) will be replaced in the string if present.Stringoptional“@rust_{system}_{arch}//:bin/{tool}”
srcsSouce files of the crate to build. Passing source files here can be used to trigger rebuilds when changes are madeList of labelsoptional[]
timeoutMaximum duration of the Cargo build command in secondsIntegeroptional600
versionThe version of cargo the resolver should useStringoptional“1.58.1”

cargo_build_script

Compile and execute a rust build script to generate build attributes

This rules take the same arguments as rust_binary.

Example:

Suppose you have a crate with a cargo build script build.rs:

[workspace]/
    hello_lib/
        BUILD
        build.rs
        src/
            lib.rs

Then you want to use the build script in the following:

hello_lib/BUILD:

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

load("@rules_rust//rust:defs.bzl", "rust_binary", "rust_library")
load("@rules_rust//cargo:cargo_build_script.bzl", "cargo_build_script")

# This will run the build script from the root of the workspace, and
# collect the outputs.
cargo_build_script(
    name = "build_script",
    srcs = ["build.rs"],
    # Optional environment variables passed during build.rs compilation
    rustc_env = {
       "CARGO_PKG_VERSION": "0.1.2",
    },
    # Optional environment variables passed during build.rs execution.
    # Note that as the build script's working directory is not execroot,
    # execpath/location will return an absolute path, instead of a relative
    # one.
    build_script_env = {
        "SOME_TOOL_OR_FILE": "$(execpath @tool//:binary)"
    }
    # Optional data/tool dependencies
    data = ["@tool//:binary"],
)

rust_library(
    name = "hello_lib",
    srcs = [
        "src/lib.rs",
    ],
    deps = [":build_script"],
)

The hello_lib target will be build with the flags and the environment variables declared by the build script in addition to the file generated by it.

PARAMETERS

NameDescriptionDefault Value
nameThe name for the underlying rule. This should be the name of the package being compiled, optionally with a suffix of _build_script.none
crate_featuresA list of features to enable for the build script.[]
versionThe semantic version (semver) of the crate.None
depsThe dependencies of the crate.[]
build_script_envEnvironment variables for build scripts.{}
dataFiles needed by the build script.[]
toolsTools (executables) needed by the build script.[]
linksName of the native library this crate links against.None
rustc_envEnvironment variables to set in rustc when compiling the build script.{}
visibilityVisibility to apply to the generated build script output.None
tags(list of str, optional): Tags to apply to the generated build script output.None
kwargsForwards to the underlying rust_binary rule.none

cargo_env

A helper for generating platform specific environment variables

load("@rules_rust//rust:defs.bzl", "rust_common")
load("@rules_rust//cargo:defs.bzl", "cargo_bootstrap_repository", "cargo_env")

cargo_bootstrap_repository(
    name = "bootstrapped_bin",
    cargo_lockfile = "//:Cargo.lock",
    cargo_toml = "//:Cargo.toml",
    srcs = ["//:resolver_srcs"],
    version = rust_common.default_version,
    binary = "my-crate-binary",
    env = {
        "x86_64-unknown-linux-gnu": cargo_env({
            "FOO": "BAR",
        }),
    },
    env_label = {
        "aarch64-unknown-linux-musl": cargo_env({
            "DOC": "//:README.md",
        }),
    }
)

PARAMETERS

NameDescriptionDefault Value
envA map of environment variablesnone

RETURNS

str: A json encoded string of the environment variables