Skip to content

Commit

Permalink
Fall 2024 recompile of the natives
Browse files Browse the repository at this point in the history
This time around, instead of the very ad hoc approach I have historically taken, this time we actually have a convenient script that takes care of basically all the hard work necessary, including cross-compilation.

We compile natives for Ubuntu 20.04 LTS (OpenSSL 1.1.x native and libdeflate) and Ubuntu 22.04 LTS (OpenSSL 3.x.x native), for both x86_64 and aarch64.

The macOS natives have also been recompiled on macOS Sonoma.
  • Loading branch information
astei committed Aug 31, 2024
1 parent ebc418f commit 869faec
Show file tree
Hide file tree
Showing 15 changed files with 113 additions and 12 deletions.
32 changes: 32 additions & 0 deletions native/build-support/build-all-linux-natives.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#!/usr/bin/env bash

set -e

# make sure we're in the correct directory - the top-level `native` directory
cd "$(dirname "$0")/.." || exit 1

ARCHS=(x86_64 aarch64)
BASE_DOCKERFILE_VARIANTS=(ubuntu-focal ubuntu-jammy)

for variant in "${BASE_DOCKERFILE_VARIANTS[@]}"; do
docker_platforms=""
for arch in "${ARCHS[@]}"; do
docker_platforms="$docker_platforms --platform linux/${arch}"
done

echo "Building base build image for $variant..."
docker build -t velocity-native-build:$variant $docker_platforms -f build-support/$variant.Dockerfile .
done

for arch in "${ARCHS[@]}"; do
for variant in "${BASE_DOCKERFILE_VARIANTS[@]}"; do
echo "Building native crypto for $arch on $variant..."

docker run --rm -v "$(pwd)":/app --platform linux/${arch} velocity-native-build:$variant /bin/bash -c "cd /app && ./build-support/compile-linux-crypto.sh"
done

# Use only the oldest variant for the compression library
variant=${BASE_DOCKERFILE_VARIANTS[0]}
echo "Building native compression for $arch on $variant..."
docker run --rm -v "$(pwd)":/app --platform linux/${arch} velocity-native-build:$variant /bin/bash -c "cd /app && ./build-support/compile-linux-compress.sh"
done
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,16 @@ fi

if [ ! -d libdeflate ]; then
echo "Cloning libdeflate..."
git clone https://github.com/ebiggers/libdeflate.git
git clone --branch v1.21 --single-branch https://github.com/ebiggers/libdeflate.git
fi

echo "Compiling libdeflate..."
cd libdeflate || exit
cmake -B build && cmake --build build --target libdeflate_static
rm -rf build && cmake -DCMAKE_POSITION_INDEPENDENT_CODE=ON -B build && cmake --build build --target libdeflate_static
cd ..

CFLAGS="-O2 -I$JAVA_HOME/include/ -I$JAVA_HOME/include/linux/ -fPIC -shared -Wl,-z,noexecstack -Wall -Werror -fomit-frame-pointer"
ARCH=$(uname -m)
mkdir -p src/main/resources/linux_$ARCH
$CC $CFLAGS -Ilibdeflate src/main/c/jni_util.c src/main/c/jni_zlib_deflate.c src/main/c/jni_zlib_inflate.c \
libdeflate/build/libdeflate.a -o src/main/resources/linux_$ARCH/velocity-compress.so
$CC $CFLAGS -shared src/main/c/jni_util.c src/main/c/jni_cipher_openssl.c \
-o src/main/resources/linux_$ARCH/velocity-cipher.so -lcrypto
libdeflate/build/libdeflate.a -o src/main/resources/linux_$ARCH/velocity-compress.so
32 changes: 32 additions & 0 deletions native/build-support/compile-linux-crypto.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#!/bin/bash

openssl_version=$(openssl version | awk '{print $2}')

# Extract the major and minor version numbers
major_version=$(echo "$openssl_version" | cut -d. -f1)
minor_version=$(echo "$openssl_version" | cut -d. -f2)

# Determine the appropriate file name based on the version
if [ "$major_version" -eq 1 ] && [ "$minor_version" -eq 1 ]; then
filename="velocity-cipher-ossl11x.so"
elif [ "$major_version" -eq 3 ]; then
filename="velocity-cipher-ossl30x.so"
else
echo "Unsupported OpenSSL version: $openssl_version"
exit 1
fi

if [ ! "$CC" ]; then
export CC=gcc
fi

output_file="velocity-cipher.so"
if [ -n "$OPENSSL_VERSION" ]; then
output_file="velocity-cipher-ossl${OPENSSL_VERSION}.so"
fi

CFLAGS="-O2 -I$JAVA_HOME/include/ -I$JAVA_HOME/include/linux/ -fPIC -shared -Wl,-z,noexecstack -Wall -Werror -fomit-frame-pointer"
ARCH=$(uname -m)
mkdir -p src/main/resources/linux_$ARCH
$CC $CFLAGS -shared src/main/c/jni_util.c src/main/c/jni_cipher_openssl.c \
-o src/main/resources/linux_$ARCH/$filename -lcrypto
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ fi

if [ ! -d libdeflate ]; then
echo "Cloning libdeflate..."
git clone https://github.com/ebiggers/libdeflate.git
git clone --branch v1.21 --single-branch https://github.com/ebiggers/libdeflate.git
fi

echo "Compiling libdeflate..."
Expand Down
20 changes: 20 additions & 0 deletions native/build-support/ubuntu-focal.Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Use the official Eclipse Temurin 17.0.12_7-jdk-focal image as the base image.
# We compile for Ubuntu Focal Fossa (20.04 LTS) as it is still supported until 2025, and the crypto
# native is specific to a given OpenSSL version.
FROM eclipse-temurin:17.0.12_7-jdk-focal

# Install required dependencies
RUN apt-get update && apt-get install -y \
libssl-dev \
curl \
git \
unzip \
build-essential \
cmake \
openssl \
&& rm -rf /var/lib/apt/lists/* \
&& apt-get clean

# Create a non-root user
RUN useradd -m -s /bin/bash -u 1000 -U user
USER user
19 changes: 19 additions & 0 deletions native/build-support/ubuntu-jammy.Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Use the official Eclipse Temurin 17.0.12_7-jdk-jammy image as the base image.
# We compile for Ubuntu Jammy Jellyfish (22.04 LTS) as it supports OpenSSL 3.0.
FROM eclipse-temurin:17.0.12_7-jdk-jammy

# Install required dependencies
RUN apt-get update && apt-get install -y \
libssl-dev \
curl \
git \
unzip \
build-essential \
cmake \
openssl \
&& rm -rf /var/lib/apt/lists/* \
&& apt-get clean

# Create a non-root user
RUN useradd -m -s /bin/bash -u 1000 -U user
USER user
Original file line number Diff line number Diff line change
Expand Up @@ -103,21 +103,21 @@ private static Path createTemporaryNativeFilename(String ext) throws IOException
copyAndLoadNative("/linux_x86_64/velocity-cipher.so"), // Any local version
"OpenSSL local (Linux x86_64)", NativeVelocityCipher.FACTORY),
new NativeCodeLoader.Variant<>(NativeConstraints.LINUX_X86_64,
copyAndLoadNative("/linux_x86_64/velocity-cipher-ossl30x.so"), // Debian "Bookworm"
"OpenSSL 3.0.x (Linux x86_64)", NativeVelocityCipher.FACTORY),
copyAndLoadNative("/linux_x86_64/velocity-cipher-ossl30x.so"), // Ubuntu 22.04
"OpenSSL 3.x.x (Linux x86_64)", NativeVelocityCipher.FACTORY),
new NativeCodeLoader.Variant<>(NativeConstraints.LINUX_X86_64,
copyAndLoadNative("/linux_x86_64/velocity-cipher-ossl11x.so"), // Debian 9
copyAndLoadNative("/linux_x86_64/velocity-cipher-ossl11x.so"), // Ubuntu 20.04
"OpenSSL 1.1.x (Linux x86_64)", NativeVelocityCipher.FACTORY),

new NativeCodeLoader.Variant<>(NativeConstraints.LINUX_AARCH64,
copyAndLoadNative("/linux_aarch64/velocity-cipher.so"),
"OpenSSL (Linux aarch64)", NativeVelocityCipher.FACTORY), // Any local version
"OpenSSL local (Linux aarch64)", NativeVelocityCipher.FACTORY), // Any local version
new NativeCodeLoader.Variant<>(NativeConstraints.LINUX_AARCH64,
copyAndLoadNative("/linux_aarch64/velocity-cipher-ossl30x.so"),
"OpenSSL (Linux aarch64)", NativeVelocityCipher.FACTORY), // Fedora 36
"OpenSSL 3.x.x (Linux aarch64)", NativeVelocityCipher.FACTORY), // Ubuntu 22.04
new NativeCodeLoader.Variant<>(NativeConstraints.LINUX_AARCH64,
copyAndLoadNative("/linux_aarch64/velocity-cipher-ossl11x.so"),
"OpenSSL 1.1.x (Linux aarch64)", NativeVelocityCipher.FACTORY), // Debian 11
"OpenSSL 1.1.x (Linux aarch64)", NativeVelocityCipher.FACTORY), // Ubuntu 20.04

new NativeCodeLoader.Variant<>(NativeConstraints.MACOS_AARCH64,
copyAndLoadNative("/macos_arm64/velocity-cipher.dylib"),
Expand Down
Binary file modified native/src/main/resources/linux_aarch64/velocity-cipher-ossl11x.so
Binary file not shown.
Binary file not shown.
Binary file modified native/src/main/resources/linux_aarch64/velocity-compress.so
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file modified native/src/main/resources/linux_x86_64/velocity-compress.so
Binary file not shown.
Binary file modified native/src/main/resources/macos_arm64/velocity-cipher.dylib
Binary file not shown.
Binary file not shown.

0 comments on commit 869faec

Please sign in to comment.