VERSION 0.6 FROM rust:latest ENV CARGO_HOME=/deps ARG APP_NAME=live-cli WORKDIR /work deps: COPY ./Cargo.toml ./Cargo.lock . # This is a binary program, expose a main.rs file RUN mkdir src && touch src/main.rs RUN cargo fetch SAVE ARTIFACT /deps rust-builder: # Linux RUN rustup target add x86_64-unknown-linux-musl RUN rustup target add i686-unknown-linux-musl RUN rustup target add i686-unknown-linux-musl RUN rustup target add aarch64-unknown-linux-musl RUN rustup target add arm-unknown-linux-musleabi RUN rustup target add armv7-unknown-linux-musleabi # Windows RUN rustup target add x86_64-pc-windows-gnu RUN rustup target add i686-pc-windows-gnu RUN apt-get update RUN DEBIAN_FRONTEND=noninteractive apt-get install -y gcc-arm-linux-gnueabi gcc-aarch64-linux-gnu gdb-mingw-w64 gcc-mingw-w64-x86-64 gcc-mingw-w64-i686 RUN cargo install cargo-deb SAVE IMAGE docker-wg:5000/rust-builder build: FROM +rust-builder COPY +deps/deps /deps ARG TOOLCHAIN # Cache whatever dependency builds you can COPY ./Cargo.toml ./Cargo.lock . RUN \ mkdir src && touch src/lib.rs && \ cargo build --offline --release --target "$TOOLCHAIN" --jobs 1 && \ rm src/lib.rs && rmdir src && \ : # Actually build the program COPY . . RUN cargo build --offline --release --target "$TOOLCHAIN" --jobs 1 ARG EXT ARG STRIP_CMD RUN if [ "$STRIP_CMD" ]; then "$STRIP_CMD" "target/$TOOLCHAIN/release/$APP_NAME$EXT"; fi # --force for windows since multiple hardlinks RUN xz --force --keep "target/$TOOLCHAIN/release/$APP_NAME$EXT" # Also build a deb file IF [ -z "${TOOLCHAIN##*-linux-*}" ] RUN echo "Building deb for ${TOOLCHAIN}" RUN cargo deb --target "${TOOLCHAIN}" SAVE ARTIFACT target/$TOOLCHAIN/debian/$APP_NAME_*.deb AS LOCAL dist/ END # SAVE ARTIFACT target/$TOOLCHAIN/release/$APP_NAME$EXT AS LOCAL dist/ SAVE ARTIFACT target/$TOOLCHAIN/release/$APP_NAME$EXT.xz AS LOCAL dist/$APP_NAME-$TOOLCHAIN$EXT.xz all: BUILD --build-arg TOOLCHAIN=x86_64-unknown-linux-musl --build-arg STRIP_CMD=x86_64-linux-gnu-strip +build BUILD --build-arg TOOLCHAIN=i686-unknown-linux-musl --build-arg STRIP_CMD=x86_64-linux-gnu-strip +build BUILD --build-arg TOOLCHAIN=aarch64-unknown-linux-musl --build-arg STRIP_CMD=aarch64-linux-gnu-strip +build BUILD --build-arg TOOLCHAIN=arm-unknown-linux-musleabi --build-arg STRIP_CMD=arm-linux-gnueabi-strip +build BUILD --build-arg TOOLCHAIN=armv7-unknown-linux-musleabi --build-arg STRIP_CMD=arm-linux-gnueabi-strip +build BUILD --build-arg TOOLCHAIN=x86_64-pc-windows-gnu --build-arg STRIP_CMD= --build-arg EXT=.exe +build BUILD --build-arg TOOLCHAIN=i686-pc-windows-gnu --build-arg STRIP_CMD= --build-arg EXT=.exe +build