apk: add package
authorPaul Spooren <mail@aparcar.org>
Mon, 14 Feb 2022 11:21:08 +0000 (12:21 +0100)
committerPaul Spooren <mail@aparcar.org>
Wed, 23 Feb 2022 19:23:55 +0000 (20:23 +0100)
APK (Alpine Package Keeper) is the package manager of Alpine Linux and
has multiple advantages over OPKG, add the manager as an alternative.

Signed-off-by: Paul Spooren <mail@aparcar.org>
package/system/apk/Makefile [new file with mode: 0644]
package/system/apk/patches/0001-change-naming-schema-to-name-_-version-.apk.patch [new file with mode: 0644]
package/system/apk/patches/0002-package-store-scripts-in-tmp.patch [new file with mode: 0644]
package/system/apk/patches/0003-Don-t-create-cache-folder-with-no-cache.patch [new file with mode: 0644]
package/system/apk/patches/0004-openwrt-move-layer-db-to-temp-folder.patch [new file with mode: 0644]

diff --git a/package/system/apk/Makefile b/package/system/apk/Makefile
new file mode 100644 (file)
index 0000000..01573f0
--- /dev/null
@@ -0,0 +1,64 @@
+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))
diff --git a/package/system/apk/patches/0001-change-naming-schema-to-name-_-version-.apk.patch b/package/system/apk/patches/0001-change-naming-schema-to-name-_-version-.apk.patch
new file mode 100644 (file)
index 0000000..e4bfbab
--- /dev/null
@@ -0,0 +1,61 @@
+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
+
diff --git a/package/system/apk/patches/0002-package-store-scripts-in-tmp.patch b/package/system/apk/patches/0002-package-store-scripts-in-tmp.patch
new file mode 100644 (file)
index 0000000..3cbe8e6
--- /dev/null
@@ -0,0 +1,41 @@
+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
+
diff --git a/package/system/apk/patches/0003-Don-t-create-cache-folder-with-no-cache.patch b/package/system/apk/patches/0003-Don-t-create-cache-folder-with-no-cache.patch
new file mode 100644 (file)
index 0000000..99229b7
--- /dev/null
@@ -0,0 +1,49 @@
+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
+
diff --git a/package/system/apk/patches/0004-openwrt-move-layer-db-to-temp-folder.patch b/package/system/apk/patches/0004-openwrt-move-layer-db-to-temp-folder.patch
new file mode 100644 (file)
index 0000000..f13faec
--- /dev/null
@@ -0,0 +1,26 @@
+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
+