Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Combine the ARM + AMD Dockerfiles #139

Open
4 tasks
clux opened this issue Feb 27, 2024 · 0 comments
Open
4 tasks

Combine the ARM + AMD Dockerfiles #139

clux opened this issue Feb 27, 2024 · 0 comments

Comments

@clux
Copy link
Owner

clux commented Feb 27, 2024

Current diff is tiny:

--- Dockerfile.x86_64	2024-02-27 19:26:58.125640186 +0000
+++ Dockerfile.arm64	2024-02-27 19:26:58.125640186 +0000
@@ -1,3 +1,4 @@
+# syntax=docker/dockerfile:1
 FROM ubuntu:jammy
 LABEL maintainer="Eirik Albrigtsen <[email protected]>"
 
@@ -38,14 +39,14 @@
 # Install rust using rustup
 ARG CHANNEL
 ENV RUSTUP_VER="1.26.0" \
-    RUST_ARCH="x86_64-unknown-linux-gnu" \
+    RUST_ARCH="aarch64-unknown-linux-gnu" \
     CARGO_REGISTRIES_CRATES_IO_PROTOCOL=sparse
 
 RUN curl "https://static.rust-lang.org/rustup/archive/${RUSTUP_VER}/${RUST_ARCH}/rustup-init" -o rustup-init && \
     chmod +x rustup-init && \
     ./rustup-init -y --default-toolchain ${CHANNEL} --profile minimal --no-modify-path && \
     rm rustup-init && \
-    ~/.cargo/bin/rustup target add x86_64-unknown-linux-musl
+    ~/.cargo/bin/rustup target add aarch64-unknown-linux-musl
 
 # Allow non-root access to cargo
 RUN chmod a+X /root
@@ -66,7 +67,7 @@
 
 # Install a more recent release of protoc (protobuf-compiler in jammy is 4 years old and misses some features)
 RUN cd /tmp && \
-    curl -sSL https://github.com/protocolbuffers/protobuf/releases/download/v${PROTOBUF_VER}/protoc-${PROTOBUF_VER}-linux-x86_64.zip -o protoc.zip && \
+    curl -sSL https://github.com/protocolbuffers/protobuf/releases/download/v${PROTOBUF_VER}/protoc-${PROTOBUF_VER}-linux-aarch_64.zip -o protoc.zip && \
     unzip protoc.zip && \
     cp bin/protoc /usr/bin/protoc && \
     rm -rf *
@@ -75,10 +76,10 @@
 # Primarily for the benefit of postgres.
 # Lastly, link some linux-headers for openssl 1.1 (not used herein)
 RUN mkdir $PREFIX && \
-    echo "$PREFIX/lib" >> /etc/ld-musl-x86_64.path && \
-    ln -s /usr/include/x86_64-linux-gnu/asm /usr/include/x86_64-linux-musl/asm && \
-    ln -s /usr/include/asm-generic /usr/include/x86_64-linux-musl/asm-generic && \
-    ln -s /usr/include/linux /usr/include/x86_64-linux-musl/linux
+    echo "$PREFIX/lib" >> /etc/ld-musl-aarch64.path && \
+    ln -s /usr/include/aarch64-linux-gnu/asm /usr/include/aarch64-linux-musl/asm && \
+    ln -s /usr/include/asm-generic /usr/include/aarch64-linux-musl/asm-generic && \
+    ln -s /usr/include/linux /usr/include/aarch64-linux-musl/linux
 
 # Build zlib (used in openssl and pq)
 RUN curl -sSL https://zlib.net/zlib-$ZLIB_VER.tar.gz | tar xz && \
@@ -92,7 +93,7 @@
 # TODO: fix so that it works
 RUN curl -sSL https://www.openssl.org/source/openssl-$SSL_VER.tar.gz | tar xz && \
     cd openssl-$SSL_VER && \
-    ./Configure no-zlib no-shared -fPIC --prefix=$PREFIX --openssldir=$PREFIX/ssl linux-x86_64 && \
+    CFLAGS="-mno-outline-atomics" ./Configure no-zlib no-shared -fPIC --prefix=$PREFIX --openssldir=$PREFIX/ssl linux-aarch64 && \
     env C_INCLUDE_PATH=$PREFIX/include make depend 2> /dev/null && \
     make -j$(nproc) && make all install_sw && \
     cd .. && rm -rf openssl-$SSL_VER
@@ -138,12 +139,13 @@
 # See https://github.com/sgrif/pq-sys/pull/18
 ENV PATH=/root/.cargo/bin:$PREFIX/bin:$PATH \
     RUSTUP_HOME=/root/.rustup \
-    CARGO_BUILD_TARGET=x86_64-unknown-linux-musl \
+    CARGO_BUILD_TARGET=aarch64-unknown-linux-musl \
+    CARGO_TARGET_AARCH64_UNKNOWN_LINUX_MUSL_RUSTFLAGS="-Clink-self-contained=yes -Clinker=rust-lld -Ctarget-feature=+crt-static" \
     PKG_CONFIG_ALLOW_CROSS=true \
     PKG_CONFIG_ALL_STATIC=true \
-    PQ_LIB_STATIC_X86_64_UNKNOWN_LINUX_MUSL=true \
+    PQ_LIB_STATIC_AARCH64_UNKNOWN_LINUX_MUSL=true \
     PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig \
-    PG_CONFIG_X86_64_UNKNOWN_LINUX_GNU=/usr/bin/pg_config \
+    PG_CONFIG_AARCH64_UNKNOWN_LINUX_GNU=/usr/bin/pg_config \
     OPENSSL_STATIC=true \
     OPENSSL_DIR=$PREFIX \
     SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt \

strategy (i expect) will be:

  • evars and values re-using values; pass in ARG arch as x86_64 or aarch64 and similar
  • symlink area, same as above ^
  • CARGO_TARGET_XXX_ + PQ_LIB_STATIC_XXX evars variants at the end -> just add all of them? Noops to have in wrong arch.
  • CFLAGS for openssl. uhhh, not sure. huge inline arg str? 😬 templating? big if arch == X statement gating the RUN statement somehow?
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant