build scripts support android platform subfolders
diff --git a/.gitignore b/.gitignore
index c61f2be..e685e1a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -64,6 +64,9 @@
 skia/dependencies/FFmpeg
 skia/dependencies/x264
 skia/renderer/build/bin
+skia/renderer/build/obj
+skia/renderer/build/macosx
+skia/renderer/build/android
 skia/**/build/bin
 /skia/dependencies/glfw
 /skia/dependencies/gl3w
@@ -74,3 +77,4 @@
 /skia/viewer/build/macosx
 /skia/thumbnail_generator/build/macosx
 /build/macosx
+/build/android
diff --git a/build.sh b/build.sh
index 890b113..633c507 100755
--- a/build.sh
+++ b/build.sh
@@ -1,69 +1,78 @@
 #!/bin/bash
-
 set -e
 
 pushd build &>/dev/null
 
-while getopts p: flag
-do
+while getopts p: flag; do
     case "${flag}" in
-        p) 
-            shift 2
-            platform=${OPTARG}
-            ;;
+    p)
+        shift 2
+        platform=${OPTARG}
+        ;;
+    \?) help ;;
     esac
 done
 
-# make sure argument is lowercase
-OPTION="$(echo $1 | tr '[A-Z]' '[a-z]')"
-
-if [ "$OPTION" = 'help' ]
-then
+help() {
     echo build.sh - build debug library
     echo build.sh clean - clean the build
-    echo build.sh release - build release library 
-    echo build.sh -p ios release - build release ios library 
-    echo build.sh -p android release - build release android library 
-    exit
+    echo build.sh release - build release library
+    echo build.sh -p ios release - build release ios library
+    echo build.sh -p android release - build release android library
+    exit 1
+}
+
+# make sure argument is lowercase
+OPTION="$(echo "$1" | tr '[A-Z]' '[a-z]')"
+
+if [ "$OPTION" = 'help' ]; then
+    help
 else
     build() {
         echo "Building Rive for platform=$platform option=$OPTION"
+        echo premake5 gmake2 "$1"
         PREMAKE="premake5 gmake2 $1"
-        eval $PREMAKE
-        if [ "$OPTION" = "clean" ]
-        then
+        eval "$PREMAKE"
+        if [ "$OPTION" = "clean" ]; then
             make clean
             make clean config=release
-        elif [ "$OPTION" = "release" ]
-        then
+        elif [ "$OPTION" = "release" ]; then
             make config=release -j7
         else
             make -j7
         fi
     }
 
-    case $platform in 
-        ios)
-            echo "Building for iOS"
-            export IOS_SYSROOT=$(xcrun --sdk iphoneos --show-sdk-path)
-            build "--os=ios"
-            export IOS_SYSROOT=$(xcrun --sdk iphonesimulator --show-sdk-path)
-            build "--os=ios --variant=emulator"
-            if [ "$OPTION" = "clean" ]
-            then
-                exit
-            elif [ "$OPTION" = "release" ]
-            then
-                config="release"
-            else
-                config="debug"
-            fi
+    case $platform in
+    ios)
+        echo "Building for iOS"
+        export IOS_SYSROOT=$(xcrun --sdk iphoneos --show-sdk-path)
+        build "--os=ios"
+        export IOS_SYSROOT=$(xcrun --sdk iphonesimulator --show-sdk-path)
+        build "--os=ios --variant=emulator"
+        if [ "$OPTION" = "clean" ]; then
+            exit
+        elif [ "$OPTION" = "release" ]; then
+            config="release"
+        else
+            config="debug"
+        fi
+        xcrun -sdk iphoneos lipo -create -arch x86_64 ios_sim/bin/$config/librive.a ios/bin/$config/librive.a -output ios/bin/$config/librive_fat.a
+        # print all the available architectures
+        lipo -info ios/bin/$config/librive_fat.a
         ;;
-        android)
-            build "--os=android"
+    # Android supports ABIs via a custom platform format:
+    #   e.g. 'android.x86', 'android.x64', etc.
+    android*)
+        echo "Building for ${platform}"
+        # Extract ABI from this opt by splitting on '.' character
+        #   e.g. android.x86
+        IFS="." read -ra strarr <<<"$platform"
+        ARCH=${strarr[1]}
+        build "--os=android --arch=${ARCH}"
         ;;
-        *)
-            build
+    *)
+        build
         ;;
     esac
 fi
diff --git a/build/premake5.lua b/build/premake5.lua
index 097eb39..c724b92 100644
--- a/build/premake5.lua
+++ b/build/premake5.lua
@@ -30,6 +30,23 @@
         targetdir "%{cfg.system}_sim/bin/%{cfg.buildcfg}"
         objdir "%{cfg.system}_sim/obj/%{cfg.buildcfg}"
 
+    -- Is there a way to pass 'arch' as a variable here?
+    filter { "system:android", "options:arch=x86" }
+        targetdir "%{cfg.system}/x86/bin/%{cfg.buildcfg}"
+        objdir "%{cfg.system}/x86/obj/%{cfg.buildcfg}"
+
+    filter { "system:android", "options:arch=x64" }
+        targetdir "%{cfg.system}/x64/bin/%{cfg.buildcfg}"
+        objdir "%{cfg.system}/x64/obj/%{cfg.buildcfg}"
+
+    filter { "system:android", "options:arch=arm" }
+        targetdir "%{cfg.system}/arm/bin/%{cfg.buildcfg}"
+        objdir "%{cfg.system}/arm/obj/%{cfg.buildcfg}"
+
+    filter { "system:android", "options:arch=arm64" }
+        targetdir "%{cfg.system}/arm64/bin/%{cfg.buildcfg}"
+        objdir "%{cfg.system}/arm64/obj/%{cfg.buildcfg}"
+
     filter "configurations:debug"
         defines {"DEBUG"}
         symbols "On"
@@ -48,4 +65,17 @@
         { "emulator",  "Builds for an emulator/simulator for the provided system" }
     },
     default = "system"
+}
+
+newoption {
+    trigger = "arch",
+    value = "ABI",
+    description = "The ABI with the right toolchain for this build, generally with Android",
+    allowed = {
+        { "x86" },
+        { "x64" },
+        { "arm" },
+        { "arm64" }
+    }
+
 }
\ No newline at end of file
diff --git a/skia/renderer/build.sh b/skia/renderer/build.sh
index 76718b6..f50f126 100755
--- a/skia/renderer/build.sh
+++ b/skia/renderer/build.sh
@@ -3,76 +3,83 @@
 
 # build main rive
 cd ../..
-./build.sh $@
+./build.sh "$@"
 
 # build skia renderer
 cd skia/renderer
 
 pushd build &>/dev/null
 
-
-while getopts p: flag
-do
+while getopts p: flag; do
     case "${flag}" in
-        p) 
-            shift 2
-            platform=${OPTARG}
-            ;;
+    p)
+        shift 2
+        platform=${OPTARG}
+        ;;
+
+    \?) help ;;
     esac
 done
 
 # make sure argument is lowercase
-OPTION="$(echo $1 | tr '[A-Z]' '[a-z]')"
+OPTION="$(echo "$1" | tr '[A-Z]' '[a-z]')"
 
-if [ "$OPTION" = 'help' ]
-then
+help() {
     echo build.sh - build debug library
     echo build.sh clean - clean the build
-    echo build.sh release - build release library 
-    echo build.sh -p ios release - build release ios library 
-    echo build.sh -p android release - build release android library 
-    exit
+    echo build.sh release - build release library
+    echo build.sh -p ios release - build release ios library
+    echo build.sh -p android release - build release android library
+    exit 1
+}
+
+if [ "$OPTION" = 'help' ]; then
+    help
 else
     build() {
         echo "Building Skia Renderer for $platform option=$OPTION"
 
         PREMAKE="premake5 gmake2 $1"
-        eval $PREMAKE
-        if [ "$OPTION" = "clean" ]
-        then
+        eval "$PREMAKE"
+        if [ "$OPTION" = "clean" ]; then
             make clean
             make clean config=release
-        elif [ "$OPTION" = "release" ]
-        then
+        elif [ "$OPTION" = "release" ]; then
             make config=release -j7
         else
             make -j7
         fi
     }
 
-    case $platform in 
-        ios)
-            echo "Building for iOS"
-            export IOS_SYSROOT=$(xcrun --sdk iphoneos --show-sdk-path)
-            build "--os=ios"
-            export IOS_SYSROOT=$(xcrun --sdk iphonesimulator --show-sdk-path)
-            build "--os=ios --variant=emulator"
-            if [ "$OPTION" = "clean" ]
-            then
-                exit
-            elif [ "$OPTION" = "release" ]
-            then
-                config="release"
-            else
-                config="debug"
-            fi
+    case $platform in
+    ios)
+        echo "Building for iOS"
+        export IOS_SYSROOT=$(xcrun --sdk iphoneos --show-sdk-path)
+        build "--os=ios"
+        export IOS_SYSROOT=$(xcrun --sdk iphonesimulator --show-sdk-path)
+        build "--os=ios --variant=emulator"
+        if [ "$OPTION" = "clean" ]; then
+            exit
+        elif [ "$OPTION" = "release" ]; then
+            config="release"
+        else
+            config="debug"
+        fi
+        xcrun -sdk iphoneos lipo -create -arch x86_64 ios_sim/bin/$config/librive_skia_renderer.a ios/bin/$config/librive_skia_renderer.a -output ios/bin/$config/librive_skia_renderer_fat.a
+        # print all the available architectures
+        lipo -info ios/bin/$config/librive_skia_renderer_fat.a
         ;;
-        android)
-
-            build "--os=android"
+    # Android supports ABIs via a custom platform format:
+    #   e.g. 'android.x86', 'android.x64', etc.
+    android*)
+        echo "Building for ${platform}"
+        # Extract ABI from this opt by splitting on '.' character
+        IFS="." read -ra strarr <<<"$platform"
+        ARCH=${strarr[1]}
+        build "--os=android --arch=${ARCH}"
         ;;
-        *)
-            build
+    *)
+        build
         ;;
     esac
 fi
diff --git a/skia/renderer/build/premake5.lua b/skia/renderer/build/premake5.lua
index 381ef0e..8d99447 100644
--- a/skia/renderer/build/premake5.lua
+++ b/skia/renderer/build/premake5.lua
@@ -37,6 +37,24 @@
         buildoptions {"-mios-version-min=10.0 -arch x86_64 -arch arm64 -isysroot " .. (os.getenv("IOS_SYSROOT") or "")}
         targetdir "%{cfg.system}_sim/bin/%{cfg.buildcfg}"
         objdir "%{cfg.system}_sim/obj/%{cfg.buildcfg}"
+    
+    -- Is there a way to pass 'arch' as a variable here?
+    filter { "system:android", "options:arch=x86" }
+        targetdir "%{cfg.system}/x86/bin/%{cfg.buildcfg}"
+        objdir "%{cfg.system}/x86/obj/%{cfg.buildcfg}"
+
+    filter { "system:android", "options:arch=x64" }
+        targetdir "%{cfg.system}/x64/bin/%{cfg.buildcfg}"
+        objdir "%{cfg.system}/x64/obj/%{cfg.buildcfg}"
+
+    filter { "system:android", "options:arch=arm" }
+        targetdir "%{cfg.system}/arm/bin/%{cfg.buildcfg}"
+        objdir "%{cfg.system}/arm/obj/%{cfg.buildcfg}"
+
+    filter { "system:android", "options:arch=arm64" }
+        targetdir "%{cfg.system}/arm64/bin/%{cfg.buildcfg}"
+        objdir "%{cfg.system}/arm64/obj/%{cfg.buildcfg}"
+
 
     filter "configurations:debug"
         defines {"DEBUG"}
@@ -55,4 +73,17 @@
         { "emulator",  "Builds for an emulator/simulator for the provided system" }
     },
     default = "system"
+}
+
+newoption {
+    trigger = "arch",
+    value = "ABI",
+    description = "The ABI with the right toolchain for this build, generally with Android",
+    allowed = {
+        { "x86" },
+        { "x64" },
+        { "arm" },
+        { "arm64" }
+    }
+
 }
\ No newline at end of file