[package]
name = "rustup"
version = "1.29.0"
edition = "2024"
license = "MIT OR Apache-2.0"
description = "Manage multiple rust installations with ease"
homepage = "https://github.com/rust-lang/rustup"
keywords = ["rustup", "multirust", "install", "proxy"]
readme = "README.md"
repository = "https://github.com/rust-lang/rustup"
build = "build.rs"

[features]
curl-backend = ["dep:curl"]
default = ["curl-backend", "reqwest-native-tls", "reqwest-rustls-tls"]

vendored-openssl = ['openssl/vendored']

reqwest-native-tls = ["reqwest/native-tls", "dep:reqwest", "dep:env_proxy"]
reqwest-rustls-tls = [
  "reqwest/rustls-no-provider",
  "dep:env_proxy",
  "dep:reqwest",
  "dep:rustls",
  "dep:rustls-platform-verifier",
]

# Include in the default set to disable self-update and uninstall.
no-self-update = []

# Include an Opentelemetry sink for tracing events
otel = [
  "dep:opentelemetry-otlp",
  "dep:tracing-opentelemetry",
  "dep:opentelemetry",
  "dep:opentelemetry_sdk",
]

# Exports code dependent on private interfaces for the integration test suite
test = ["dep:snapbox", "dep:walkdir", "clap-cargo/testing_colors"]

# Sorted by alphabetic order
[dependencies]
anstream = "1"
anstyle = "1.0.11"
anyhow = "1.0.69"
cfg-if = "1.0"
chrono = { version = "0.4", default-features = false, features = ["std"] }
clap = { version = "4", features = ["derive", "wrap_help", "string"] }
clap-cargo = "0.18.3"
clap_complete = "4"
console = "0.16"
curl = { version = "0.4.44", optional = true }
effective-limits = "0.5.5"
enum-map = "2.5.0"
env_proxy = { version = "0.4.1", optional = true }
flate2 = { version = "1.1.1", default-features = false, features = ["zlib-rs"] }
fs_at = "0.2.1"
futures-util = "0.3.31"
git-testament = "0.2"
home = "0.5.4"
indicatif = "0.18"
itertools = "0.14"
libc = "0.2"
opener = "0.8.0"
# `openssl` is used by `curl` or `reqwest` backend although it isn't imported by rustup: this
# allows controlling the vendoring status without exposing the presence of the download crate.
openssl = { version = "0.10", optional = true }
# HACK: Temporarily pinned due to ppc64 ELFv1/v2 ABI issue in 300.5.5, to be
# removed when <https://github.com/openssl/openssl/issues/29815> lands.
openssl-src = { version = "=300.5.4", optional = true }
opentelemetry = { version = "0.31", optional = true }
opentelemetry-otlp = { version = "0.31", features = ["grpc-tonic"], optional = true }
opentelemetry_sdk = { version = "0.31", features = ["rt-tokio"], optional = true }
platforms = "3.4"
pulldown-cmark = { version = "0.13", default-features = false }
rand = "0.10"
rayon = "1.10.0"
regex = "1"
remove_dir_all = { version = "1.0.0", features = ["parallel"] }
reqwest = { version = "0.13", default-features = false, features = ["blocking", "gzip", "http2", "socks", "stream"], optional = true }
retry = { version = "2", default-features = false, features = ["random"] }
rs_tracing = { version = "1.1", features = ["rs_tracing"] }
rustls = { version = "0.23", optional = true, default-features = false, features = ["logging", "aws_lc_rs", "tls12"] }
rustls-platform-verifier = { version = "0.6", optional = true }
same-file = "1"
semver = "1.0"
serde = { version = "1.0", features = ["derive"] }
sha2 = "0.10"
sharded-slab = "0.1.1"
strsim = "0.11"
tar = "0.4.26"
tempfile = "3.8"
thiserror = "2"
threadpool = "1"
tokio = { version = "1.26.0", default-features = false, features = ["macros", "rt-multi-thread", "sync"] }
tokio-retry = "0.3.0"
tokio-stream = "0.1.14"
toml = "1.0"
tracing = "0.1"
tracing-log = "0.2"
tracing-opentelemetry = { version = "0.32", optional = true }
# Newer versions render ANSI escape codes, causing CLI errors to be ugly
# See also https://github.com/tokio-rs/tracing/issues/3369
tracing-subscriber = { version = "=0.3.19", features = ["env-filter"] }
url = "2.4"
wait-timeout = "0.2"
xz2 = "0.1.3"
zstd = { version = "0.13", default-features = false }

# test only (depends on `test` feature)
snapbox = { version = "1", features = ["term-svg"], optional = true }
walkdir = { version = "2", optional = true }

[target."cfg(windows)".dependencies]
cc = "1"
scopeguard = "1"
windows-registry = "0.6"
windows-result = "0.4"

[target."cfg(windows)".dependencies.windows-sys]
features = [
  "Win32_Foundation",
  "Win32_Security",
  "Win32_Storage_FileSystem",
  "Win32_System_Console",
  "Win32_System_Diagnostics_ToolHelp",
  "Win32_System_IO",
  "Win32_System_Ioctl",
  "Win32_System_JobObjects",
  "Win32_System_Kernel",
  "Win32_System_LibraryLoader",
  "Win32_System_SystemInformation",
  "Win32_System_SystemServices",
  "Win32_System_Threading",
  "Win32_System_WindowsProgramming",
  "Win32_UI",
  "Win32_UI_WindowsAndMessaging",
]
version = "0.61"

[dev-dependencies]
enum-map = "2.5.0"
http-body-util = "0.1.0"
hyper = { version = "1.0", default-features = false, features = ["server", "http1"] }
hyper-util = { version = "0.1.1", features = ["tokio"] }
proptest = "1.1.0"
rustls-webpki = { version = "0.103.3" }
tokio-rustls = "0.26.4"
webpki-root-certs = "1"

[build-dependencies]
platforms = "3.4"

[lints.rust]
rust_2018_idioms = { level = "deny", priority = -1 }
unused_qualifications = "warn"

[lints.clippy]
# `dbg!()` and `todo!()` clearly shouldn't make it to production:
dbg_macro = "warn"
todo = "warn"
wildcard_imports = "warn"

[lib]
name = "rustup"
path = "src/lib.rs"

[profile.release]
codegen-units = 1
lto = true

# Reduce build time by setting proc-macro crates non optimized.
[profile.release.build-override]
opt-level = 0

[package.metadata.cargo-all-features]
# Building with no web backend will error.
always_include_features = ["reqwest-rustls-tls"]
