diff --git a/rust/private/rustc.bzl b/rust/private/rustc.bzl index 2d787c12ad..d33fa8fa11 100644 --- a/rust/private/rustc.bzl +++ b/rust/private/rustc.bzl @@ -119,13 +119,30 @@ def _get_rustc_env(attr, toolchain, crate_name): Returns: dict: Rustc environment variables """ + version = getattr(attr, "version", "0.0.0") + version_without_build_metadata = version.split("+", 1)[0] + major, minor, patch = version_without_build_metadata.split(".", 2) + if "-" in patch: + patch, pre = patch.split("-", 1) + else: + pre = "" + result = { "CARGO_CFG_TARGET_ARCH": "" if toolchain.target_arch == None else toolchain.target_arch, "CARGO_CFG_TARGET_OS": "" if toolchain.target_os == None else toolchain.target_os, "CARGO_CRATE_NAME": crate_name, - # CARGO_PKG_NAME and CARGO_PKG_VERSION are commonly needed by clap derive macros. + # Cargo always defines these package variables, even when the manifest + # omits the corresponding optional fields. Clap derive macros consume + # AUTHORS and DESCRIPTION for `author` and `about` attributes. + "CARGO_PKG_AUTHORS": "", + "CARGO_PKG_DESCRIPTION": "", + "CARGO_PKG_HOMEPAGE": "", "CARGO_PKG_NAME": attr.name, - "CARGO_PKG_VERSION": getattr(attr, "version", "0.0.0"), + "CARGO_PKG_VERSION": version, + "CARGO_PKG_VERSION_MAJOR": major, + "CARGO_PKG_VERSION_MINOR": minor, + "CARGO_PKG_VERSION_PATCH": patch, + "CARGO_PKG_VERSION_PRE": pre, } return result diff --git a/test/build_env/BUILD.bazel b/test/build_env/BUILD.bazel index c0d5410e92..f34f4a13ec 100644 --- a/test/build_env/BUILD.bazel +++ b/test/build_env/BUILD.bazel @@ -12,7 +12,7 @@ rust_test( srcs = ["tests/custom_crate_name.rs"], crate_name = "custom_crate_name", edition = "2018", - version = "1.2.3", + version = "1.2.3-alpha.1+build.5", ) rust_library( diff --git a/test/build_env/tests/custom_crate_name.rs b/test/build_env/tests/custom_crate_name.rs index 146991b4ae..0b6d0189b2 100644 --- a/test/build_env/tests/custom_crate_name.rs +++ b/test/build_env/tests/custom_crate_name.rs @@ -1,6 +1,13 @@ #[test] fn cargo_env_vars() { + assert_eq!(env!("CARGO_PKG_AUTHORS"), ""); + assert_eq!(env!("CARGO_PKG_DESCRIPTION"), ""); + assert_eq!(env!("CARGO_PKG_HOMEPAGE"), ""); assert_eq!(env!("CARGO_PKG_NAME"), "cargo_pkg_env_test"); - assert_eq!(env!("CARGO_PKG_VERSION"), "1.2.3"); + assert_eq!(env!("CARGO_PKG_VERSION"), "1.2.3-alpha.1+build.5"); + assert_eq!(env!("CARGO_PKG_VERSION_MAJOR"), "1"); + assert_eq!(env!("CARGO_PKG_VERSION_MINOR"), "2"); + assert_eq!(env!("CARGO_PKG_VERSION_PATCH"), "3"); + assert_eq!(env!("CARGO_PKG_VERSION_PRE"), "alpha.1"); assert_eq!(env!("CARGO_CRATE_NAME"), "custom_crate_name"); }