Cross compile matrix
Skill zakelfassi/skills-driven-development/examples/cli-tool/skills/cross-compile-matrix
Agents that learn by doing — and remember how they did it. A methodology for AI agents to create, evolve, and share reusable skills.
npx -y skills add zakelfassi/skills-driven-development --skill cross-compile-matrixAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 17 stars17 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Add a new target triple to the shipctl cross-platform build matrix — CI YAML, Makefile, and a smoke test. Use when adding support for a new OS/architecture, when a user requests a new platform binary, or when a target triple is missing from the release artifacts.
SKILL.md
3.4 KB, as published. Nobody here has run it
Cross-Compile Matrix
Add a new target triple to the build matrix so CI produces a binary for the new platform.
Inputs
- Target triple (e.g.,
aarch64-apple-darwin,x86_64-pc-windows-gnu) - Cross-compiler image (Docker image or
nativeif the runner natively supports the target) - Smoke test command (a simple invocation to verify the binary works, e.g.,
shipctl --version)
Steps
-
Verify the triple is valid
rustup target list | grep {triple}For Go: check
go tool dist list | grep {os}/{arch}. -
Add the target to the CI matrix Edit
.github/workflows/release.yml— add the triple to thematrix.targetarray:strategy: matrix: include: - target: {triple} runner: ubuntu-latest # or macos-latest, windows-latest cross: true # false if runner supports the target natively image: ghcr.io/cross-rs/{triple}:latest # omit if cross: false -
Add the Makefile target
build-{safe-triple}: cargo build --release --target {triple} mkdir -p dist cp target/{triple}/release/shipctl dist/shipctl-{triple}{safe-triple}replaces-with_in Make target names. -
Register the rustup target (Rust only)
rustup target add {triple}For CI: add to the
rustup target addstep in the workflow. -
Add a smoke test step in the workflow:
- name: Smoke test ({triple}) run: ./dist/shipctl-{triple} --version if: matrix.target == '{triple}'If cross-testing is not feasible (e.g., Windows binary on a Linux runner), document this in a comment.
-
Test locally (if the host supports the target)
make build-{safe-triple} ./dist/shipctl-{triple} --version -
Update the release notes template Add a row to
docs/install.md:| {OS} | {Arch} | `{triple}` | `shipctl-{version}-{triple}.tar.gz` |
Conventions
- Target naming in artifacts:
shipctl-{version}-{triple}.tar.gz - Windows targets produce
.exeand are archived as.zipinstead of.tar.gz musltargets are preferred for Linux binaries to avoid glibc dependency issues- All targets are smoke-tested in CI before a release is published
Edge Cases
- Cross-compilation fails with linker errors: Switch to the
cross-rsDocker image for that triple; add theimage:field in the matrix. - Target is tier 3 (Rust): Add a comment noting reduced support guarantees; test manually before each release.
- macOS arm64 on amd64 runner: Use
--target aarch64-apple-darwinwith Rosetta or a self-hosted arm64 runner; document in the workflow. - Windows MSVC vs GNU: Prefer
x86_64-pc-windows-msvcfor best compatibility; GNU works but requires MinGW on the runner.