recipes/ripgrep: rg Rust-nativo (Etapa C pieza 4)

ripgrep 14.1.1 (tag, commit 4649aa97) como receta Cargo, mismo patrón que
uutils/findutils/diffutils. Es su propio workspace ⇒ sin patch [workspace].
Estático musl, zig cc sólo linker; MSRV 1.72 ≤ 1.91.1.

ripgrep-no-jemalloc.patch: ripgrep mete jemallocator incondicional en musl64,
pero jemalloc-sys compila C (autotools) y embebe rutas de OUT_DIR ⇒ rompería la
reproducibilidad bit-a-bit del lab. El patch lo quita (dep Cargo.toml + stanzas
Cargo.lock + global_allocator en main.rs) ⇒ build 100% Rust, hermético, con el
allocator de musl. PCRE2 ya es opt-in ⇒ regex puro, sin C.

Construye+sella+corre: ELF static sin interpreter, `ripgrep 14.1.1
features:-pcre2`, búsqueda recursiva/glob OK. `rg` no es flag-compatible con
POSIX grep ⇒ no se symlinkea a grep; convive con el grep interino.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-20 13:16:45 -04:00
co-authored by Claude Opus 4.8
parent 4dfb0ff127
commit ffaccb9a98
2 changed files with 107 additions and 0 deletions
+69
View File
@@ -0,0 +1,69 @@
diff --git a/Cargo.lock b/Cargo.lock
index 5ca69a0..0f0a13c 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -222,26 +222,6 @@ version = "1.0.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"
-[[package]]
-name = "jemalloc-sys"
-version = "0.5.4+5.3.0-patched"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ac6c1946e1cea1788cbfde01c993b52a10e2da07f4bac608228d1bed20bfebf2"
-dependencies = [
- "cc",
- "libc",
-]
-
-[[package]]
-name = "jemallocator"
-version = "0.5.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a0de374a9f8e63150e6f5e8a60cc14c668226d7a347d8aee1a45766e3c4dd3bc"
-dependencies = [
- "jemalloc-sys",
- "libc",
-]
-
[[package]]
name = "jobserver"
version = "0.1.32"
@@ -367,7 +347,6 @@ dependencies = [
"bstr",
"grep",
"ignore",
- "jemallocator",
"lexopt",
"log",
"serde",
diff --git a/Cargo.toml b/Cargo.toml
index 2ec69c9..1aa4881 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -59,8 +59,6 @@ serde_json = "1.0.23"
termcolor = "1.1.0"
textwrap = { version = "0.16.0", default-features = false }
-[target.'cfg(all(target_env = "musl", target_pointer_width = "64"))'.dependencies.jemallocator]
-version = "0.5.0"
[dev-dependencies]
serde = "1.0.77"
diff --git a/crates/core/main.rs b/crates/core/main.rs
index 64f35ce..34a5473 100644
--- a/crates/core/main.rs
+++ b/crates/core/main.rs
@@ -35,9 +35,9 @@ mod search;
//
// Moreover, we only do this on 64-bit systems since jemalloc doesn't support
// i686.
-#[cfg(all(target_env = "musl", target_pointer_width = "64"))]
-#[global_allocator]
-static ALLOC: jemallocator::Jemalloc = jemallocator::Jemalloc;
+// hammer (Etapa C): jemalloc se quita a propósito. Su build C (jemalloc-sys, autotools) embebe
+// rutas de OUT_DIR ⇒ rompe la reproducibilidad bit-a-bit que exige el lab. Usamos el allocator
+// de musl (más lento, pero ripgrep no es allocation-heavy y el build queda 100% Rust, hermético).
/// Then, as it was, then again it will be.
fn main() -> ExitCode {
+38
View File
@@ -0,0 +1,38 @@
# BurntSushi/ripgrep 14.1.1 — `rg`, búsqueda recursiva Rust-nativa (la herramienta grep-family
# madura del ecosistema Rust).
#
# Etapa C pieza 4 (userland Rust-nativo): mismo patrón que uutils/findutils/diffutils — adoptar una
# reimplementación MADURA (MIT/Unlicense) como receta Cargo. ripgrep YA es su propio workspace Cargo
# (root + crates/*), así que NO necesita el patch [workspace] vacío de los crates sueltos. Esquiva el
# bug de zig por construcción: codegen rustc/LLVM, `zig cc` sólo como linker.
#
# `rg` NO es flag-compatible con POSIX grep (otra UX); no lo symlinkeamos a `grep`. Convive con el
# busybox/GNU grep interino (igual que el `sh ash` interino) y aporta la búsqueda moderna del sistema.
#
# Fuente git pinned al tag 14.1.1 (ADR 0006); ripgrep commitea su Cargo.lock ⇒ vendor + `--locked`
# bit-reproducible (MSRV 1.72 ≤ 1.91.1 del sandbox, ver memoria cargo-recipe-msrv-ceiling). Estático
# musl con zig cc (sin loader del host).
name = "ripgrep"
version = "14.1.1"
[source]
repo = "https://github.com/BurntSushi/ripgrep"
commit = "4649aa9700619f94cf9c66876e9549d83420e16c"
# ripgrep mete jemallocator INCONDICIONAL en musl64 (perf), pero jemalloc-sys compila C por autotools
# y embebe rutas de OUT_DIR ⇒ rompe la reproducibilidad bit-a-bit del lab. El patch lo quita (dep en
# Cargo.toml + stanzas en Cargo.lock + el global_allocator en main.rs) ⇒ build 100% Rust, hermético,
# con el allocator de musl. PCRE2 ya es opt-in (no default) ⇒ regex puro, sin C.
patches = ["ripgrep-no-jemalloc.patch"]
[build]
compiler = "zig-cc"
target = "x86_64-linux-musl"
link = "static"
# `--bin rg`: el workspace tiene libs (grep, grep-*, ignore, …) + el bin `rg` del paquete ripgrep;
# `cargo rustc -- <flags>` exige UN solo target.
flags = ["--bin", "rg"]
# Install: un único binario, sin applets ni symlinks (a diferencia de coreutils/findutils multicall).
[build.phases]
install = "mkdir -p /out/usr/bin && cp target/release/rg /out/usr/bin/rg"