@@ -12,72 +12,94 @@ RUN cargo chef prepare --recipe-path recipe.json
1212# Builder stage
1313FROM --platform=${BUILDPLATFORM} chef AS builder
1414ARG TARGETOS TARGETARCH BUILDPLATFORM OPENSSL_VENDORED
15+ ENV BUILD_VAR_SCRIPT=/tmp/env.sh
1516COPY --from=planner /app/recipe.json recipe.json
16- COPY . .
17-
18- # Get the latest Protoc since the one in the Debian repo is incredibly old
19- RUN apt update && apt install -y unzip curl ca-certificates && \
20- PROTOC_VERSION=$(curl -s "https://api.github.com/repos/protocolbuffers/protobuf/releases/latest" | grep -Po '"tag_name": "v\K [0-9.]+' ) && \
21- if [ "$BUILDPLATFORM" = "linux/amd64" ]; then \
22- PROTOC_ARCH=x86_64; \
23- elif [ "$BUILDPLATFORM" = "linux/arm64" ]; then \
24- PROTOC_ARCH=aarch_64; \
25- else \
26- echo "${BUILDPLATFORM} is not supported." ; \
27- exit 1; \
28- fi && \
29- curl -Lo protoc.zip https://github.com/protocolbuffers/protobuf/releases/latest/download/protoc-$PROTOC_VERSION-linux-$PROTOC_ARCH.zip && \
30- unzip -q protoc.zip bin/protoc -d /usr && \
31- unzip -q protoc.zip "include/google/*" -d /usr && \
32- chmod a+x /usr/bin/protoc && \
33- rm -rf protoc.zip
3417
35- # Build the application
18+ # Set up the build environment for cross-compilation if needed
3619RUN if [ "$BUILDPLATFORM" = "linux/amd64" -a "$TARGETARCH" = "arm64" ]; then \
3720 # We're on x64, cross-compiling for arm64
3821 rustup target add aarch64-unknown-linux-gnu && \
3922 apt update && \
4023 apt install -y gcc-aarch64-linux-gnu && \
24+ echo "#!/bin/sh" > ${BUILD_VAR_SCRIPT} && \
25+ echo "export TARGET=aarch64-unknown-linux-gnu" >> ${BUILD_VAR_SCRIPT} && \
26+ echo "export TARGET_FLAG=--target=aarch64-unknown-linux-gnu" >> ${BUILD_VAR_SCRIPT} && \
27+ echo "export CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=/usr/bin/aarch64-linux-gnu-gcc" >> ${BUILD_VAR_SCRIPT} && \
28+ echo "export RUSTFLAGS=\" -L /usr/aarch64-linux-gnu/lib -L $(dirname $(aarch64-linux-gnu-gcc -print-libgcc-file-name))\" " >> ${BUILD_VAR_SCRIPT} && \
4129 if [ "$OPENSSL_VENDORED" != "true" ]; then \
4230 # If we're linking to OpenSSL dynamically, we have to set it up for cross-compilation
4331 dpkg --add-architecture arm64 && \
4432 apt update && \
4533 apt install -y libssl-dev:arm64 zlib1g-dev:arm64 && \
46- export PKG_CONFIG_ALLOW_CROSS=" true" && \
47- export PKG_CONFIG_LIBDIR=" /usr/lib/aarch64-linux-gnu/pkgconfig" && \
48- export OPENSSL_INCLUDE_DIR=/usr/include/aarch64-linux-gnu && \
49- export OPENSSL_LIB_DIR=/usr/lib/aarch64-linux-gnu; \
34+ echo " export PKG_CONFIG_ALLOW_CROSS=true" >> ${BUILD_VAR_SCRIPT} && \
35+ echo " export PKG_CONFIG_LIBDIR=/usr/lib/aarch64-linux-gnu/pkgconfig" >> ${BUILD_VAR_SCRIPT} && \
36+ echo " export OPENSSL_INCLUDE_DIR=/usr/include/aarch64-linux-gnu" >> ${BUILD_VAR_SCRIPT} && \
37+ echo " export OPENSSL_LIB_DIR=/usr/lib/aarch64-linux-gnu" >> ${BUILD_VAR_SCRIPT} ; \
5038 else \
51- FEATURE_OPENSSL_VENDORED="--features openssl-vendored" ; \
52- fi && \
53- TARGET="aarch64-unknown-linux-gnu" && \
54- TARGET_FLAG="--target=${TARGET}" && \
55- export CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER="/usr/bin/aarch64-linux-gnu-gcc" && \
56- export RUSTFLAGS="-L /usr/aarch64-linux-gnu/lib -L $(dirname $(aarch64-linux-gnu-gcc -print-libgcc-file-name))" ; \
39+ echo "export FEATURE_OPENSSL_VENDORED='--features openssl-vendored'" >> ${BUILD_VAR_SCRIPT}; \
40+ fi; \
5741 elif [ "$BUILDPLATFORM" = "linux/arm64" -a "$TARGETARCH" = "amd64" ]; then \
5842 # We're on arm64, cross-compiling for x64
5943 rustup target add x86_64-unknown-linux-gnu && \
6044 apt update && \
6145 apt install -y gcc-x86-64-linux-gnu && \
46+ echo "#!/bin/sh" > ${BUILD_VAR_SCRIPT} && \
47+ echo "export TARGET=x86_64-unknown-linux-gnu" >> ${BUILD_VAR_SCRIPT} && \
48+ echo "export TARGET_FLAG=--target=x86_64-unknown-linux-gnu" >> ${BUILD_VAR_SCRIPT} && \
49+ echo "export CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_LINKER=/usr/bin/x86_64-linux-gnu-gcc" >> ${BUILD_VAR_SCRIPT} && \
50+ echo "export RUSTFLAGS=\" -L /usr/x86_64-linux-gnu/lib -L $(dirname $(x86_64-linux-gnu-gcc -print-libgcc-file-name))\" " >> ${BUILD_VAR_SCRIPT} && \
6251 if [ "$OPENSSL_VENDORED" != "true" ]; then \
6352 # If we're linking to OpenSSL dynamically, we have to set it up for cross-compilation
6453 dpkg --add-architecture amd64 && \
6554 apt update && \
6655 apt install -y libssl-dev:amd64 zlib1g-dev:amd64 && \
67- export PKG_CONFIG_ALLOW_CROSS=" true" && \
68- export PKG_CONFIG_LIBDIR=" /usr/lib/x86_64-linux-gnu/pkgconfig" && \
69- export OPENSSL_INCLUDE_DIR=/usr/include/x86_64-linux-gnu && \
70- export OPENSSL_LIB_DIR=/usr/lib/x86_64-linux-gnu; \
56+ echo " export PKG_CONFIG_ALLOW_CROSS=true" >> ${BUILD_VAR_SCRIPT} && \
57+ echo " export PKG_CONFIG_LIBDIR=/usr/lib/x86_64-linux-gnu/pkgconfig" >> ${BUILD_VAR_SCRIPT} && \
58+ echo " export OPENSSL_INCLUDE_DIR=/usr/include/x86_64-linux-gnu" >> ${BUILD_VAR_SCRIPT} && \
59+ echo " export OPENSSL_LIB_DIR=/usr/lib/x86_64-linux-gnu" >> ${BUILD_VAR_SCRIPT} ; \
7160 else \
72- FEATURE_OPENSSL_VENDORED="--features openssl-vendored" ; \
73- fi && \
74- TARGET="x86_64-unknown-linux-gnu" && \
75- TARGET_FLAG="--target=${TARGET}" && \
76- export CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_LINKER="/usr/bin/x86_64-linux-gnu-gcc" ; \
77- export RUSTFLAGS="-L /usr/x86_64-linux-gnu/lib -L $(dirname $(x86_64-linux-gnu-gcc -print-libgcc-file-name))" ; \
61+ echo "export FEATURE_OPENSSL_VENDORED='--features openssl-vendored'" >> ${BUILD_VAR_SCRIPT}; \
62+ fi; \
63+ fi
64+
65+ # Run cook to prep the build
66+ RUN if [ -f ${BUILD_VAR_SCRIPT} ]; then \
67+ source ${BUILD_VAR_SCRIPT}; \
68+ echo "Cross-compilation environment set up for ${TARGET}" ; \
69+ else \
70+ echo "No cross-compilation needed" ; \
71+ fi && \
72+ export GIT_HASH=$(git rev-parse HEAD) && \
73+ cargo chef cook ${TARGET_FLAG} --release --recipe-path recipe.json ${FEATURE_OPENSSL_VENDORED}
74+
75+ # Now we can copy the source files
76+ COPY . .
77+
78+ # Get the latest Protoc since the one in the Debian repo is incredibly old
79+ RUN apt update && apt install -y unzip curl ca-certificates && \
80+ PROTOC_VERSION=$(curl -s "https://api.github.com/repos/protocolbuffers/protobuf/releases/latest" | grep -Po '"tag_name": "v\K [0-9.]+' ) && \
81+ if [ "$BUILDPLATFORM" = "linux/amd64" ]; then \
82+ PROTOC_ARCH=x86_64; \
83+ elif [ "$BUILDPLATFORM" = "linux/arm64" ]; then \
84+ PROTOC_ARCH=aarch_64; \
85+ else \
86+ echo "${BUILDPLATFORM} is not supported." ; \
87+ exit 1; \
88+ fi && \
89+ curl -Lo protoc.zip https://github.com/protocolbuffers/protobuf/releases/latest/download/protoc-$PROTOC_VERSION-linux-$PROTOC_ARCH.zip && \
90+ unzip -q protoc.zip bin/protoc -d /usr && \
91+ unzip -q protoc.zip "include/google/*" -d /usr && \
92+ chmod a+x /usr/bin/protoc && \
93+ rm -rf protoc.zip
94+
95+ # Build the application
96+ RUN if [ -f ${BUILD_VAR_SCRIPT} ]; then \
97+ chmod +x ${BUILD_VAR_SCRIPT} && \
98+ . ${BUILD_VAR_SCRIPT}; \
99+ echo "Cross-compilation environment set up for ${TARGET}" ; \
100+ else \
101+ echo "No cross-compilation needed" ; \
78102 fi && \
79- # Build the signer - general setup that works with or without cross-compilation
80- # cargo chef cook ${TARGET_FLAG} --release --recipe-path recipe.json && \
81103 export GIT_HASH=$(git rev-parse HEAD) && \
82104 cargo build ${TARGET_FLAG} --release --bin commit-boost-signer ${FEATURE_OPENSSL_VENDORED} && \
83105 if [ ! -z "$TARGET" ]; then \
0 commit comments