diff --git a/testing/tic-80/APKBUILD b/testing/tic-80/APKBUILD
new file mode 100644
index 0000000000000000000000000000000000000000..d7c66107f3f05e703aae1a1e6685ab2cb3b60162
--- /dev/null
+++ b/testing/tic-80/APKBUILD
@@ -0,0 +1,151 @@
+# Contributor: mio <miyopan@e.email>
+# Maintainer: mio <miyopan@e.email>
+pkgname=tic-80
+pkgver=1.0.2164
+_gitrev="b09c50c61f2e8f66959ee9539e5a05feaeaf8ae1"
+pkgrel=0
+pkgdesc="Fantasy computer for making, playing and sharing tiny games"
+url="https://tic80.com/"
+license="MIT"
+arch="all !ppc64le" # Build failed on ppc64le with libpng.a error
+depends="
+	fennel5.3
+	lua5.3
+	lua5.3-moonscript
+	ruby
+	ruby-rake
+	"
+makedepends="
+	cmake
+	fennel5.3
+	freeglut-dev
+	giflib-dev
+	glu-dev
+	http-parser-dev
+	jack-dev
+	libpng-dev
+	libuv-dev
+	lua5.3-dev
+	lua5.3-moonscript
+	pulseaudio-dev
+	ruby-dev
+	ruby-rake
+	samurai
+	sdl2-dev
+	zlib-dev
+	"
+builddir="$srcdir"/TIC-80-"$pkgver"
+options="!check" # No tests
+
+# Submodules list from https://github.com/nesbox/TIC-80/tree/v$pkgver/vendor
+# The zip library used is a minizip fork that is not a direct replacement.
+# The moonscript library contains a required header file.
+# Sokol is not enabled by default, so it is not included here as a dependency.
+_argparse_rev="0d5f5d0745df14a3f373f7eed85bf524714f4524"
+_blip_buf_rev="330226d9b55ecbeea644e17b5e0f096a165ca07e"
+_circle_stdlib_rev="fdb3c4a948421d47fddab8042a92f980cba43915"
+_dirent_rev="c885633e126a3a949ec0497273ec13e2c03e862c"
+_duktape_rev="28f915a5381ca3a7dfa22130d08fbc5a16ae5d2f"
+_lpeg_rev="73d8614a8dea404cf7bfe25a6e4cea7183dc9fb7"
+_moonscript_rev="17179283012b392bff972ad66231d73bfeec6e90"
+_mruby_rev="0f45836b5954accf508f333f932741b925214471"
+_squirrel_rev="9dcf74f99097898dd5a111c4a55b89d1c4d606c0"
+_wasm3_rev="a3abb3f2d320994be59dfbe2cdafa8d0b6a8253e"
+_wren_rev="4a18fc489f9ea3d253b20dd40f4cdad0d6bb40eb"
+_zip_rev="d7df626f3aa457e01669f65e61bf8f484e352941"
+_submodules="
+	argparse-$_argparse_rev
+	blip-buf-$_blip_buf_rev
+	circle-stdlib-$_circle_stdlib_rev
+	dirent-$_dirent_rev
+	duktape-releases-$_duktape_rev
+	lpeg-$_lpeg_rev
+	moonscript-$_moonscript_rev
+	mruby-$_mruby_rev
+	squirrel-$_squirrel_rev
+	wasm3-$_wasm3_rev
+	wren-$_wren_rev
+	zip-$_zip_rev
+	"
+source="tic-80-$pkgver.tar.gz::https://github.com/nesbox/TIC-80/archive/v$pkgver/tic80-v$pkgver.tar.gz
+	argparse-$_argparse_rev.tar.gz::https://github.com/cofyc/argparse/archive/$_argparse_rev.tar.gz
+	blip-buf-$_blip_buf_rev.tar.gz::https://github.com/nesbox/blip-buf/archive/$_blip_buf_rev.tar.gz
+	circle-stdlib-$_circle_stdlib_rev.tar.gz::https://github.com/smuehlst/circle-stdlib/archive/$_circle_stdlib_rev.tar.gz
+	dirent-$_dirent_rev.tar.gz::https://github.com/tronkko/dirent/archive/$_dirent_rev.tar.gz
+	duktape-$_duktape_rev.tar.gz::https://github.com/svaarala/duktape-releases/archive/$_duktape_rev.tar.gz
+	lpeg-$_lpeg_rev.tar.gz::https://github.com/nesbox/lpeg/archive/$_lpeg_rev.tar.gz
+	moonscript-$_moonscript_rev.tar.gz::https://github.com/nesbox/moonscript/archive/$_moonscript_rev.tar.gz
+	mruby-$_mruby_rev.tar.gz::https://github.com/mruby/mruby/archive/$_mruby_rev.tar.gz
+	squirrel-$_squirrel_rev.tar.gz::https://github.com/albertodemichelis/squirrel/archive/$_squirrel_rev.tar.gz
+	wasm3-$_wasm3_rev.tar.gz::https://github.com/wasm3/wasm3/archive/$_wasm3_rev.tar.gz
+	wren-$_wren_rev.tar.gz::https://github.com/wren-lang/wren/archive/$_wren_rev.tar.gz
+	zip-$_zip_rev.tar.gz::https://github.com/kuba--/zip/archive/$_zip_rev.tar.gz
+	use-repo-deps.patch
+	"
+
+prepare() {
+	default_prepare
+	cd "$srcdir"
+
+	# Copy extracted submodules into the main package source
+	_vendor_dir="$srcdir"/TIC-80-"$pkgver"/vendor/
+	for _mod in $_submodules; do
+		_mod_rev=${_mod##*-}
+		_mod_name=$(echo $_mod | sed -e "s/-$_mod_rev//")
+		case $_mod in
+		duktape-releases*)
+			mv $_mod duktape
+			mv duktape $_vendor_dir
+			;;
+		*)
+			mv $_mod $_mod_name
+			mv $_mod_name $_vendor_dir
+			;;
+		esac
+	done
+
+	# Set version revision for executable to display the correct version
+	_version_rev=${pkgver##*\.}
+	sed -i "s/VERSION_REVISION 0/VERSION_REVISION $_version_rev/" \
+		TIC-80-"$pkgver"/CMakeLists.txt
+}
+
+build() {
+	cmake -B build-tic -G Ninja \
+		-DCMAKE_BUILD_TYPE=Release \
+		-DCMAKE_INSTALL_PREFIX=/usr \
+		-DVERSION_HASH=${_gitrev:0:7} \
+		-DCMAKE_SKIP_INSTALL_RPATH=ON \
+		-DBUILD_PRO=ON
+	cmake --build build-tic
+}
+
+package() {
+	DESTDIR="$pkgdir" cmake --install build-tic
+
+	# extra tools need manual install
+	cd build-tic
+	install -Dm755 bin/bin2txt -t "$pkgdir"/usr/bin
+	install -Dm755 bin/cart2prj -t "$pkgdir"/usr/bin
+	install -Dm755 bin/player-sdl -t "$pkgdir"/usr/bin
+	install -Dm755 bin/prj2cart -t "$pkgdir"/usr/bin
+	install -Dm755 bin/wasmp2cart -t "$pkgdir"/usr/bin
+	install -Dm755 bin/xplode -t "$pkgdir"/usr/bin
+}
+
+sha512sums="
+c4765d00ad5dcbcf14e78eaa4e42b0128a5010c093bfacd79dbfc49fe951dc06ee4dab412c29662d70832b0298aa721aa2c31438db23fbd225790091f42b6005  tic-80-1.0.2164.tar.gz
+2dba667249c19ec470421327f6cc20f11a168847a99f60db395980c28339a269041a778645355d8ecbac76e1eac0b77c12f3f2fb3573e0e372ccfffdc947ca1c  argparse-0d5f5d0745df14a3f373f7eed85bf524714f4524.tar.gz
+69c42cd93cbb640952244c44cdaf75e0808536ca37300912d026c2aedc878b5f105ae109a5eef1a558b1fdc8a692112491515c6813113a007878908224eba5d8  blip-buf-330226d9b55ecbeea644e17b5e0f096a165ca07e.tar.gz
+f12f89b95913ab3b3a3f23ccabf93a4591875a1dda5ac50f9318d3e750b6f9fcc2450bd2172592b14ae2734d96b3c3986c488bb3d0190213d7f439121533035a  circle-stdlib-fdb3c4a948421d47fddab8042a92f980cba43915.tar.gz
+ce4a2b445073b3bb82d31934ce2d1dcea771723d4cf1778e065cfe787e91128d995cfccc96d860aceb3637f35627dfbf597e423967f08c5ecf855992e9a84581  dirent-c885633e126a3a949ec0497273ec13e2c03e862c.tar.gz
+c0af8ec295cb86371dc1ba74b446d0abe5b6ea51fb9ef68b01aea08d066d1c8b4fea4b6ce1e7786076bb19135bd1677a80f7ab889efddb43c5ac39d5a9ecea38  duktape-28f915a5381ca3a7dfa22130d08fbc5a16ae5d2f.tar.gz
+93956abcafe84d200fab41d54686cbba6ac8eae91292dc4282186543edef8211e2768dab83854b149e21cb0775b1c2ef8fd79b94f3f72a860b9710841c843b2e  lpeg-73d8614a8dea404cf7bfe25a6e4cea7183dc9fb7.tar.gz
+05a26627c1a8686d876654751e590c024aa603fff6ff75ed4ed61d499c16c9fef5616222a6dfc5f11aaf9a7ed79786f92e5a15ca8a42fa79c5adba3228f3bdad  moonscript-17179283012b392bff972ad66231d73bfeec6e90.tar.gz
+699c3bbbcbbe51806d1c5802c623bebf0b1d33e80052ea2c0ef7d51b1e9d0bb17e3469613272832a7defd9c344ed44960e8d0f32a59808ea06fff23b3e7360eb  mruby-0f45836b5954accf508f333f932741b925214471.tar.gz
+0bc2e0842b429854a8f61f2ed0b2261f6af49849f1a90f2fc2aa3578a892b2a97131dcc209eb9c7ceda5544162542a757d4ca091797f0fc0324664f3cfe7fc7e  squirrel-9dcf74f99097898dd5a111c4a55b89d1c4d606c0.tar.gz
+e23e24b697c068b27a5aba71dec33d84b5079155344aa52d2997e2267986167df30ee3e264ad8ff40c62ae73b95eb48896b9e8a47bf9904cc23bbae61818e245  wasm3-a3abb3f2d320994be59dfbe2cdafa8d0b6a8253e.tar.gz
+b3d79e9cb647e52db06d5cddfc8c93d05ae0e8d87f0f879ac2b812fcc7f55e018d21d3b04d62eaeb12e6d931b5e43fbe357b187e7f446e86e39be015c51c2eee  wren-4a18fc489f9ea3d253b20dd40f4cdad0d6bb40eb.tar.gz
+ebfa73418963010277f112e1e652c8da54994087a1d8095c527f75a799e4d0933e4ff78bdb361cedb1c844b167145fe010c2805a08c2825476f755899eb68fdc  zip-d7df626f3aa457e01669f65e61bf8f484e352941.tar.gz
+885eb325d0202356c3991f63dbf45c841914d2daa67c4a9db0061890ce7e959fb1a4b35c230987eaca8f6adc800070393657ac4a7a46b8dc6e94a70ffaa3ab6a  use-repo-deps.patch
+"
diff --git a/testing/tic-80/use-repo-deps.patch b/testing/tic-80/use-repo-deps.patch
new file mode 100644
index 0000000000000000000000000000000000000000..0072d8acc529250be2d7b3188f41affa48d82570
--- /dev/null
+++ b/testing/tic-80/use-repo-deps.patch
@@ -0,0 +1,286 @@
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -14,7 +14,6 @@
+     string(TOUPPER ${CMAKE_BUILD_TYPE} BUILD_TYPE_UC)
+ endif()
+ 
+-find_package(Git)
+ if(Git_FOUND)
+     execute_process(
+         COMMAND ${GIT_EXECUTABLE} status
+@@ -159,47 +158,15 @@
+ # LUA
+ ################################
+ 
+-set(LUA_DIR ${THIRDPARTY_DIR}/lua)
+-set(LUA_SRC
+-    ${LUA_DIR}/lapi.c
+-    ${LUA_DIR}/lcode.c
+-    ${LUA_DIR}/lctype.c
+-    ${LUA_DIR}/ldebug.c
+-    ${LUA_DIR}/ldo.c
+-    ${LUA_DIR}/ldump.c
+-    ${LUA_DIR}/lfunc.c
+-    ${LUA_DIR}/lgc.c
+-    ${LUA_DIR}/llex.c
+-    ${LUA_DIR}/lmem.c
+-    ${LUA_DIR}/lobject.c
+-    ${LUA_DIR}/lopcodes.c
+-    ${LUA_DIR}/lparser.c
+-    ${LUA_DIR}/lstate.c
+-    ${LUA_DIR}/lstring.c
+-    ${LUA_DIR}/ltable.c
+-    ${LUA_DIR}/ltm.c
+-    ${LUA_DIR}/lundump.c
+-    ${LUA_DIR}/lvm.c
+-    ${LUA_DIR}/lzio.c
+-    ${LUA_DIR}/lauxlib.c
+-    ${LUA_DIR}/lbaselib.c
+-    ${LUA_DIR}/lcorolib.c
+-    ${LUA_DIR}/ldblib.c
+-    ${LUA_DIR}/liolib.c
+-    ${LUA_DIR}/lmathlib.c
+-    ${LUA_DIR}/loslib.c
+-    ${LUA_DIR}/lstrlib.c
+-    ${LUA_DIR}/ltablib.c
+-    ${LUA_DIR}/lutf8lib.c
+-    ${LUA_DIR}/loadlib.c
+-    ${LUA_DIR}/linit.c
+-)
++# FIXME
++find_package(PkgConfig)
++pkg_check_modules(Lua REQUIRED lua5.3 IMPORTED_TARGET GLOBAL)
++add_library(Lua::Lua ALIAS PkgConfig::Lua)
++set(LUA_INCLUDE_DIR "/usr/include/lua5.3")
++set(LUA_LIBRARIES "/usr/lib/lua5.3")
++include_directories(${LUA_INCLUDE_DIR})
++link_directories(${LUA_LIBRARIES})
+ 
+-add_library(lua STATIC ${LUA_SRC})
+-
+-target_compile_definitions(lua PRIVATE LUA_COMPAT_5_2)
+-target_include_directories(lua INTERFACE ${THIRDPARTY_DIR}/lua)
+-
+ if(N3DS)
+     target_compile_definitions(lua PUBLIC LUA_32BITS)
+ endif()
+@@ -374,20 +341,7 @@
+ # GIFLIB
+ ################################
+ 
+-set(GIFLIB_DIR ${THIRDPARTY_DIR}/giflib)
+-set(GIFLIB_SRC
+-    ${GIFLIB_DIR}/dgif_lib.c
+-    ${GIFLIB_DIR}/egif_lib.c
+-    ${GIFLIB_DIR}/gif_err.c
+-    ${GIFLIB_DIR}/gif_font.c
+-    ${GIFLIB_DIR}/gif_hash.c
+-    ${GIFLIB_DIR}/gifalloc.c
+-    ${GIFLIB_DIR}/openbsd-reallocarray.c
+-)
+-add_library(giflib STATIC ${GIFLIB_SRC})
+-target_include_directories(giflib
+-    PRIVATE ${GIFLIB_DIR}
+-    INTERFACE ${THIRDPARTY_DIR}/giflib)
++find_package(GIF)
+ 
+ ################################
+ # Blipbuf
+@@ -444,6 +398,7 @@
+             ${CMAKE_SOURCE_DIR}/include
+             ${CMAKE_SOURCE_DIR}/src)
+ 
++
+     target_link_libraries(tic80core${SCRIPT}
+         lua 
+         lpeg 
+@@ -452,7 +407,7 @@
+         squirrel 
+         duktape 
+         blipbuf 
+-        zlib
++        z
+     )
+ 
+     if(BUILD_WITH_MRUBY)
+@@ -461,7 +416,7 @@
+ 
+     if(${BUILD_DEPRECATED})
+         target_compile_definitions(tic80core${SCRIPT} PRIVATE BUILD_DEPRECATED)
+-        target_link_libraries(tic80core${SCRIPT} giflib)
++        target_link_libraries(tic80core${SCRIPT} gif)
+     endif()
+ 
+     if(LINUX)
+@@ -507,10 +462,10 @@
+         set(SDL_STATIC_PIC ON CACHE BOOL "" FORCE)
+     endif()
+ 
+-    set(SDL_SHARED OFF CACHE BOOL "" FORCE)
++    find_package(SDL2)
++    set(SDL2_INCLUDE_DIR "/usr/include/SDL2")
++    include_directories(${SDL2_INCLUDE_DIR})
+ 
+-    add_subdirectory(${THIRDPARTY_DIR}/sdl2)
+-
+ endif()
+ 
+ ################################
+@@ -531,7 +486,7 @@
+         target_link_options(player-sdl PRIVATE -static)
+     endif()
+ 
+-    target_link_libraries(player-sdl tic80core SDL2-static SDL2main)
++    target_link_libraries(player-sdl tic80core SDL2 SDL2main)
+ endif()
+ 
+ ################################
+@@ -659,30 +614,8 @@
+ 
+ if (NOT N3DS)
+ 
+-set(ZLIB_DIR ${THIRDPARTY_DIR}/zlib)
+-set(ZLIB_SRC
+-    ${ZLIB_DIR}/adler32.c
+-    ${ZLIB_DIR}/compress.c
+-    ${ZLIB_DIR}/crc32.c
+-    ${ZLIB_DIR}/deflate.c
+-    ${ZLIB_DIR}/inflate.c
+-    ${ZLIB_DIR}/infback.c
+-    ${ZLIB_DIR}/inftrees.c
+-    ${ZLIB_DIR}/inffast.c
+-    ${ZLIB_DIR}/trees.c
+-    ${ZLIB_DIR}/uncompr.c
+-    ${ZLIB_DIR}/zutil.c
+-)
++find_package(ZLIB)
+ 
+-add_library(zlib STATIC ${ZLIB_SRC})
+-target_include_directories(zlib INTERFACE ${THIRDPARTY_DIR}/zlib)
+-
+-else ()
+-
+-add_library(zlib STATIC IMPORTED)
+-set_target_properties( zlib PROPERTIES IMPORTED_LOCATION ${DEVKITPRO}/portlibs/3ds/lib/libz.a )
+-target_include_directories(zlib INTERFACE ${DEVKITPRO}/portlibs/3ds/include)
+-
+ endif ()
+ 
+ ################################
+@@ -713,7 +646,7 @@
+     target_link_libraries(wasmp2cart tic80core)
+ 
+     add_executable(bin2txt ${TOOLS_DIR}/bin2txt.c)
+-    target_link_libraries(bin2txt zlib)
++    target_link_libraries(bin2txt z)
+ 
+     add_executable(xplode
+         ${TOOLS_DIR}/xplode.c
+@@ -722,7 +655,7 @@
+         ${CMAKE_SOURCE_DIR}/src/studio/project.c)
+ 
+     target_include_directories(xplode PRIVATE ${CMAKE_SOURCE_DIR}/src ${CMAKE_SOURCE_DIR}/include)
+-    target_link_libraries(xplode tic80core png giflib)
++    target_link_libraries(xplode tic80core png gif)
+ 
+     if(LINUX)
+         target_link_libraries(xplode m)
+@@ -804,7 +737,8 @@
+ ################################
+ 
+ if(USE_LIBUV)
+-    add_subdirectory(${THIRDPARTY_DIR}/libuv)
++    pkg_check_modules(libuv REQUIRED libuv IMPORTED_TARGET GLOBAL)
++    add_library(libuv:libuv ALIAS PkgConfig::libuv)
+ endif()
+ 
+ ################################
+@@ -812,44 +746,16 @@
+ ################################
+ 
+ if(USE_LIBUV)
+-    add_library(http_parser STATIC ${THIRDPARTY_DIR}/http-parser/http_parser.c)
+-    target_include_directories(http_parser INTERFACE ${THIRDPARTY_DIR}/http-parser)
++    set(HTTP_PARSER_INCLUDE_DIR "/usr/include")
++    set(HTTP_PARSER_LIBRARIES "/usr/lib/libhttp_parser.so")
+ endif()
+ 
+ ################################
+ # PNG
+ ################################
+ 
+-set(LIBPNG_DIR ${THIRDPARTY_DIR}/libpng)
+-set(LIBPNG_SRC
+-    ${LIBPNG_DIR}/png.c
+-    ${LIBPNG_DIR}/pngerror.c
+-    ${LIBPNG_DIR}/pngget.c
+-    ${LIBPNG_DIR}/pngmem.c
+-    ${LIBPNG_DIR}/pngpread.c
+-    ${LIBPNG_DIR}/pngread.c
+-    ${LIBPNG_DIR}/pngrio.c
+-    ${LIBPNG_DIR}/pngrtran.c
+-    ${LIBPNG_DIR}/pngrutil.c
+-    ${LIBPNG_DIR}/pngset.c
+-    ${LIBPNG_DIR}/pngtrans.c
+-    ${LIBPNG_DIR}/pngwio.c
+-    ${LIBPNG_DIR}/pngwrite.c
+-    ${LIBPNG_DIR}/pngwtran.c
+-    ${LIBPNG_DIR}/pngwutil.c
+-)
++find_package(PNG)
+ 
+-configure_file(${LIBPNG_DIR}/scripts/pnglibconf.h.prebuilt ${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h)
+-
+-add_library(png STATIC ${LIBPNG_SRC})
+-
+-target_compile_definitions(png PRIVATE PNG_ARM_NEON_OPT=0)
+-
+-target_include_directories(png
+-    PUBLIC ${CMAKE_CURRENT_BINARY_DIR}
+-    PRIVATE ${THIRDPARTY_DIR}/zlib
+-    INTERFACE ${THIRDPARTY_DIR}/libpng)
+-
+ ################################
+ # TIC-80 studio
+ ################################
+@@ -896,11 +802,11 @@
+ 
+ target_include_directories(tic80studio PUBLIC ${CMAKE_CURRENT_BINARY_DIR})
+ 
+-target_link_libraries(tic80studio tic80core zip wave_writer argparse giflib png)
++target_link_libraries(tic80studio tic80core zip wave_writer argparse gif png)
+ 
+ if(USE_LIBUV)
+     target_compile_definitions(tic80studio PRIVATE USE_LIBUV)
+-    target_link_libraries(tic80studio uv_a http_parser)
++    target_link_libraries(tic80studio uv http_parser)
+ endif()
+ 
+ if(BUILD_PRO)
+@@ -982,7 +888,7 @@
+ endif()
+ 
+ if(NOT EMSCRIPTEN)
+-    target_link_libraries(sdlgpu SDL2-static)
++    target_link_libraries(sdlgpu SDL2)
+ endif()
+ 
+ endif()
+@@ -1050,7 +956,7 @@
+         elseif(RPI)
+             target_link_libraries(tic80 libSDL2.a bcm_host)
+         else()
+-            target_link_libraries(tic80 SDL2-static)
++            target_link_libraries(tic80 SDL2)
+         endif()
+     endif()
+ 
+@@ -1199,7 +1105,7 @@
+             elseif(RPI)
+                 target_link_libraries(tic80${SCRIPT} libSDL2.a bcm_host pthread dl)
+             else()
+-                target_link_libraries(tic80${SCRIPT} SDL2-static)
++                target_link_libraries(tic80${SCRIPT} SDL2)
+             endif()
+         endif()
+