wild (https://github.com/davidlattimore/wild) is a Rust-native linker, typically 10-30% faster than mold on large release-LTO links. We have ~5 service binaries each doing release-LTO link, so the saving is meaningful: ~30-90 sec wall-time on a fresh compile. Approach (CI-only swap, zero local-dev impact): 1. Dockerfile.ci-builder-cpu installs wild 0.8.0 alongside mold (both linkers present; revert path is trivial). 2. .cargo/config.toml keeps `-fuse-ld=mold` as the file default so `cargo build` works locally without requiring wild on PATH. 3. compile-and-deploy-template.yaml's compile-services script does an in-place sed substitution `mold -> wild` immediately before `cargo build`, gated on `command -v wild` so a missing binary silently falls back to mold instead of failing the build. Why sed-in-script over RUSTFLAGS env var: RUSTFLAGS env var REPLACES the entire target.<triple>.rustflags array (per cargo docs precedence: env > target > build, mutually exclusive — they do NOT merge), which would silently drop our existing -Wl,-z,relro/--as-needed/target-cpu flags. Sed swap edits one token while preserving everything else. Validation: - python3 yaml.safe_load_all parses the template - cargo check --workspace --release --locked succeeds locally (still using mold per the unchanged config.toml default) - Dockerfile syntax visually verified; wild tarball URL confirmed live via curl https://api.github.com/repos/davidlattimore/wild/releases/latest Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
4.9 KiB
4.9 KiB