11# syntax=docker/dockerfile:1.2
22
3+ ARG ALPINE_BASE=alpine:3.14
4+
35ARG QEMU_VERSION
46ARG QEMU_REPO=https://github.com/qemu/qemu
57
6- FROM --platform=$BUILDPLATFORM debian:buster AS src
7- RUN apt-get update && apt-get install -y git
8+ # xx is a helper for cross-compilation
9+ FROM --platform=$BUILDPLATFORM tonistiigi/xx@sha256:56b19a5fb89b99195ec494d59ad34370d14540858c1f56c560ec1e7f2d1c177f AS xx
10+
11+ FROM --platform=$BUILDPLATFORM ${ALPINE_BASE} AS src
12+ RUN apk add --no-cache git patch
813ARG QEMU_VERSION
914ARG QEMU_REPO
1015WORKDIR /src
1116RUN git clone $QEMU_REPO && \
17+ git clone --depth 1 -b 3.14-stable https://github.com/alpinelinux/aports.git && \
1218 cd qemu && \
1319 git checkout $QEMU_VERSION && \
20+ for f in ../aports/community/qemu/*.patch; do patch -p1 < $f; done && \
1421 scripts/git-submodule.sh update \
1522 ui/keycodemapdb \
1623 tests/fp/berkeley-testfloat-3 \
1724 tests/fp/berkeley-softfloat-3 \
1825 dtc slirp
1926
20- FROM --platform=$BUILDPLATFORM debian:buster AS qemu
21-
22- RUN apt-get update && \
23- apt-get install -y \
24- dpkg-dev \
25- git \
26- ninja-build \
27- pkg-config \
28- python3 \
29- python3-setuptools
30-
31- WORKDIR /qemu
32-
33- ARG TARGETPLATFORM
34-
35- ENV PATH=/qemu/install-scripts:$PATH
36- RUN --mount=target=./install-scripts,src=scripts \
37- TARGETPLATFORM=${TARGETPLATFORM} cross.sh install gcc libglib2.0-dev | sh
38-
39- FROM qemu AS base-amd64
40- FROM qemu AS base-arm64
41- FROM qemu AS base-ppc64le
42- FROM qemu AS base-s390x
43- FROM qemu AS base-armv7
44- FROM qemu AS base-armv6
45- FROM qemu AS base-386
46- FROM qemu AS base-mips64le
47-
48- FROM tonistiigi/debian:riscv AS riscv-libglibc
49- RUN apt-get update && apt-get install -y libglib2.0-dev
50-
51- RUN for f in $(dpkg-query -L zlib1g-dev libglib2.0-dev libpcre3-dev libglib2.0-0 libpcre3); do [ ! -d $f ] && echo $f; done > /tmp/list
52- RUN mkdir -p /out && tar cvf /out/libglibc.tar -T /tmp/list
53-
54- FROM tonistiigi/xx:riscv-toolchain AS base-riscv64
55- RUN apt-get update && \
56- apt-get install -y \
57- dpkg-dev \
58- git \
59- ninja-build \
60- pkg-config \
61- python3 \
62- python3-setuptools
27+ FROM --platform=$BUILDPLATFORM ${ALPINE_BASE} AS base
28+ RUN apk add --no-cache git clang lld python3 llvm make ninja pkgconfig glib-dev gcc musl-dev perl bash
29+ COPY --from=xx / /
6330ENV PATH=/qemu/install-scripts:$PATH
6431WORKDIR /qemu
6532
66- RUN --mount=from=riscv-libglibc,target=/riscv-libglibc,src=out \
67- mkdir -p /tmp/out && tar xvf /riscv-libglibc/libglibc.tar -C /tmp/out && \
68- cp -a /tmp/out/usr/include/* /usr/riscv64-linux-gnu/include/ && \
69- cp -a /tmp/out/usr/lib/riscv64-linux-gnu/* /usr/riscv64-linux-gnu/lib/ && \
70- cp -a /tmp/out/usr/lib/* /usr/riscv64-linux-gnu/lib/ && \
71- ln -s /usr/riscv64-linux-gnu /usr/riscv64-buildroot-linux-gnu
72- ENV CROSS_PREFIX=riscv64-buildroot-linux-gnu
33+ ARG TARGETPLATFORM
34+ RUN xx-apk add musl-dev gcc glib-dev glib-static linux-headers zlib-static
35+ RUN set -e; \
36+ [ "$(xx-info arch)" = "ppc64le" ] && XX_CC_PREFER_LINKER=ld xx-clang --setup-target-triple; \
37+ [ "$(xx-info arch)" = "386" ] && XX_CC_PREFER_LINKER=ld xx-clang --setup-target-triple; \
38+ true
7339
74- FROM base-$TARGETARCH$TARGETVARIANT AS base
7540
7641FROM base AS build
7742ARG TARGETPLATFORM
78- ARG QEMU_VERSION
43+ ARG QEMU_VERSION QEMU_TARGETS
44+ ENV AR=llvm-ar STRIP=llvm-strip
7945RUN --mount=target=.,from=src,src=/src/qemu,rw --mount=target=./install-scripts,src=scripts \
8046 TARGETPLATFORM=${TARGETPLATFORM} configure_qemu.sh && \
8147 make -j "$(getconf _NPROCESSORS_ONLN)" && \
82- make install
48+ make install && \
49+ cd /usr/bin && for f in $(ls qemu-*); do xx-verify $f; done
8350
8451ARG BINARY_PREFIX
8552RUN cd /usr/bin; [ -z "$BINARY_PREFIX" ] || for f in $(ls qemu-*); do ln -s $f $BINARY_PREFIX$f; done
@@ -88,18 +55,18 @@ FROM build AS build-archive
8855RUN cd /usr/bin && mkdir -p /archive && \
8956 tar czvfh "/archive/${BINARY_PREFIX}qemu_${QEMU_VERSION}_$(echo $TARGETPLATFORM | sed 's/\/ /-/g').tar.gz" ${BINARY_PREFIX}qemu*
9057
91- FROM --platform=$BUILDPLATFORM tonistiigi/xx:golang@sha256:6f7d999551dd471b58f70716754290495690efa8421e0a1fcf18eb11d0c0a537 AS xgo
9258FROM --platform=$BUILDPLATFORM golang:1.16-alpine AS binfmt
93- COPY --from=xgo / /
59+ COPY --from=xx / /
9460ENV CGO_ENABLED=0
9561ARG TARGETPLATFORM
9662ARG QEMU_VERSION
9763WORKDIR /src
9864RUN apk add --no-cache git
9965RUN --mount=target=. \
100- TARGETPLATFORM=$TARGETPLATFORM go build \
66+ TARGETPLATFORM=$TARGETPLATFORM xx- go build \
10167 -ldflags "-X main.revision=$(git rev-parse --short HEAD) -X main.qemuVersion=${QEMU_VERSION}" \
102- -o /go/bin/binfmt ./cmd/binfmt
68+ -o /go/bin/binfmt ./cmd/binfmt && \
69+ xx-verify /go/bin/binfmt
10370
10471FROM scratch AS binaries
10572ARG BINARY_PREFIX
@@ -110,7 +77,7 @@ COPY --from=build-archive /archive/* /
11077
11178FROM --platform=$BUILDPLATFORM tonistiigi/bats-assert AS assert
11279
113- FROM golang:alpine AS buildkit-test
80+ FROM golang:1.16- alpine AS buildkit-test
11481RUN apk add --no-cache bash bats
11582WORKDIR /work
11683COPY --from=assert . .
0 commit comments