diff --git a/recipes/gears/recipe.sh b/recipes/gears/recipe.sh
index 9dba93e37dd2d33022867d6f6b7e02ab9075742d..2b8dc8c9b59e397e3a9b9d32e539dd43221e14fd 100644
--- a/recipes/gears/recipe.sh
+++ b/recipes/gears/recipe.sh
@@ -1,4 +1,4 @@
-BUILD_DEPENDS=(liborbital mesa mesa_glu zlib)
+BUILD_DEPENDS=(liborbital llvm mesa mesa_glu zlib)
 
 function recipe_version {
     printf "1.0.0"
diff --git a/recipes/llvm/recipe.sh b/recipes/llvm/recipe.sh
deleted file mode 100644
index fc0e4370d4b0cca71cfc43a4a8ff71a60a743e24..0000000000000000000000000000000000000000
--- a/recipes/llvm/recipe.sh
+++ /dev/null
@@ -1,92 +0,0 @@
-GIT=https://gitlab.redox-os.org/redox-os/llvm-project.git
-GIT_UPSTREAM=https://github.com/rust-lang/llvm-project.git
-BRANCH=redox-2022-03-18
-
-function recipe_version {
-    printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
-    skip=1
-}
-
-function recipe_update {
-    echo "skipping update"
-    skip=1
-}
-
-function recipe_prepare {
-    mkdir -p build
-    skip=1
-}
-
-function recipe_build {
-    native="$(realpath ../native.cmake)"
-    source="$(realpath ../source/llvm)"
-    sysroot="$(realpath ../sysroot)"
-    CMAKE_ARGS=(
-        -DCMAKE_AR="$(which "${AR}")"
-        -DCMAKE_BUILD_TYPE=Release
-        -DCMAKE_CROSSCOMPILING=True
-        -DCMAKE_CXX_FLAGS="--std=gnu++11"
-        -DCMAKE_EXE_LINKER_FLAGS="-static"
-        -DCMAKE_RANLIB="$(which "${RANLIB}")"
-        -DCMAKE_INSTALL_PREFIX="/"
-        -DCMAKE_INSTALL_INCLUDEDIR="include"
-        -DCMAKE_INSTALL_OLDINCLUDEDIR="/include"
-        -DCMAKE_SYSTEM_NAME=Generic
-        -DCROSS_TOOLCHAIN_FLAGS_NATIVE="-DCMAKE_TOOLCHAIN_FILE=$native"
-        -DLLVM_BUILD_BENCHMARKS=Off
-        -DLLVM_BUILD_EXAMPLES=Off
-        -DLLVM_BUILD_TESTS=Off
-        -DLLVM_BUILD_UTILS=Off
-        -DLLVM_DEFAULT_TARGET_TRIPLE="$HOST"
-        -DLLVM_ENABLE_LTO=Off
-        -DLLVM_ENABLE_RTTI=On
-        -DLLVM_ENABLE_THREADS=On
-        -DLLVM_INCLUDE_BENCHMARKS=Off
-        -DLLVM_INCLUDE_EXAMPLES=Off
-        -DLLVM_INCLUDE_TESTS=Off
-        -DLLVM_INCLUDE_UTILS=Off
-        -DLLVM_OPTIMIZED_TABLEGEN=On
-        -DLLVM_TARGET_ARCH="$ARCH"
-        -DLLVM_TARGETS_TO_BUILD=X86
-        -DLLVM_TOOL_LLVM_COV_BUILD=Off
-        -DLLVM_TOOL_LLVM_LTO_BUILD=Off
-        -DLLVM_TOOL_LLVM_LTO2_BUILD=Off
-        -DLLVM_TOOL_LLVM_PROFDATA_BUILD=Off
-        -DLLVM_TOOL_LLVM_RTDYLD_BUILD=Off
-        -DLLVM_TOOL_LLVM_XRAY_BUILD=Off
-        -DLLVM_TOOL_LLI_BUILD=Off
-        -DLLVM_TOOL_LTO_BUILD=Off
-        -DLLVM_TOOLS_INSTALL_DIR=bin
-        -DLLVM_UTILS_INSTALL_DIR=bin
-        -DPYTHON_EXECUTABLE="/usr/bin/python2"
-        -DUNIX=1
-        -Wno-dev
-    )
-    set -x
-    cmake "${CMAKE_ARGS[@]}" "$source"
-    "$REDOX_MAKE" -j$(nproc)
-    set +x
-    skip=1
-}
-
-function recipe_test {
-    echo "skipping test"
-    skip=1
-}
-
-function recipe_clean {
-    "$REDOX_MAKE" clean
-    skip=1
-}
-
-function recipe_stage {
-    dest="$(realpath $1)"
-    set -x
-    "$REDOX_MAKE" DESTDIR="$dest" install
-    mv -vT "$dest"/usr/include "$dest/include"
-    mv -vT "$dest"/usr/share "$dest/share"
-    rmdir -v "$dest"/usr
-    find "$dest"/bin -exec "$STRIP" -v {} ';' 2> /dev/null
-    set +x
-    skip=1
-}
diff --git a/recipes/llvm/recipe.toml b/recipes/llvm/recipe.toml
new file mode 100644
index 0000000000000000000000000000000000000000..d7902daaeff237e7072a8f7967d6eec13840d88a
--- /dev/null
+++ b/recipes/llvm/recipe.toml
@@ -0,0 +1,59 @@
+[source]
+git = "https://gitlab.redox-os.org/redox-os/llvm-project.git"
+upstream = "https://github.com/rust-lang/llvm-project.git"
+branch = "redox-2022-03-18"
+
+[build]
+template = "custom"
+dependencies = []
+script = """
+COOKBOOK_CONFIGURE="cmake"
+COOKBOOK_CONFIGURE_FLAGS=(
+    -DCMAKE_AR="$(which "${TARGET}-ar")"
+    -DCMAKE_BUILD_TYPE=Release
+    -DCMAKE_CROSSCOMPILING=True
+    -DCMAKE_CXX_FLAGS="--std=gnu++11"
+    -DCMAKE_EXE_LINKER_FLAGS="-static"
+    -DCMAKE_RANLIB="$(which "${TARGET}-ranlib")"
+    -DCMAKE_INSTALL_PREFIX="/"
+    -DCMAKE_INSTALL_INCLUDEDIR="include"
+    -DCMAKE_INSTALL_OLDINCLUDEDIR="/include"
+    -DCMAKE_SYSTEM_NAME=Generic
+    -DCROSS_TOOLCHAIN_FLAGS_NATIVE="-DCMAKE_TOOLCHAIN_FILE=$(realpath ../native.cmake)"
+    -DLLVM_BUILD_BENCHMARKS=Off
+    -DLLVM_BUILD_EXAMPLES=Off
+    -DLLVM_BUILD_TESTS=Off
+    -DLLVM_BUILD_UTILS=Off
+    -DLLVM_DEFAULT_TARGET_TRIPLE="${TARGET}"
+    -DLLVM_ENABLE_LTO=Off
+    -DLLVM_ENABLE_RTTI=On
+    -DLLVM_ENABLE_THREADS=On
+    -DLLVM_INCLUDE_BENCHMARKS=Off
+    -DLLVM_INCLUDE_EXAMPLES=Off
+    -DLLVM_INCLUDE_TESTS=Off
+    -DLLVM_INCLUDE_UTILS=Off
+    -DLLVM_OPTIMIZED_TABLEGEN=On
+    -DLLVM_TARGET_ARCH="$(echo "${TARGET}" | cut -d - -f1)"
+    -DLLVM_TARGETS_TO_BUILD=X86 # TODO: get from TARGET
+    -DLLVM_TOOL_LLVM_COV_BUILD=Off
+    -DLLVM_TOOL_LLVM_LTO_BUILD=Off
+    -DLLVM_TOOL_LLVM_LTO2_BUILD=Off
+    -DLLVM_TOOL_LLVM_PROFDATA_BUILD=Off
+    -DLLVM_TOOL_LLVM_RTDYLD_BUILD=Off
+    -DLLVM_TOOL_LLVM_XRAY_BUILD=Off
+    -DLLVM_TOOL_LLI_BUILD=Off
+    -DLLVM_TOOL_LTO_BUILD=Off
+    -DLLVM_TOOLS_INSTALL_DIR=bin
+    -DLLVM_UTILS_INSTALL_DIR=bin
+    -DPYTHON_EXECUTABLE="/usr/bin/python2"
+    -DUNIX=1
+    -Wno-dev
+    "${COOKBOOK_SOURCE}/llvm"
+)
+set -x
+cookbook_configure
+mv -vT "${COOKBOOK_STAGE}"/usr/include "${COOKBOOK_STAGE}/include"
+mv -vT "${COOKBOOK_STAGE}"/usr/share "${COOKBOOK_STAGE}/share"
+rmdir -v "${COOKBOOK_STAGE}"/usr
+set +x
+"""
diff --git a/recipes/mesa/recipe.sh b/recipes/mesa/recipe.sh
deleted file mode 100644
index 22a33f8602f152fcf1585ba85f26a71289a42079..0000000000000000000000000000000000000000
--- a/recipes/mesa/recipe.sh
+++ /dev/null
@@ -1,89 +0,0 @@
-GIT=https://gitlab.redox-os.org/redox-os/mesa.git
-GIT_UPSTREAM=https://gitlab.freedesktop.org/mesa/mesa
-BRANCH=redox
-BUILD_DEPENDS=(expat zlib)
-
-function recipe_version {
-    printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
-    skip=1
-}
-
-function recipe_update {
-    echo "skipping update"
-    skip=1
-}
-
-function recipe_build {
-    sysroot="$(realpath ../sysroot)"
-    export CFLAGS="-I$sysroot/include -DHAVE_PTHREAD=1"
-    export CPPFLAGS="-I$sysroot/include -DHAVE_PTHREAD=1"
-    export LDFLAGS="-L$sysroot/lib --static"
-    #export LLVM_CONFIG="x86_64-unknown-redox-llvm-config"
-
-    # TODO: Fix this annoying shite
-    echo "[binaries]" > cross_file.txt
-    echo "c = '${CC}'" >> cross_file.txt
-    echo "cpp = '${CXX}'" >> cross_file.txt
-    echo "ar = '${AR}'" >> cross_file.txt
-    echo "strip = '${STRIP}'" >> cross_file.txt
-    echo "pkgconfig = '${PKG_CONFIG}'" >> cross_file.txt
-    #echo "llvm-config = '${TARGET}-llvm-config'" >> cross_file.txt
-
-    echo "[host_machine]" >> cross_file.txt
-    echo "system = 'redox'" >> cross_file.txt
-    echo "cpu_family = 'x86_64'" >> cross_file.txt
-    echo "cpu = 'x86_64'" >> cross_file.txt
-    echo "endian = 'little'" >> cross_file.txt
-
-    echo "[paths]" >> cross_file.txt
-    echo "prefix = '/'" >> cross_file.txt
-    echo "libdir = 'lib'" >> cross_file.txt
-    echo "bindir = 'bin'" >> cross_file.txt
-
-    unset AR
-    unset AS
-    unset CC
-    unset CXX
-    unset LD
-    unset NM
-    unset OBJCOPY
-    unset OBJDUMP
-    unset PKG_CONFIG
-    unset PKG_CONFIG_PATH
-    unset RANLIB
-    unset READELF
-    unset STRIP
-
-    meson . _build \
-        --cross-file cross_file.txt \
-        --buildtype release \
-        --strip \
-        -Ddefault_library=static \
-        -Dglx=disabled \
-        -Dllvm=disabled \
-        -Dosmesa=gallium \
-        -Dplatforms= \
-        -Dshader-cache=disabled \
-        -Dshared-llvm=disabled \
-        -Dshared-glapi=disabled
-
-    ninja -C _build -v
-    skip=1
-}
-
-function recipe_test {
-    echo "skipping test"
-    skip=1
-}
-
-function recipe_clean {
-    "$REDOX_MAKE" clean
-    skip=1
-}
-
-function recipe_stage {
-    dest="$(realpath $1)"
-    DESTDIR="$dest" ninja -C _build install
-    rm -f "$dest/lib/"*.la
-    skip=1
-}
diff --git a/recipes/mesa/recipe.toml b/recipes/mesa/recipe.toml
new file mode 100644
index 0000000000000000000000000000000000000000..2366d4e3bed2afb3726fd2974fe8dbd737ba320e
--- /dev/null
+++ b/recipes/mesa/recipe.toml
@@ -0,0 +1,57 @@
+#TODO: TEST
+[source]
+git = "https://gitlab.redox-os.org/redox-os/mesa.git"
+upstream = "https://gitlab.freedesktop.org/mesa/mesa"
+branch = "redox"
+
+[build]
+template = "custom"
+dependencies = [
+    "expat",
+    "llvm",
+    "zlib",
+]
+script = """
+export CFLAGS="-I${COOKBOOK_SYSROOT}/include -DHAVE_PTHREAD=1"
+export CPPFLAGS="-I${COOKBOOK_SYSROOT}/include -DHAVE_PTHREAD=1"
+export LDFLAGS="-L${COOKBOOK_SYSROOT}/lib --static"
+export LLVM_CONFIG="${TARGET}-llvm-config"
+
+# TODO: Fix this annoying shite
+echo "[binaries]" > cross_file.txt
+echo "c = '${TARGET}-gcc'" >> cross_file.txt
+echo "cpp = '${TARGET}-g++'" >> cross_file.txt
+echo "ar = '${TARGET}-ar'" >> cross_file.txt
+echo "strip = '${TARGET}-strip'" >> cross_file.txt
+echo "pkgconfig = '${TARGET}-pkg-config'" >> cross_file.txt
+echo "llvm-config = '${TARGET}-llvm-config'" >> cross_file.txt
+
+echo "[host_machine]" >> cross_file.txt
+echo "system = 'redox'" >> cross_file.txt
+echo "cpu_family = 'x86_64'" >> cross_file.txt
+echo "cpu = 'x86_64'" >> cross_file.txt
+echo "endian = 'little'" >> cross_file.txt
+
+echo "[paths]" >> cross_file.txt
+echo "prefix = '/'" >> cross_file.txt
+echo "libdir = 'lib'" >> cross_file.txt
+echo "bindir = 'bin'" >> cross_file.txt
+
+meson "${COOKBOOK_SOURCE}" . \
+    --cross-file cross_file.txt \
+    --buildtype release \
+    --strip \
+    -Ddefault_library=static \
+    -Dglx=disabled \
+    -Dllvm=enabled \
+    -Dosmesa=gallium \
+    -Dplatforms= \
+    -Dshader-cache=disabled \
+    -Dshared-llvm=disabled \
+    -Dshared-glapi=disabled
+ninja -v
+DESTDIR="${COOKBOOK_STAGE}" ninja install
+# Hack to add LLVM libs
+#TODO: only add necessary LLVM libs, not all of them
+sed -i "s/ -lOSMesa / -lOSMesa $("${TARGET}-llvm-config" --libs) /" "${COOKBOOK_STAGE}/lib/pkgconfig/osmesa.pc"
+"""