set -euo pipefail
usage() {
echo "$(
tput bold
tput setaf 74
)$0 [-h|--help] [-a|--arch arch] [-p|--platform platform] [docker_args --] [args...]$(tput sgr0)
cargo-docker: run a shell in a docker image with cargo set up correctly.
Takes the same args you would pass to cargo.
Without arguments runs an interactive shell.
OPTIONS:
--arch: build for a different arch to the current one ($(uname -m)), e.g. amd64 or arm64
--platform: build for a different platform to the current one (linux/$(uname -m)), e.g. linux/amd64 or linux/arm64
EXAMPLES:
\`meta/cargo-docker cargo build\` builds in debug.
\`meta/cargo-docker cargo test --release\` tests in release mode.
\`meta/cargo-docker --arch=amd64\` puts you in a shell in an Intel image.
\`meta/cargo-docker --arch=arm64 -- cargo build\` runs cargo build in an arm64 image
\`meta/cargo-docker --arch=arm64 -it -- cargo build\` runs cargo build in an interactive arm64 image
"
}
main() {
parse_args "$@"
: "${arch:="$(uname -m)"}"
case $arch in
x86_64 | amd64 | intel | linux/amd64) docker_arch=amd64 rust_arch=x86_64 ;;
arm64 | aarch64 | arm | linux/arm64) docker_arch=arm64 rust_arch=aarch64 ;;
*) error "Unknown architecture '$arch'" ;;
esac
unset arch
if [[ "${#build_args[@]}" == 0 ]]; then
docker_args+=(-it)
fi
set -x
docker run --rm "${docker_args[@]}" \
--platform="linux/$docker_arch" \
-e CC=musl-gcc \
-e AR=ar \
-e RANLIB=ranlib \
-e CARGO_BUILD_TARGET="${rust_arch}-unknown-linux-musl" \
-v "${CARGO_HOME:-$HOME/.cargo}"/registry:/root/.cargo/registry \
-v "$PWD":/code \
-v "$HOME"/.netrc:/root/.netrc \
-w /code \
clux/muslrust:stable \
"${build_args[@]}"
}
parse_args() {
docker_args=()
build_args=()
while [[ $# != 0 ]]; do
[[ ${1:-} =~ ^(--help|-h)$ ]] && {
usage
exit
}
[[ ${1:-} =~ ^(--arch|-a)$ ]] && {
arch=$2
shift 2
continue
}
[[ ${1:-} =~ ^(--platform|-p)$ ]] && {
arch=$2
shift 2
continue
}
[[ $1 == "--" ]] && {
shift
docker_args=("${build_args[@]}")
build_args=("${@}")
shift "$#"
return
}
[[ $# != 0 ]] && {
build_args+=("$1")
shift 1
continue
}
done
}
error() {
local RED='\033[0;31m' NC='\033[0m'
echo -e "${RED}Error:${NC} $1"
exit "${2:-1}"
}
main "$@"