From 0318afb304ef2498254e8fa5e4d29cd49321e611 Mon Sep 17 00:00:00 2001 From: Paul Spooren Date: Mon, 14 Feb 2022 12:21:08 +0100 Subject: [PATCH] apk: add package 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 --- package/system/apk/Makefile | 64 +++++++++++++++++++ ...naming-schema-to-name-_-version-.apk.patch | 61 ++++++++++++++++++ .../0002-package-store-scripts-in-tmp.patch | 41 ++++++++++++ ...-t-create-cache-folder-with-no-cache.patch | 49 ++++++++++++++ ...openwrt-move-layer-db-to-temp-folder.patch | 26 ++++++++ 5 files changed, 241 insertions(+) create mode 100644 package/system/apk/Makefile create mode 100644 package/system/apk/patches/0001-change-naming-schema-to-name-_-version-.apk.patch create mode 100644 package/system/apk/patches/0002-package-store-scripts-in-tmp.patch create mode 100644 package/system/apk/patches/0003-Don-t-create-cache-folder-with-no-cache.patch create mode 100644 package/system/apk/patches/0004-openwrt-move-layer-db-to-temp-folder.patch diff --git a/package/system/apk/Makefile b/package/system/apk/Makefile new file mode 100644 index 0000000000..01573f04de --- /dev/null +++ b/package/system/apk/Makefile @@ -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 +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 index 0000000000..e4bfbab2c5 --- /dev/null +++ b/package/system/apk/patches/0001-change-naming-schema-to-name-_-version-.apk.patch @@ -0,0 +1,61 @@ +From df89bd698376adb35fc7e690ba7776e6260f8a5c Mon Sep 17 00:00:00 2001 +From: Paul Spooren +Date: Tue, 1 Feb 2022 09:30:20 +0100 +Subject: [PATCH 1/4] change naming schema to _.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 `_*.apk`. + +Signed-off-by: Paul Spooren +--- + 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 index 0000000000..3cbe8e6a74 --- /dev/null +++ b/package/system/apk/patches/0002-package-store-scripts-in-tmp.patch @@ -0,0 +1,41 @@ +From de53ebc6f81a8080ce9f135f53044dfbc8b5faee Mon Sep 17 00:00:00 2001 +From: Paul Spooren +Date: Thu, 9 Dec 2021 06:14:27 -1000 +Subject: [PATCH 2/4] package: store scripts in tmp + +Signed-off-by: Paul Spooren +--- + 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 index 0000000000..99229b7f76 --- /dev/null +++ b/package/system/apk/patches/0003-Don-t-create-cache-folder-with-no-cache.patch @@ -0,0 +1,49 @@ +From bcec42eb3f69b8c3620276c2646465c13a8eb652 Mon Sep 17 00:00:00 2001 +From: Paul Spooren +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 +--- + 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 index 0000000000..f13faec3ef --- /dev/null +++ b/package/system/apk/patches/0004-openwrt-move-layer-db-to-temp-folder.patch @@ -0,0 +1,26 @@ +From 8eca209869ab0be38f8edd4760fdf6c366499ec1 Mon Sep 17 00:00:00 2001 +From: Paul Spooren +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 +--- + 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 + -- 2.30.2