--- /dev/null
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=apk
+PKG_RELEASE:=$(AUTORELEASE)
+
+PKG_SOURCE_DATE:=20220221
+PKG_SOURCE_VERSION:=fedaa44546af1b8c05131119752cc2f3f682ae7c
+PKG_HASH:=f43cef425a707d3f30ddba5fa008a3cdd466ff5049573208c5c7789c1becf244
+
+PKG_VERSION:=3.0.0_pre0_git$(PKG_SOURCE_DATE)
+PKG_SOURCE:=apk-tools-v$(PKG_SOURCE_VERSION).tar.gz
+PKG_SOURCE_URL:=https://gitlab.alpinelinux.org/alpine/apk-tools/-/archive/$(PKG_SOURCE_VERSION)
+PKG_BUILD_DIR:=$(BUILD_DIR)/apk-tools-$(PKG_SOURCE_VERSION)
+HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/apk-tools-$(PKG_SOURCE_VERSION)
+
+PKG_MAINTAINER:=Paul Spooren <mail@aparcar.org>
+PKG_LICENSE:=GPL-2.0-only
+PKG_LICENSE_FILES:=LICENSE
+PKG_INSTALL:=1
+
+HOST_BUILD_PREFIX:=$(STAGING_DIR_HOST)
+HOST_BUILD_DEPENDS:=lua/host
+PKG_BUILD_DEPENDS:=$(HOST_BUILD_DEPENDS)
+
+include $(INCLUDE_DIR)/package.mk
+include $(INCLUDE_DIR)/host-build.mk
+include $(INCLUDE_DIR)/meson.mk
+
+define Package/apk
+ SECTION:=base
+ CATEGORY:=Base system
+ TITLE:=apk package manager
+ DEPENDS:=+zlib +libopenssl +libpthread @!arc
+ URL:=$(PKG_SOURCE_URL)
+endef
+
+MESON_HOST_ARGS += \
+ -Dlua_version=5.1 \
+ -Dcompressed-help=false \
+ -Ddocs=disabled
+MESON_ARGS += \
+ -Dlua_version=5.1 \
+ -Dcompressed-help=false \
+ -Ddocs=disabled
+
+HOST_LDFLAGS += \
+ -Wl,-rpath $(STAGING_DIR_HOST)/lib \
+ -lpthread
+
+TARGET_CFLAGS += $(FPIC)
+HOST_CFLAGS += $(HOST_FPIC)
+
+define Package/apk/install
+ $(INSTALL_DIR) $(1)/lib/apk/db
+
+ $(INSTALL_DIR) $(1)/usr/bin
+ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/apk $(1)/usr/bin/apk
+
+ $(INSTALL_DIR) $(1)/usr/lib
+ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libapk.so.* $(1)/usr/lib/
+endef
+
+$(eval $(call BuildPackage,apk))
+$(eval $(call HostBuild))
--- /dev/null
+From df89bd698376adb35fc7e690ba7776e6260f8a5c Mon Sep 17 00:00:00 2001
+From: Paul Spooren <mail@aparcar.org>
+Date: Tue, 1 Feb 2022 09:30:20 +0100
+Subject: [PATCH 1/4] change naming schema to <name>_<version>.apk
+
+OpenWrt allows dashes in package names but no underlines. The current
+cleanup mechanism in the build system uses those underlines to find
+suiting packages to cleanup via `<pkgname>_*.apk`.
+
+Signed-off-by: Paul Spooren <mail@aparcar.org>
+---
+ src/apk_package.h | 2 +-
+ src/app_mkpkg.c | 2 +-
+ src/database.c | 4 ++--
+ 3 files changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/src/apk_package.h b/src/apk_package.h
+index 8d9cba4..eb97095 100644
+--- a/src/apk_package.h
++++ b/src/apk_package.h
+@@ -102,7 +102,7 @@ APK_ARRAY(apk_package_array, struct apk_package *);
+ #define APK_PROVIDER_FROM_PACKAGE(pkg) (struct apk_provider){(pkg),(pkg)->version}
+ #define APK_PROVIDER_FROM_PROVIDES(pkg,p) (struct apk_provider){(pkg),(p)->version}
+
+-#define PKG_VER_FMT "%s-" BLOB_FMT
++#define PKG_VER_FMT "%s_" BLOB_FMT
+ #define PKG_VER_PRINTF(pkg) pkg->name->name, BLOB_PRINTF(*pkg->version)
+ #define PKG_FILE_FMT PKG_VER_FMT ".apk"
+ #define PKG_FILE_PRINTF(pkg) PKG_VER_PRINTF(pkg)
+diff --git a/src/app_mkpkg.c b/src/app_mkpkg.c
+index afbc150..731acd5 100644
+--- a/src/app_mkpkg.c
++++ b/src/app_mkpkg.c
+@@ -213,7 +213,7 @@ static char *pkgi_filename(struct adb_obj *pkgi, char *buf, size_t n)
+ {
+ apk_blob_t to = APK_BLOB_PTR_LEN(buf, n);
+ apk_blob_push_blob(&to, adb_ro_blob(pkgi, ADBI_PI_NAME));
+- apk_blob_push_blob(&to, APK_BLOB_STR("-"));
++ apk_blob_push_blob(&to, APK_BLOB_STR("_"));
+ apk_blob_push_blob(&to, adb_ro_blob(pkgi, ADBI_PI_VERSION));
+ apk_blob_push_blob(&to, APK_BLOB_STR(".apk"));
+ apk_blob_push_blob(&to, APK_BLOB_PTR_LEN("", 1));
+diff --git a/src/database.c b/src/database.c
+index 1e674d7..5198bad 100644
+--- a/src/database.c
++++ b/src/database.c
+@@ -561,9 +561,9 @@ struct apk_package *apk_db_pkg_add(struct apk_database *db, struct apk_package *
+
+ static int apk_pkg_format_cache_pkg(apk_blob_t to, struct apk_package *pkg)
+ {
+- /* pkgname-1.0_alpha1.12345678.apk */
++ /* pkgname_1.0_alpha1.12345678.apk */
+ apk_blob_push_blob(&to, APK_BLOB_STR(pkg->name->name));
+- apk_blob_push_blob(&to, APK_BLOB_STR("-"));
++ apk_blob_push_blob(&to, APK_BLOB_STR("_"));
+ apk_blob_push_blob(&to, *pkg->version);
+ apk_blob_push_blob(&to, APK_BLOB_STR("."));
+ apk_blob_push_hexdump(&to, APK_BLOB_PTR_LEN((char *) pkg->csum.data,
+--
+2.35.1
+
--- /dev/null
+From de53ebc6f81a8080ce9f135f53044dfbc8b5faee Mon Sep 17 00:00:00 2001
+From: Paul Spooren <mail@aparcar.org>
+Date: Thu, 9 Dec 2021 06:14:27 -1000
+Subject: [PATCH 2/4] package: store scripts in tmp
+
+Signed-off-by: Paul Spooren <mail@aparcar.org>
+---
+ src/package.c | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+diff --git a/src/package.c b/src/package.c
+index 5aee917..2a4d80e 100644
+--- a/src/package.c
++++ b/src/package.c
+@@ -799,7 +799,7 @@ void apk_ipkg_run_script(struct apk_installed_package *ipkg,
+ argv[0] = (char *) apk_script_types[type];
+
+ /* Avoid /tmp as it can be mounted noexec */
+- snprintf(fn, sizeof(fn), "var/cache/misc/" PKG_VER_FMT ".%s",
++ snprintf(fn, sizeof(fn), "tmp/cache/misc/" PKG_VER_FMT ".%s",
+ PKG_VER_PRINTF(pkg),
+ apk_script_types[type]);
+
+@@ -811,10 +811,10 @@ void apk_ipkg_run_script(struct apk_installed_package *ipkg,
+ if (faccessat(db->root_fd, "tmp", F_OK, 0) != 0)
+ mkdirat(db->root_fd, "tmp", 01777);
+ make_device_tree(db);
+- if (faccessat(db->root_fd, "var/cache/misc", F_OK, 0) != 0) {
+- mkdirat(root_fd, "var", 0755);
+- mkdirat(root_fd, "var/cache", 0755);
+- mkdirat(root_fd, "var/cache/misc", 0755);
++ if (faccessat(db->root_fd, "tmp/cache/misc", F_OK, 0) != 0) {
++ mkdirat(root_fd, "tmp", 0755);
++ mkdirat(root_fd, "tmp/cache", 0755);
++ mkdirat(root_fd, "tmp/cache/misc", 0755);
+ }
+ }
+
+--
+2.35.1
+
--- /dev/null
+From bcec42eb3f69b8c3620276c2646465c13a8eb652 Mon Sep 17 00:00:00 2001
+From: Paul Spooren <mail@aparcar.org>
+Date: Sun, 13 Feb 2022 18:56:28 +0100
+Subject: [PATCH 3/4] Don't create cache folder with --no-cache
+
+Prevent the --initdb command to create cache folder if it's explicitly
+disabled. This is relevant since other tooling may provide the /var
+folder, specifically in OpenWrt it's a symlink to /tmp/
+
+Signed-off-by: Paul Spooren <mail@aparcar.org>
+---
+ src/database.c | 14 +++++++++-----
+ 1 file changed, 9 insertions(+), 5 deletions(-)
+
+diff --git a/src/database.c b/src/database.c
+index 5198bad..6bd80f5 100644
+--- a/src/database.c
++++ b/src/database.c
+@@ -1720,9 +1720,11 @@ int apk_db_open(struct apk_database *db, struct apk_ctx *ac)
+ add_protected_paths_from_file, db);
+
+ /* figure out where to have the cache */
+- if ((r = setup_cache(db, ac)) < 0) {
+- apk_err(out, "Unable to remount cache read/write");
+- goto ret_r;
++ if (!(db->ctx->flags & APK_NO_CACHE)) {
++ if ( (r = setup_cache(db, ac)) < 0) {
++ apk_err(out, "Unable to remount cache read/write");
++ goto ret_r;
++ }
+ }
+
+ if (db->ctx->flags & APK_OVERLAY_FROM_STDIN) {
+@@ -1896,8 +1898,10 @@ int apk_db_write_config(struct apk_database *db)
+ r = apk_db_write_layers(db);
+ if (!rr ) rr = r;
+
+- r = apk_db_index_write_nr_cache(db);
+- if (r < 0 && !rr) rr = r;
++ if (!(db->ctx->flags & APK_NO_CACHE)) {
++ r = apk_db_index_write_nr_cache(db);
++ if (r < 0 && !rr) rr = r;
++ }
+
+ if (rr) {
+ apk_err(out, "System state may be inconsistent: failed to write database: %s",
+--
+2.35.1
+
--- /dev/null
+From 8eca209869ab0be38f8edd4760fdf6c366499ec1 Mon Sep 17 00:00:00 2001
+From: Paul Spooren <mail@aparcar.org>
+Date: Sat, 19 Feb 2022 17:20:37 +0100
+Subject: [PATCH 4/4] openwrt: move layer db to temp folder
+
+Signed-off-by: Paul Spooren <mail@aparcar.org>
+---
+ src/database.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/database.c b/src/database.c
+index 6bd80f5..cd8aeb7 100644
+--- a/src/database.c
++++ b/src/database.c
+@@ -1618,7 +1618,7 @@ const char *apk_db_layer_name(int layer)
+ {
+ switch (layer) {
+ case APK_DB_LAYER_ROOT: return "lib/apk/db";
+- case APK_DB_LAYER_UVOL: return "lib/apk/db-uvol";
++ case APK_DB_LAYER_UVOL: return "tmp/run/uvol/.meta/apk";
+ default:
+ assert("invalid layer");
+ return 0;
+--
+2.35.1
+