Files
codex/codex-rs/buck2/codex_rust_toolchain.bzl
2025-12-23 22:40:55 -08:00

100 lines
4.4 KiB
Python

load("@prelude//rust:rust_toolchain.bzl", "PanicRuntime", "RustToolchainInfo")
_DEFAULT_TRIPLE = select({
"prelude//os:linux": select({
"prelude//cpu:arm64": "aarch64-unknown-linux-gnu",
"prelude//cpu:riscv64": "riscv64gc-unknown-linux-gnu",
"prelude//cpu:x86_64": "x86_64-unknown-linux-gnu",
}),
"prelude//os:macos": select({
"prelude//cpu:arm64": "aarch64-apple-darwin",
"prelude//cpu:x86_64": "x86_64-apple-darwin",
}),
"prelude//os:windows": select({
"prelude//cpu:arm64": select({
# Rustup's default ABI for the host on Windows is MSVC, not GNU.
"DEFAULT": "aarch64-pc-windows-msvc",
"prelude//abi:gnu": "aarch64-pc-windows-gnu",
"prelude//abi:msvc": "aarch64-pc-windows-msvc",
}),
"prelude//cpu:x86_64": select({
"DEFAULT": "x86_64-pc-windows-msvc",
"prelude//abi:gnu": "x86_64-pc-windows-gnu",
"prelude//abi:msvc": "x86_64-pc-windows-msvc",
}),
}),
})
def _codex_rust_toolchain_impl(ctx):
# Buck doesn't have a built-in notion of "Cargo profiles", but it's useful
# to provide a simple local knob that roughly matches `cargo build` vs
# `cargo build --release`.
#
# Default is "dev" to match local development expectations.
rust_profile = read_config("codex", "rust_profile", "dev")
extra_rustc_flags = []
if rust_profile == "release":
# Roughly mirrors Cargo's release defaults (not a perfect match).
extra_rustc_flags = [
"-C",
"opt-level=3",
"-C",
"debuginfo=0",
]
return [
DefaultInfo(),
RustToolchainInfo(
allow_lints = ctx.attrs.allow_lints,
clippy_driver = RunInfo(args = [ctx.attrs.clippy_driver]),
clippy_toml = ctx.attrs.clippy_toml[DefaultInfo].default_outputs[0] if ctx.attrs.clippy_toml else None,
compiler = RunInfo(args = [ctx.attrs.rustc]),
default_edition = ctx.attrs.default_edition,
deny_lints = ctx.attrs.deny_lints,
doctests = ctx.attrs.doctests,
nightly_features = ctx.attrs.nightly_features,
panic_runtime = PanicRuntime("unwind"),
report_unused_deps = ctx.attrs.report_unused_deps,
rustc_binary_flags = ctx.attrs.rustc_binary_flags,
rustc_flags = ctx.attrs.rustc_flags + extra_rustc_flags,
rustc_target_triple = ctx.attrs.rustc_target_triple,
rustc_test_flags = ctx.attrs.rustc_test_flags,
rustdoc = RunInfo(args = [ctx.attrs.rustdoc]),
rustdoc_flags = ctx.attrs.rustdoc_flags,
warn_lints = ctx.attrs.warn_lints,
# Enable the prelude's "metadata-only rlib" behavior consistently
# across the crate graph. This avoids rustc "found possibly newer
# version of crate ..." (E0460) mismatches between binaries and
# libraries in large Rust graphs.
advanced_unstable_linking = ctx.attrs.advanced_unstable_linking,
),
]
codex_rust_toolchain = rule(
impl = _codex_rust_toolchain_impl,
attrs = {
"advanced_unstable_linking": attrs.bool(default = True),
"allow_lints": attrs.list(attrs.string(), default = []),
# Prefer explicit tool paths so the Buck execution directory doesn't
# affect rustup toolchain resolution.
"clippy_driver": attrs.string(default = "clippy-driver"),
"clippy_toml": attrs.option(attrs.dep(providers = [DefaultInfo]), default = None),
"default_edition": attrs.option(attrs.string(), default = None),
"deny_lints": attrs.list(attrs.string(), default = []),
"doctests": attrs.bool(default = False),
"nightly_features": attrs.bool(default = False),
"report_unused_deps": attrs.bool(default = False),
"rustc": attrs.string(default = "rustc"),
"rustc_binary_flags": attrs.list(attrs.arg(), default = []),
"rustc_flags": attrs.list(attrs.arg(), default = []),
"rustc_target_triple": attrs.string(default = _DEFAULT_TRIPLE),
"rustc_test_flags": attrs.list(attrs.arg(), default = []),
"rustdoc": attrs.string(default = "rustdoc"),
"rustdoc_flags": attrs.list(attrs.arg(), default = []),
"warn_lints": attrs.list(attrs.string(), default = []),
},
is_toolchain_rule = True,
)