Skip to content

Commit 99c76af

Browse files
authored
Merge pull request #43 from tonistiigi/alpine-build
alpine based building via xx
2 parents e7205b9 + e38dff0 commit 99c76af

File tree

7 files changed

+50
-209
lines changed

7 files changed

+50
-209
lines changed

.github/buildkit.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
[worker.oci]
2+
max-parallelism = 4

.github/workflows/ci.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ jobs:
7474
-
7575
name: Set up Docker Buildx
7676
uses: docker/setup-buildx-action@v1
77+
with:
78+
config: .github/buildkit.toml
7779
-
7880
name: Test
7981
if: matrix.target == 'buildkit'

Dockerfile

Lines changed: 27 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,85 +1,52 @@
11
# syntax=docker/dockerfile:1.2
22

3+
ARG ALPINE_BASE=alpine:3.14
4+
35
ARG QEMU_VERSION
46
ARG 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
813
ARG QEMU_VERSION
914
ARG QEMU_REPO
1015
WORKDIR /src
1116
RUN 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 / /
6330
ENV PATH=/qemu/install-scripts:$PATH
6431
WORKDIR /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

7641
FROM base AS build
7742
ARG TARGETPLATFORM
78-
ARG QEMU_VERSION
43+
ARG QEMU_VERSION QEMU_TARGETS
44+
ENV AR=llvm-ar STRIP=llvm-strip
7945
RUN --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

8451
ARG BINARY_PREFIX
8552
RUN 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
8855
RUN 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
9258
FROM --platform=$BUILDPLATFORM golang:1.16-alpine AS binfmt
93-
COPY --from=xgo / /
59+
COPY --from=xx / /
9460
ENV CGO_ENABLED=0
9561
ARG TARGETPLATFORM
9662
ARG QEMU_VERSION
9763
WORKDIR /src
9864
RUN apk add --no-cache git
9965
RUN --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

10471
FROM scratch AS binaries
10572
ARG BINARY_PREFIX
@@ -110,7 +77,7 @@ COPY --from=build-archive /archive/* /
11077

11178
FROM --platform=$BUILDPLATFORM tonistiigi/bats-assert AS assert
11279

113-
FROM golang:alpine AS buildkit-test
80+
FROM golang:1.16-alpine AS buildkit-test
11481
RUN apk add --no-cache bash bats
11582
WORKDIR /work
11683
COPY --from=assert . .

docker-bake.hcl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ target "all-arch" {
3939
"linux/s390x",
4040
"linux/riscv64",
4141
"linux/386",
42-
"linux/mips64le"
4342
]
4443
}
4544

scripts/configure_qemu.sh

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,18 @@
33
set -e
44

55
: ${QEMU_TARGETS=}
6-
: ${FLAG_CROSS_PREFIX=}
76

8-
arch="$(cross.sh arch)"
97

10-
if [ "$arch" != "x86_64" ]; then
8+
arch="$(xx-info arch)"
9+
10+
if [ -z "$QEMU_TARGETS" ]; then
11+
if [ "$arch" != "amd64" ]; then
1112
QEMU_TARGETS="$QEMU_TARGETS x86_64-linux-user"
1213
fi
13-
if [ "$arch" != "aarch64" ]; then
14+
if [ "$arch" != "arm64" ]; then
1415
QEMU_TARGETS="$QEMU_TARGETS aarch64-linux-user"
1516
fi
16-
if [ "$arch" != "armv7l" ] && [ "$arch" != "armv6l" ] ; then
17+
if [ "$arch" != "arm" ]; then
1718
QEMU_TARGETS="$QEMU_TARGETS arm-linux-user"
1819
fi
1920
if [ "$arch" != "riscv64" ]; then
@@ -22,10 +23,10 @@ fi
2223
if [ "$arch" != "ppc64le" ]; then
2324
QEMU_TARGETS="$QEMU_TARGETS ppc64le-linux-user"
2425
fi
25-
if [ "$arch" != "s390x" ] && [ "$arch" != "riscv64" ] ; then
26+
if [ "$arch" != "s390x" ]; then
2627
QEMU_TARGETS="$QEMU_TARGETS s390x-linux-user"
2728
fi
28-
if [ "$arch" != "i386" ] ; then
29+
if [ "$arch" != "386" ] ; then
2930
QEMU_TARGETS="$QEMU_TARGETS i386-linux-user"
3031
fi
3132
if [ "$arch" != "mips64le" ] ; then
@@ -34,9 +35,6 @@ fi
3435
if [ "$arch" != "mips64" ] ; then
3536
QEMU_TARGETS="$QEMU_TARGETS mips64-linux-user"
3637
fi
37-
38-
if cross.sh is_cross; then
39-
FLAG_CROSS_PREFIX="--cross-prefix=$(cross.sh cross-prefix)-"
4038
fi
4139

4240
set -x
@@ -67,4 +65,14 @@ set -x
6765
--disable-sdl \
6866
--disable-spice \
6967
--disable-tools \
70-
--disable-vte $FLAG_CROSS_PREFIX --target-list="$QEMU_TARGETS"
68+
--disable-vte \
69+
--disable-werror \
70+
--disable-debug-info \
71+
--disable-glusterfs \
72+
--cross-prefix=$(xx-info)- \
73+
--host-cc=$(xx-clang --print-target-triple)-clang \
74+
--host=$(xx-clang --print-target-triple) \
75+
--build=$(TARGETPLATFORM= TARGETPAIR= xx-clang --print-target-triple) \
76+
--cc=$(xx-clang --print-target-triple)-clang \
77+
--extra-ldflags=-latomic \
78+
--target-list="$QEMU_TARGETS"

scripts/cross.sh

Lines changed: 0 additions & 131 deletions
This file was deleted.

scripts/riscv64-buildroot-linux-gnu-pkg-config

Lines changed: 0 additions & 6 deletions
This file was deleted.

0 commit comments

Comments
 (0)