#!/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/"