From ef62f0bb3c6f02e194ec35c36e922ae9210ad81a Mon Sep 17 00:00:00 2001 From: Taylor Richards Date: Tue, 7 Jul 2026 14:15:15 -0400 Subject: [PATCH] add macOS support --- README.md | 7 ++++ build_etc2native_macos.sh | 75 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+) create mode 100644 build_etc2native_macos.sh diff --git a/README.md b/README.md index ebe07ad..7445e02 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,7 @@ etc2native/ build_etc2native_windows.cmd <- Windows x64 / x86 / arm64 build_etc2native_linux.sh <- Linux x64 / arm64 / riscv64 build_etc2native_android.sh <- Android arm64-v8a / armeabi-v7a / x86 / x86_64 +build_etc2native_macos.sh <- macOS Universal (arm64 + x64) Dockerfile.etc2native-linux Dockerfile.etc2native-android compose.etc2native.yaml @@ -47,6 +48,12 @@ docker compose -f compose.etc2native.yaml run --rm etc2native-linux # -> prebuilt_linux_etc2native/{x64,arm64,riscv64}/libetc2native.so ``` +## macOS +``` +sh ./build_etc2native_macos.sh +:: -> prebuilt_macos_etc2native/universal/libetc2native.dylib +``` + ## Android (Docker) ``` docker compose -f compose.etc2native.yaml run --rm etc2native-android diff --git a/build_etc2native_macos.sh b/build_etc2native_macos.sh new file mode 100644 index 0000000..6d6c10d --- /dev/null +++ b/build_etc2native_macos.sh @@ -0,0 +1,75 @@ +#!/bin/sh +# Builds libetc2native.dylib for macOS: Apple Silicon + x86_64. +# +# etc2comp is pure C++ (no x86 intrinsics), so cross-compiling needs nothing +# special. +# +# Outputs (loose .so per arch): +# prebuilt_macos_etc2native/libetc2native.dylib + +SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- '$0')" && pwd) + +ETC2_SRC="$SCRIPT_DIR/etc2native" # project: CMakeLists.txt + EtcCApi.cpp/.h +ETC2_FORK="${ETC2_FORK:-https://github.com/Shivansps/etc2comp.git}" +ETC2_REF="${ETC2_REF:-master}" +TARGET_PREBUILT_FOLDER="$SCRIPT_DIR/prebuilt_macos_etc2native" +TEMP_FOLDER="$TARGET_PREBUILT_FOLDER/etc2_temp" + +if [ ! -f "$ETC2_SRC/CMakeLists.txt" ]; then + echo "Error: expected the etc2native project at $ETC2_SRC (CMakeLists.txt, EtcCApi.cpp/.h)." >&2 + exit 1 +fi + +rm -rf "$TARGET_PREBUILT_FOLDER" && mkdir -p "$TARGET_PREBUILT_FOLDER" && mkdir -p "$TEMP_FOLDER" + +############################################################################# +# --- Get etc2comp fork source ---------------------------------------------- +############################################################################# +ETC2_DIR="$TEMP_FOLDER/etc2comp" +echo "Cloning etc2comp fork (ref: $ETC2_REF) ..." +git clone --depth 1 --branch "$ETC2_REF" "$ETC2_FORK" "$ETC2_DIR" \ + || git clone "$ETC2_FORK" "$ETC2_DIR" + + +############################################################################# +# Build helper: configures+builds libetc2native. +############################################################################# +build() { + label="universal" + build_dir="$TEMP_FOLDER/build-$label" + + echo "" + echo "=== Building libetc2native for macOS ===" + + # shellcheck disable=SC2086 + cmake -S "$ETC2_SRC" -B "$build_dir" -G Ninja \ + -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" \ + -DCMAKE_OSX_DEPLOYMENT_TARGET="11.0" \ + -DCMAKE_BUILD_TYPE=Release \ + -DETC2_ROOT="$ETC2_DIR" + cmake --build "$build_dir" + + out_dir="$TARGET_PREBUILT_FOLDER/$label" + mkdir -p "$out_dir" + cp "$build_dir"/libetc2native.dylib "$out_dir"/ 2>/dev/null + + if [ ! -f "$out_dir/libetc2native.dylib" ]; then + echo "Error: libetc2native.dylib was not produced" >&2 + exit 1 + fi + + codesign --force --timestamp --deep --sign - "$out_dir/libetc2native.dylib" 2>/dev/null + + echo "-> $out_dir/libetc2native.dylib" +} + +build + +############################################################################# +# Cleanup (keep the per-arch .so folders) +############################################################################# +rm -rf "$TEMP_FOLDER" + +echo "" +echo "Done. Output in $TARGET_PREBUILT_FOLDER:" +find "$TARGET_PREBUILT_FOLDER" -name '*.dylib'