Skip to content

Commit bd35ec2

Browse files
committed
chore: draft for multiarch image
1 parent 5878aa1 commit bd35ec2

File tree

11 files changed

+591
-149
lines changed

11 files changed

+591
-149
lines changed

Dockerfile

Lines changed: 46 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# NOTE: Most of Dockerfile and related were borrowed from https://hub.docker.com/r/ekidd/rust-musl-builder
22

3-
FROM debian:12.11-slim
3+
FROM debian:12.12-slim
44

55
ARG VERSION=0.0.0
66
ENV VERSION=${VERSION}
@@ -19,15 +19,17 @@ RUN set -eux \
1919
&& DEBIAN_FRONTEND=noninteractive apt-get install -qq -y --no-install-recommends --no-install-suggests \
2020
autoconf \
2121
automake \
22+
bison \
2223
build-essential \
2324
ca-certificates \
2425
clang \
2526
cmake \
2627
curl \
2728
file \
29+
flex \
30+
g++-aarch64-linux-gnu \
2831
gcc-aarch64-linux-gnu \
2932
gcc-arm-linux-gnueabihf \
30-
g++-aarch64-linux-gnu \
3133
git \
3234
libbz2-dev \
3335
libgmp-dev \
@@ -43,15 +45,15 @@ RUN set -eux \
4345
llvm-dev \
4446
lzma-dev \
4547
musl-dev \
46-
musl-dev:armhf \
4748
musl-dev:arm64 \
49+
musl-dev:armhf \
4850
musl-tools \
4951
patch \
5052
pkgconf \
5153
python3 \
5254
xutils-dev \
53-
yasm \
5455
xz-utils \
56+
yasm \
5557
zlib1g-dev \
5658
# Clean up local repository of retrieved packages and remove the package lists
5759
&& apt-get clean \
@@ -80,7 +82,7 @@ RUN set -eux \
8082
# the popular Rust `hyper` crate.
8183

8284
# OpenSSL 1.1.1 - https://github.com/openssl/openssl/releases
83-
ARG OPENSSL_VERSION=1.1.1w
85+
ARG OPENSSL_VERSION=3.5.3
8486

8587
# We point /usr/local/musl/include/linux at some Linux kernel headers (not
8688
# necessarily the right ones) in an effort to compile OpenSSL 1.1's "engine"
@@ -100,20 +102,35 @@ RUN set -eux \
100102
&& ln -s "/usr/include/$(uname -m)-linux-gnu/asm" /usr/local/musl/include/asm \
101103
&& ln -s /usr/include/asm-generic /usr/local/musl/include/asm-generic \
102104
&& cd /tmp \
103-
&& ver=$(echo $OPENSSL_VERSION | sed -e 's:\.:_:g') \
104-
&& curl -LO "https://github.com/openssl/openssl/releases/download/OpenSSL_${ver}/openssl-${OPENSSL_VERSION}.tar.gz" \
105+
&& curl -LO "https://github.com/openssl/openssl/releases/download/openssl-${OPENSSL_VERSION}/openssl-${OPENSSL_VERSION}.tar.gz" \
105106
&& tar xvzf "openssl-${OPENSSL_VERSION}.tar.gz" \
106107
&& cd "openssl-${OPENSSL_VERSION}" \
107108
&& env CC=musl-gcc ./Configure no-shared no-zlib -fPIC --prefix=/usr/local/musl -DOPENSSL_NO_SECURE_MEMORY ${config} "linux-$(uname -m)" \
108109
&& env C_INCLUDE_PATH=/usr/local/musl/include/ make depend \
109110
&& env C_INCLUDE_PATH=/usr/local/musl/include/ make -j$(nproc) \
110111
&& make -j$(nproc) install_sw \
111112
&& make -j$(nproc) install_ssldirs \
112-
&& rm /usr/local/musl/include/linux /usr/local/musl/include/asm /usr/local/musl/include/asm-generic \
113113
&& openssl version \
114+
&& rm -rf \
115+
/usr/local/musl/include/linux \
116+
/usr/local/musl/include/asm \
117+
/usr/local/musl/include/asm-generic \
118+
&& ls -l /usr/local/musl \
119+
&& if [ "$(uname -m)" = "x86_64" ]; then \
120+
ln -s /usr/local/musl/lib64 /usr/local/musl/lib; \
121+
fi \
114122
&& rm -r /tmp/* \
115123
&& true
116124

125+
RUN set -eux \
126+
&& echo "Testing musl-gcc with OpenSSL..." \
127+
&& openssl version \
128+
&& echo "int main(){return 0;}" | \
129+
musl-gcc -o test -x c - \
130+
-I/usr/local/musl/include \
131+
-L/usr/local/musl/lib \
132+
-lssl -lcrypto \
133+
&& true
117134

118135
# zlib - http://zlib.net/
119136
ARG ZLIB_VERSION=1.3.1
@@ -132,7 +149,22 @@ RUN set -eux \
132149

133150

134151
# libpq - https://ftp.postgresql.org/pub/source/
135-
ARG POSTGRESQL_VERSION=15.9
152+
ARG POSTGRESQL_VERSION=17.6
153+
ARG ICU4C_VERSION=77.1
154+
155+
RUN set -eux \
156+
&& echo "Building icu4c..." \
157+
&& cd /tmp \
158+
&& ver1=$(echo $ICU4C_VERSION | sed -e 's:\.:-:g') \
159+
&& ver2=$(echo $ICU4C_VERSION | sed -e 's:\.:_:g') \
160+
&& curl -LO https://github.com/unicode-org/icu/releases/download/release-${ver1}/icu4c-${ver2}-src.tgz \
161+
&& tar xf icu4c-${ver2}-src.tgz \
162+
&& cd icu/source \
163+
&& env CC=musl-gcc CXX=musl-g++ ./configure --prefix=/usr/local/musl \
164+
&& make -j$(nproc) \
165+
&& make -j$(nproc) install \
166+
&& rm -r /tmp/* \
167+
&& true
136168

137169
RUN set -eux \
138170
&& echo "Building libpq ${POSTGRESQL_VERSION}..." \
@@ -206,6 +238,8 @@ RUN set -eux \
206238
ENV PATH=$PATH:/usr/local/osxcross/target/bin
207239
ENV MACOSX_DEPLOYMENT_TARGET=${OSX_VERSION_MIN}
208240
ENV OSXCROSS_MACPORTS_MIRROR=https://packages.macports.org
241+
ENV OSXCROSS_MACPORTS_LOCAL=/usr/local/osxcross/target/macports/pkgs/opt/local
242+
ENV OSXCROSS_MACPORTS_LIBEXEC=${OSXCROSS_MACPORTS_LOCAL}/libexec
209243

210244
RUN set -eux \
211245
&& echo "Testing osxcross with compiler-rt..." \
@@ -217,10 +251,11 @@ RUN set -eux \
217251
&& echo "Install dependencies via osxcross tools..." \
218252
&& apt-get update \
219253
&& /usr/local/osxcross/tools/get_dependencies.sh \
254+
&& osxcross-macports install zlib openssl3 \
220255
&& true
221256

222257
# Rust stable toolchain
223-
ARG TOOLCHAIN=1.86.0
258+
ARG TOOLCHAIN=1.87.0
224259

225260
# Install our Rust toolchain and the `musl` target. We patch the
226261
# command-line we pass to the installer so that it won't attempt to
@@ -236,7 +271,7 @@ RUN set -eux \
236271
x86_64-apple-darwin \
237272
x86_64-unknown-linux-musl \
238273
&& true
239-
COPY cargo/config.toml /root/.cargo/config
274+
COPY cargo/config.toml /root/.cargo/config.toml
240275

241276
RUN set -eux \
242277
&& echo "Removing temp files..." \

Dockerfile.cross

Lines changed: 191 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,191 @@
1+
FROM joseluisq/docker-osxcross:1.0.0-beta.1
2+
3+
ARG VERSION=0.0.0
4+
ENV VERSION=${VERSION}
5+
6+
LABEL version="${VERSION}" \
7+
description="Use same Docker image for compiling Rust programs for Linux (musl libc) & macOS (osxcross)." \
8+
maintainer="Jose Quintana <joseluisq.net>"
9+
10+
# Static linking for C++ code
11+
RUN set -eux \
12+
&& ln -s "/usr/bin/g++" "/usr/bin/musl-g++" \
13+
# Create appropriate directories for current user
14+
&& mkdir -p /root/libs /root/src \
15+
&& true
16+
17+
ENV PATH=/root/.cargo/bin:/usr/local/musl/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$PATH
18+
19+
##### Rust toolchains
20+
21+
# Rust/Cargo related environment variables
22+
ENV TARGET=musl
23+
# Crate-related environment variables
24+
ENV LIBZ_SYS_STATIC=1
25+
26+
# Rust stable toolchain
27+
ARG TOOLCHAIN=1.87.0
28+
29+
RUN set -eux \
30+
&& curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain=$TOOLCHAIN \
31+
&& rustup target add \
32+
aarch64-apple-darwin \
33+
aarch64-unknown-linux-gnu \
34+
aarch64-unknown-linux-musl \
35+
x86_64-apple-darwin \
36+
x86_64-unknown-linux-musl \
37+
&& true
38+
39+
COPY cargo/config.toml /root/.cargo/config.toml
40+
41+
RUN set -eux \
42+
&& rustc -vV \
43+
&& cargo -vV \
44+
&& true
45+
46+
##### Libraries
47+
48+
# zlib - http://zlib.net/
49+
ARG ZLIB_VERSION=1.3.1
50+
51+
WORKDIR /tmp
52+
53+
RUN set -eux \
54+
&& echo "Downloading zlib ${ZLIB_VERSION}..." \
55+
&& cd /tmp \
56+
&& curl -LO "https://www.zlib.net/fossils/zlib-${ZLIB_VERSION}.tar.gz" \
57+
&& tar xzf "zlib-${ZLIB_VERSION}.tar.gz" \
58+
&& rm -rf "zlib-${ZLIB_VERSION}.tar.gz" \
59+
&& true
60+
61+
WORKDIR /tmp/zlib-${ZLIB_VERSION}
62+
63+
# x86_64 glibc
64+
RUN set -eux \
65+
&& make distclean \
66+
&& CC=gcc ./configure --prefix=/usr/local/x86_64-linux-gnu \
67+
&& make -j$(nproc) \
68+
&& make install \
69+
&& true
70+
71+
# arm64 glibc
72+
RUN set -eux \
73+
&& make distclean \
74+
&& CC=aarch64-linux-gnu-gcc ./configure --prefix=/usr/local/aarch64-linux-gnu \
75+
&& make -j$(nproc) \
76+
&& make install \
77+
&& true
78+
79+
# x86_64 musl
80+
RUN set -eux \
81+
&& make distclean \
82+
&& CC=musl-gcc ./configure --static --prefix=/usr/local/x86_64-linux-musl \
83+
&& make -j$(nproc) \
84+
&& make install \
85+
&& true
86+
87+
WORKDIR /tmp
88+
89+
# OpenSSL 3.5.3 - https://github.com/openssl/openssl/releases
90+
ARG OPENSSL_VERSION=3.5.3
91+
92+
RUN set -eux \
93+
&& curl -LO "https://github.com/openssl/openssl/releases/download/openssl-${OPENSSL_VERSION}/openssl-${OPENSSL_VERSION}.tar.gz" \
94+
&& true
95+
96+
# We point /usr/local/musl/include/linux at some Linux kernel headers (not
97+
# necessarily the right ones) in an effort to compile OpenSSL 1.1's "engine"
98+
# component. It's possible that this will cause bizarre and terrible things to
99+
# happen. There may be "sanitized" header
100+
RUN set -eux \
101+
&& tar xvzf "openssl-${OPENSSL_VERSION}.tar.gz" \
102+
&& cd "openssl-${OPENSSL_VERSION}" \
103+
&& echo "Building OpenSSL ${OPENSSL_VERSION} for x86_64..." \
104+
&& ls /usr/include/linux \
105+
&& mkdir -p /usr/local/x86_64-linux-musl/include \
106+
&& ln -s /usr/include/linux /usr/local/x86_64-linux-musl/include/linux \
107+
&& ln -s "/usr/include/x86_64-linux-gnu/asm" /usr/local/x86_64-linux-musl/include/asm \
108+
&& ln -s /usr/include/asm-generic /usr/local/x86_64-linux-musl/include/asm-generic \
109+
&& env CC=musl-gcc ./Configure no-shared no-zlib \
110+
-fPIC --prefix=/usr/local/x86_64-linux-musl \
111+
-DOPENSSL_NO_SECURE_MEMORY "linux-x86_64" \
112+
&& env C_INCLUDE_PATH=/usr/local/x86_64-linux-musl/include/ make depend \
113+
&& env C_INCLUDE_PATH=/usr/local/x86_64-linux-musl/include/ make -j$(nproc) \
114+
&& make -j$(nproc) install_sw \
115+
&& make -j$(nproc) install_ssldirs \
116+
&& openssl version \
117+
&& rm -rf \
118+
/usr/local/x86_64-linux-musl/include/linux \
119+
/usr/local/x86_64-linux-musl/include/asm \
120+
/usr/local/x86_64-linux-musl/include/asm-generic \
121+
&& ls -l /usr/local/x86_64-linux-musl \
122+
&& if ! [ -d /usr/local/x86_64-linux-musl/lib ]; then \
123+
ln -s /usr/local/x86_64-linux-musl/lib64 /usr/local/x86_64-linux-musl/lib; \
124+
else \
125+
mv /usr/local/x86_64-linux-musl/lib /usr/local/x86_64-linux-musl/abc; \
126+
mv /usr/local/x86_64-linux-musl/lib64 /usr/local/x86_64-linux-musl/lib; \
127+
cp -rp /usr/local/x86_64-linux-musl/abc/. /usr/local/x86_64-linux-musl/lib/; \
128+
unlink /usr/local/x86_64-linux-musl/lib/lib64; \
129+
rm -rf /usr/local/x86_64-linux-musl/abc; \
130+
fi \
131+
&& cd .. \
132+
&& rm -rf "openssl-${OPENSSL_VERSION}" \
133+
&& true
134+
135+
RUN set -eux \
136+
&& tar xvzf "openssl-${OPENSSL_VERSION}.tar.gz" \
137+
&& cd "openssl-${OPENSSL_VERSION}" \
138+
&& echo "Building OpenSSL ${OPENSSL_VERSION} for aarch64..." \
139+
&& ls /usr/include/linux \
140+
&& mkdir -p /usr/local/aarch64-linux-gnu/include \
141+
# && ln -s /usr/include/linux /usr/local/aarch64-linux-gnu/include/linux \
142+
# && ln -s "/usr/include/aarch64-linux-gnu/asm" /usr/local/aarch64-linux-gnu/include/asm \
143+
# && ln -s /usr/include/asm-generic /usr/local/aarch64-linux-gnu/include/asm-generic \
144+
&& env CC=aarch64-linux-gnu-gcc ./Configure no-shared no-zlib \
145+
-fPIC --prefix=/usr/local/aarch64-linux-gnu \
146+
-DOPENSSL_NO_SECURE_MEMORY -mno-outline-atomics "linux-aarch64" \
147+
&& env C_INCLUDE_PATH=/usr/local/aarch64-linux-gnu/include/ make depend \
148+
&& env C_INCLUDE_PATH=/usr/local/aarch64-linux-gnu/include/ make -j$(nproc) \
149+
&& make -j$(nproc) install_sw \
150+
&& make -j$(nproc) install_ssldirs \
151+
&& openssl version \
152+
&& rm -rf \
153+
/usr/local/aarch64-linux-gnu/include/linux \
154+
/usr/local/aarch64-linux-gnu/include/asm \
155+
/usr/local/aarch64-linux-gnu/include/asm-generic \
156+
&& ls -l /usr/local/aarch64-linux-gnu \
157+
&& cd .. \
158+
&& rm -rf "openssl-${OPENSSL_VERSION}" \
159+
&& true
160+
161+
RUN set -eux \
162+
&& echo "Testing musl-gcc with OpenSSL..." \
163+
&& openssl version \
164+
&& echo "int main(){return 0;}" | \
165+
musl-gcc -o test -x c - \
166+
-I/usr/local/x86_64-linux-musl/include \
167+
-L/usr/local/x86_64-linux-musl/lib \
168+
-lssl -lcrypto \
169+
&& true
170+
171+
WORKDIR /root
172+
173+
# OpenSSL related environment variables
174+
ENV X86_64_UNKNOWN_LINUX_MUSL_OPENSSL_DIR=/usr/local/x86_64-linux-musl
175+
ENV AARCH64_UNKNOWN_LINUX_MUSL_OPENSSL_DIR=/usr/local/aarch64-linux-gnu
176+
ENV X86_64_UNKNOWN_LINUX_MUSL_OPENSSL_STATIC=1
177+
ENV AARCH64_UNKNOWN_LINUX_MUSL_OPENSSL_STATIC=1
178+
179+
# pkg-config related environment variables
180+
ENV PKG_CONFIG_ALLOW_CROSS=true \
181+
PKG_CONFIG_ALL_STATIC=true
182+
183+
RUN set -eux \
184+
&& echo "Removing temp files..." \
185+
&& rm -rf *~ taballs *.tar.xz \
186+
&& rm -rf /tmp/* \
187+
&& true
188+
189+
WORKDIR /root/src
190+
191+
CMD ["bash"]

0 commit comments

Comments
 (0)