Skip to content

Commit 6292821

Browse files
author
Paulo Gomes
committed
Optimise cross compilation time
Signed-off-by: Paulo Gomes <[email protected]>
1 parent 990b4a3 commit 6292821

File tree

2 files changed

+74
-18
lines changed

2 files changed

+74
-18
lines changed

Dockerfile

+27-6
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,23 @@ COPY go.sum go.sum
3737
# Cache modules
3838
RUN go mod download
3939

40+
# The musl-tool-chain layer is an adhoc solution
41+
# for the problem in which xx gets confused during compilation
42+
# and a) looks for gold linker and then b) cannot find musl's dynamic linker.
43+
FROM --platform=$BUILDPLATFORM alpine as musl-tool-chain
44+
45+
COPY --from=xx / /
46+
47+
RUN apk add bash curl tar
48+
49+
WORKDIR /workspace
50+
COPY hack/download-musl.sh .
51+
52+
ARG TARGETPLATFORM
53+
ARG TARGETARCH
54+
RUN ROOT_DIR="$(pwd)" TARGET_ARCH="$(xx-info alpine-arch)" ENV_FILE=true \
55+
./download-musl.sh
56+
4057
# Build stage install per target platform
4158
# dependency and effectively cross compile the application.
4259
FROM build-go-mod as build
@@ -47,10 +64,7 @@ COPY --from=libgit2-libs /usr/local/ /usr/local/
4764

4865
# Some dependencies have to installed
4966
# for the target platform: https://github.com/tonistiigi/xx#go--cgo
50-
RUN xx-apk add --no-cache \
51-
musl-dev gcc lld binutils-gold
52-
53-
RUN xx-apk add --no-cache musl-utils
67+
RUN xx-apk add musl-dev gcc lld
5468

5569
WORKDIR /workspace
5670

@@ -60,12 +74,19 @@ COPY controllers/ controllers/
6074
COPY pkg/ pkg/
6175
COPY internal/ internal/
6276

77+
COPY --from=musl-tool-chain /workspace/build /workspace/build
78+
79+
ARG TARGETPLATFORM
80+
ARG TARGETARCH
6381
ENV CGO_ENABLED=1
64-
RUN export LIBRARY_PATH="/usr/local/$(xx-info triple):/usr/local/$(xx-info triple)/lib64" && \
82+
83+
# Instead of using xx-go, (cross) compile with vanilla go leveraging musl tool chain.
84+
RUN export $(cat build/musl/$(xx-info alpine-arch).env | xargs) && \
85+
export LIBRARY_PATH="/usr/local/$(xx-info triple):/usr/local/$(xx-info triple)/lib64" && \
6586
export PKG_CONFIG_PATH="/usr/local/$(xx-info triple)/lib/pkgconfig:/usr/local/$(xx-info triple)/lib64/pkgconfig" && \
6687
export FLAGS="$(pkg-config --static --libs --cflags libssh2 openssl libgit2)" && \
6788
export CGO_LDFLAGS="${FLAGS} -static" && \
68-
xx-go build \
89+
GOARCH=$TARGETARCH go build \
6990
-ldflags "-s -w" \
7091
-tags 'netgo,osusergo,static_build' \
7192
-o /source-controller -trimpath main.go;

hack/download-musl.sh

+47-12
Original file line numberDiff line numberDiff line change
@@ -6,26 +6,61 @@ MUSL_X86_64_FILENAME=x86_64-linux-musl-native.tgz
66
MUSL_X86_64_SHA512=44d441ad9aa11a06feddf3daa4c9f53ad7d9ca37af1f5a61379aca07793703d179410cea723c1b7fca94c4de19a321228bdb3656bc5cbdb5e3bea8e2d6dac6c7
77
MUSL_AARCH64_FILENAME=aarch64-linux-musl-native.tgz
88
MUSL_AARCH64_SHA512=16d544e09845c9dbba50f29e0cb04dd661e17eb63c56acad6a67fd2a78aa7596b792477c7177d3cd56d408a27dc291a90507df882f2b099c0f25511ce08fd3b5
9+
MUSL_XX86_64_FILENAME=x86_64-linux-musl-cross.tgz
10+
MUSL_XX86_64_SHA512=52abd1a56e670952116e35d1a62e048a9b6160471d988e16fa0e1611923dd108a581d2e00874af5eb04e4968b1ba32e0eb449a1f15c3e4d5240ebe09caf5a9f3
11+
MUSL_XAARCH64_FILENAME=aarch64-linux-musl-cross.tgz
12+
MUSL_XAARCH64_SHA512=8695ff86979cdf30fbbcd33061711f5b1ebc3c48a87822b9ca56cde6d3a22abd4dab30fdcd1789ac27c6febbaeb9e5bde59d79d66552fae53d54cc1377a19272
13+
MUSL_XARMV7_FILENAME=armv7l-linux-musleabihf-cross.tgz
14+
MUSL_XARMV7_SHA512=1bb399a61da425faac521df9b8d303e60ad101f6c7827469e0b4bc685ce1f3dedc606ac7b1e8e34d79f762a3bfe3e8ab479a97e97d9f36fbd9fc5dc9d7ed6fd1
915

10-
MUSL_FILENAME="${MUSL_X86_64_FILENAME}"
11-
MUSL_SHA512="${MUSL_X86_64_SHA512}"
12-
if [ "$(uname -m)" = "arm64" ] || [ "$(uname -m)" = "aarch64" ]; then
13-
MUSL_FILENAME="${MUSL_AARCH64_FILENAME}"
14-
MUSL_SHA512="${MUSL_AARCH64_SHA512}"
15-
fi
16+
TARGET_ARCH="${TARGET_ARCH:-$(uname -m)}"
17+
ENV_FILE="${ENV_FILE:-false}"
1618

17-
MUSL_AARCH64_URL="https://more.musl.cc/11.2.1/x86_64-linux-musl/${MUSL_FILENAME}"
19+
MUSL_FILENAME=""
20+
MUSL_SHA512=""
1821

19-
ROOT_DIR="$(git rev-parse --show-toplevel)"
22+
ROOT_DIR="${ROOT_DIR:-$(git rev-parse --show-toplevel)}"
2023
MUSL_DIR="${ROOT_DIR}/build/musl"
2124

25+
26+
if [ "${TARGET_ARCH}" = "$(uname -m)" ]; then
27+
MUSL_FILENAME="${MUSL_X86_64_FILENAME}"
28+
MUSL_SHA512="${MUSL_X86_64_SHA512}"
29+
MUSL_PREFIX=$(xx-info alpine-arch)-linux-musl-native/bin/$(xx-info alpine-arch)-linux-musl
30+
if [ "${TARGET_ARCH}" = "arm64" ] || [ "${TARGET_ARCH}" = "aarch64" ]; then
31+
MUSL_FILENAME="${MUSL_AARCH64_FILENAME}"
32+
MUSL_SHA512="${MUSL_AARCH64_SHA512}"
33+
fi
34+
else
35+
MUSL_FILENAME="${MUSL_XX86_64_FILENAME}"
36+
MUSL_SHA512="${MUSL_XX86_64_SHA512}"
37+
MUSL_PREFIX=$(xx-info alpine-arch)-linux-musl-cross/bin/$(xx-info alpine-arch)-linux-musl
38+
if [ "${TARGET_ARCH}" = "arm64" ] || [ "${TARGET_ARCH}" = "aarch64" ]; then
39+
MUSL_FILENAME="${MUSL_XAARCH64_FILENAME}"
40+
MUSL_SHA512="${MUSL_XAARCH64_SHA512}"
41+
elif [ "${TARGET_ARCH}" = "arm" ] || [ "${TARGET_ARCH}" = "armv7" ]; then
42+
MUSL_FILENAME="${MUSL_XARMV7_FILENAME}"
43+
MUSL_SHA512="${MUSL_XARMV7_SHA512}"
44+
MUSL_PREFIX=armv7l-linux-musleabihf-cross/bin/armv7l-linux-musleabihf
45+
fi
46+
fi
47+
48+
mkdir -p "${MUSL_DIR}"
49+
50+
if "${ENV_FILE}"; then
51+
cat<<EOF > "${MUSL_DIR}/${TARGET_ARCH}.env"
52+
CC="$(pwd)/build/musl/${MUSL_PREFIX}-gcc"
53+
CXX="$(pwd)/build/musl/${MUSL_PREFIX}-g++"
54+
AR="$(pwd)/build/musl/${MUSL_PREFIX}-ar"
55+
EOF
56+
fi
57+
58+
MUSL_AARCH64_URL="https://more.musl.cc/11.2.1/x86_64-linux-musl/${MUSL_FILENAME}"
59+
2260
if [ ! -f "${MUSL_DIR}/bin" ]; then
2361
TARGET_FILE="${MUSL_DIR}/${MUSL_FILENAME}"
24-
mkdir -p "${MUSL_DIR}"
25-
26-
echo "${MUSL_SHA512} ${TARGET_FILE}"
2762
curl -o "${TARGET_FILE}" -LO "${MUSL_AARCH64_URL}"
28-
if ! echo "${MUSL_SHA512} ${TARGET_FILE}" | sha512sum --check; then
63+
if ! echo "${MUSL_SHA512} ${TARGET_FILE}" | sha512sum; then
2964
echo "Checksum failed for ${MUSL_FILENAME}."
3065
rm -rf "${MUSL_DIR}"
3166
exit 1

0 commit comments

Comments
 (0)