#!/usr/bin/env bash
# this is for my mac
set -e
BUILD_DIR="build"
echo "๐งน Cleaning up old builds..."
rm -rf "$BUILD_DIR" .zig-cache
mkdir -p "$BUILD_DIR"
mkdir -p "$BUILD_DIR/Linux(ARM64)"
mkdir -p "$BUILD_DIR/Linux(x86_64)"
mkdir -p "$BUILD_DIR/Windows(x86_64)"
mkdir -p "$BUILD_DIR/Windows(ARM64)"
mkdir -p "$BUILD_DIR/MacOS(Silicon)"
mkdir -p "$BUILD_DIR/MacOS(Silicon)/WrldBox.app/"
mkdir -p "$BUILD_DIR/MacOS(Intel)"
mkdir -p "$BUILD_DIR/MacOS(Intel)/WrldBox.app/"
echo "๐ Starting multi-platform compilation matrix..."
echo "--------------------------------------------------------"
# ๐ง Build Linux binary using native GCC inside an Ubuntu Docker container
echo "๐ฆ Building for Linux (ARM64)..."
docker run --rm \
-v "$(pwd)":/src \
-w /src \
ubuntu:22.04 sh -c "
apt-get update && apt-get install -y gcc xorg-dev libgl1-mesa-dev libopenal-dev libcurl4-gnutls-dev
# Include the raylib source files explicitly and fix output name to wrldbox_linux
gcc -O2 -Wall \
src/main.c src/world.c src/player.c src/physics.c src/render.c src/collision.c \
raylib_src/src/rcore.c raylib_src/src/rshapes.c raylib_src/src/rtextures.c \
raylib_src/src/rtext.c raylib_src/src/rmodels.c raylib_src/src/raudio.c raylib_src/src/rglfw.c \
-Iinclude -Iraylib_src/src -Iraylib_src/src/external/glfw/include \
-D_GNU_SOURCE -DPLATFORM_DESKTOP -D_GLFW_X11 \
-lX11 -lGL -lm -lpthread -ldl -lrt \
-o wrldbox_linux
"
mv wrldbox_linux "$BUILD_DIR/Linux(ARM64)/wrldbox_linux_arm64"
echo "๐ฆ Building for Linux (x86_64)..."
docker run --rm --platform linux/amd64 \
-v "$(pwd)":/src \
-w /src \
ubuntu:22.04 sh -c "
apt-get update && apt-get install -y \
gcc \
make \
xorg-dev \
libgl1-mesa-dev \
libopenal-dev \
libcurl4-gnutls-dev \
libxrandr-dev \
libxinerama-dev \
libxcursor-dev \
libxi-dev
# Compile the x86_64 binary using the amd64 container environment
gcc -O2 -Wall \
src/main.c src/world.c src/player.c src/physics.c src/render.c src/collision.c \
raylib_src/src/rcore.c raylib_src/src/rshapes.c raylib_src/src/rtextures.c \
raylib_src/src/rtext.c raylib_src/src/rmodels.c raylib_src/src/raudio.c raylib_src/src/rglfw.c \
-Iinclude -Iraylib_src/src -Iraylib_src/src/external/glfw/include \
-D_GNU_SOURCE -DPLATFORM_DESKTOP -D_GLFW_X11 \
-lX11 -lGL -lm -lpthread -ldl -lrt \
-o wrldbox_linux_x86_64
"
mv wrldbox_linux_x86_64 "$BUILD_DIR/Linux(x86_64)/wrldbox_linux_x86_64"
# ๐ช Build Windows binaries natively on your Mac using build.zig
echo "๐ฆ Building for Windows (x86_64)..."
zig build -Dtarget=x86_64-windows -Doptimize=ReleaseFast
mv zig-out/bin/wrldbox.exe "$BUILD_DIR/Windows(x86_64)/wrldbox_win_x86_64.exe"
echo "๐ฆ Building for Windows (ARM64)..."
zig build -Dtarget=aarch64-windows -Doptimize=ReleaseFast
mv zig-out/bin/wrldbox.exe "$BUILD_DIR/Windows(ARM64)/wrldbox_win_arm64.exe"
# ๐ Build macOS binaries natively on your Mac using build.zig
echo "๐ฆ Building for macOS (Apple Silicon)..."
gcc src/*.c -o wrldboxMacOSSilicon \
-I/opt/homebrew/include \
-L/opt/homebrew/lib \
-lraylib \
-framework OpenGL -framework Cocoa -framework IOKit -framework CoreVideo
echo "๐ Creating directory structure..."
mkdir -p "$BUILD_DIR/MacOS(Silicon)/WrldBox.app/Contents/MacOS"
mkdir -p "$BUILD_DIR/MacOS(Silicon)/WrldBox.app/Contents/Resources"
echo "๐ฆ Copying image..."
# ๐ก FIX 1: Changed "else if" to "elif" and added copy command after generation
if [ -f "build_resources/AppIcon.icns" ]; then
cp "build_resources/AppIcon.icns" "$BUILD_DIR/MacOS(Silicon)/WrldBox.app/Contents/Resources/"
elif [ -f "build_resources/appicon.png" ]; then
echo "๐จ Converting appicon.png to macOS .icns format..."
mkdir -p build_resources/AppIcon.iconset
# Generate the standard sizes macOS requires
sips -z 16 16 build_resources/appicon.png --out build_resources/AppIcon.iconset/icon_16x16.png > /dev/null 2>&1
sips -z 32 32 build_resources/appicon.png --out build_resources/AppIcon.iconset/icon_16x16@2x.png > /dev/null 2>&1
sips -z 32 32 build_resources/appicon.png --out build_resources/AppIcon.iconset/icon_32x32.png > /dev/null 2>&1
sips -z 64 64 build_resources/appicon.png --out build_resources/AppIcon.iconset/icon_32x32@2x.png > /dev/null 2>&1
sips -z 128 128 build_resources/appicon.png --out build_resources/AppIcon.iconset/icon_128x128.png > /dev/null 2>&1
sips -z 256 256 build_resources/appicon.png --out build_resources/AppIcon.iconset/icon_128x128@2x.png > /dev/null 2>&1
sips -z 256 256 build_resources/appicon.png --out build_resources/AppIcon.iconset/icon_256x256.png > /dev/null 2>&1
sips -z 512 512 build_resources/appicon.png --out build_resources/AppIcon.iconset/icon_256x256@2x.png > /dev/null 2>&1
sips -z 512 512 build_resources/appicon.png --out build_resources/AppIcon.iconset/icon_512x512.png > /dev/null 2>&1
sips -z 1024 1024 build_resources/appicon.png --out build_resources/AppIcon.iconset/icon_512x512@2x.png > /dev/null 2>&1
# Compile into the final asset and clean up temporary folder
iconutil -c icns build_resources/AppIcon.iconset -o build_resources/AppIcon.icns
rm -rf build_resources/AppIcon.iconset
# Copy newly generated icns to the app bundle
cp "build_resources/AppIcon.icns" "$BUILD_DIR/MacOS(Silicon)/WrldBox.app/Contents/Resources/"
else
echo "โ ๏ธ Warning: No icon asset found, skipping icon copy."
fi
echo "๐ฆ Moving binary..."
cp wrldboxMacOSSilicon "$BUILD_DIR/MacOS(Silicon)/WrldBox.app/Contents/MacOS/wrldbox_mac_arm64"
mv wrldboxMacOSSilicon "$BUILD_DIR/MacOS(Silicon)/wrldbox_mac_arm64"
# 5. Generate the Info.plist file
echo "๐ Generating Info.plist..."
# ๐ก FIX 2: Added single quotes around 'EOF' so your XML code is safe from Bash parsing errors
cat <<'EOF' > "$BUILD_DIR/MacOS(Silicon)/WrldBox.app/Contents/Info.plist"
CFBundleDevelopmentRegion
English
CFBundleExecutable
wrldbox_mac_arm64
CFBundleIconFile
AppIcon
CFBundleIdentifier
wholeworldcoding.com
CFBundleInfoDictionaryVersion
6.0
CFBundleName
WrldBox
CFBundlePackageType
APPL
CFBundleShortVersionString
1.0
CFBundleVersion
1
LSMinimumSystemVersion
11.0
EOF
# 6. Ad-hoc sign the bundle for Apple Silicon security compliance
echo "๐ Removing extended attributes..."
xattr -cr "$BUILD_DIR/MacOS(Silicon)/WrldBox.app"
find "$BUILD_DIR/MacOS(Silicon)/WrldBox.app" -name "._*" -exec rm -rf {} +
find "$BUILD_DIR/MacOS(Silicon)/WrldBox.app" -name ".DS_Store" -exec rm -rf {} +
echo "๐ Code signing the app bundle..."
codesign --force --deep --sign - "$BUILD_DIR/MacOS(Silicon)/WrldBox.app"
echo "โ
Success! built WrldBox.app for Apple Silicon at $BUILD_DIR/MacOS(Silicon)/WrldBox.app"
echo "๐ฆ Building for macOS (Intel)..."
clang src/*.c \
raylib_src/src/rcore.c raylib_src/src/rshapes.c raylib_src/src/rtextures.c \
raylib_src/src/rtext.c raylib_src/src/rmodels.c raylib_src/src/raudio.c \
-x objective-c raylib_src/src/rglfw.c \
-o wrldboxMacOSIntel \
-target x86_64-apple-macos10.12 \
-Iinclude -Iraylib_src/src -Iraylib_src/src/external/glfw/include \
-DPLATFORM_DESKTOP \
-framework OpenGL -framework Cocoa -framework IOKit -framework CoreVideo
echo "๐ Creating directory structure..."
mkdir -p "$BUILD_DIR/MacOS(Intel)/WrldBox.app/Contents/MacOS"
mkdir -p "$BUILD_DIR/MacOS(Intel)/WrldBox.app/Contents/Resources"
echo "๐ฆ Copying image..."
# ๐ก FIX 1: Changed "else if" to "elif" and added copy command after generation
if [ -f "build_resources/AppIcon.icns" ]; then
cp "build_resources/AppIcon.icns" "$BUILD_DIR/MacOS(Intel)/WrldBox.app/Contents/Resources/"
elif [ -f "build_resources/appicon.png" ]; then
echo "๐จ Converting appicon.png to macOS .icns format..."
mkdir -p build_resources/AppIcon.iconset
# Generate the standard sizes macOS requires
sips -z 16 16 build_resources/appicon.png --out build_resources/AppIcon.iconset/icon_16x16.png > /dev/null 2>&1
sips -z 32 32 build_resources/appicon.png --out build_resources/AppIcon.iconset/icon_16x16@2x.png > /dev/null 2>&1
sips -z 32 32 build_resources/appicon.png --out build_resources/AppIcon.iconset/icon_32x32.png > /dev/null 2>&1
sips -z 64 64 build_resources/appicon.png --out build_resources/AppIcon.iconset/icon_32x32@2x.png > /dev/null 2>&1
sips -z 128 128 build_resources/appicon.png --out build_resources/AppIcon.iconset/icon_128x128.png > /dev/null 2>&1
sips -z 256 256 build_resources/appicon.png --out build_resources/AppIcon.iconset/icon_128x128@2x.png > /dev/null 2>&1
sips -z 256 256 build_resources/appicon.png --out build_resources/AppIcon.iconset/icon_256x256.png > /dev/null 2>&1
sips -z 512 512 build_resources/appicon.png --out build_resources/AppIcon.iconset/icon_256x256@2x.png > /dev/null 2>&1
sips -z 512 512 build_resources/appicon.png --out build_resources/AppIcon.iconset/icon_512x512.png > /dev/null 2>&1
sips -z 1024 1024 build_resources/appicon.png --out build_resources/AppIcon.iconset/icon_512x512@2x.png > /dev/null 2>&1
# Compile into the final asset and clean up temporary folder
iconutil -c icns build_resources/AppIcon.iconset -o build_resources/AppIcon.icns
rm -rf build_resources/AppIcon.iconset
# Copy newly generated icns to the app bundle
cp "build_resources/AppIcon.icns" "$BUILD_DIR/MacOS(Intel)/WrldBox.app/Contents/Resources/"
else
echo "โ ๏ธ Warning: No icon asset found, skipping icon copy."
fi
echo "๐ฆ Moving binary..."
cp wrldboxMacOSIntel "$BUILD_DIR/MacOS(Intel)/WrldBox.app/Contents/MacOS/wrldbox_mac_intel"
mv wrldboxMacOSIntel "$BUILD_DIR/MacOS(Intel)/wrldbox_mac_intel"
# 5. Generate the Info.plist file
echo "๐ Generating Info.plist..."
# ๐ก FIX 2: Added single quotes around 'EOF' so your XML code is safe from Bash parsing errors
cat <<'EOF' > "$BUILD_DIR/MacOS(Intel)/WrldBox.app/Contents/Info.plist"
CFBundleDevelopmentRegion
English
CFBundleExecutable
wrldbox_mac_intel
CFBundleIconFile
AppIcon
CFBundleIdentifier
wholeworldcoding.com
CFBundleInfoDictionaryVersion
6.0
CFBundleName
WrldBox
CFBundlePackageType
APPL
CFBundleShortVersionString
1.0
CFBundleVersion
1
LSMinimumSystemVersion
11.0
EOF
echo "๐ Removing extended attributes..."
xattr -cr "$BUILD_DIR/MacOS(Intel)/WrldBox.app"
find "$BUILD_DIR/MacOS(Intel)/WrldBox.app" -name "._*" -exec rm -rf {} +
find "$BUILD_DIR/MacOS(Intel)/WrldBox.app" -name ".DS_Store" -exec rm -rf {} +
echo "๐ Code signing the app bundle..."
codesign --force --deep --sign - "$BUILD_DIR/MacOS(Intel)/WrldBox.app"
echo "โ
Success! built WrldBox.app for Intel Macs at $BUILD_DIR/MacOS(Intel)/WrldBox.app"
rm -rf zig-out
echo "--------------------------------------------------------"
echo "checking builds..."
file "$BUILD_DIR/Linux(ARM64)/wrldbox_linux_arm64"
file "$BUILD_DIR/Linux(x86_64)/wrldbox_linux_x86_64"
file "$BUILD_DIR/Windows(x86_64)/wrldbox_win_x86_64.exe"
file "$BUILD_DIR/Windows(ARM64)/wrldbox_win_arm64.exe"
file "$BUILD_DIR/MacOS(Silicon)/wrldbox_mac_arm64"
file "$BUILD_DIR/MacOS(Intel)/wrldbox_mac_intel"
echo "\nโ
Done! All targets generated safely inside /$BUILD_DIR/"