apk: add package
authorPaul Spooren <mail@aparcar.org>
Mon, 14 Feb 2022 11:21:08 +0000 (12:21 +0100)
committerPaul Spooren <mail@aparcar.org>
Mon, 6 Feb 2023 20:57:03 +0000 (21:57 +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>
23 files changed:
.gitignore
README.md
include/feeds.mk
include/image.mk
include/kernel.mk
include/package-ipkg.mk
include/rootfs.mk
include/target.mk
package/Makefile
package/base-files/Makefile
package/base-files/files/lib/functions.sh
package/kernel/linux/Makefile
package/libs/toolchain/Makefile
package/network/services/hostapd/Makefile
package/system/apk/Makefile [new file with mode: 0644]
package/system/apk/patches/0001-openwrt-move-layer-db-to-temp-folder.patch [new file with mode: 0644]
package/system/apk/patches/0002-change-naming-to-name-_-version-_-arch-.apk.patch [new file with mode: 0644]
package/system/apk/patches/0003-WIP-use-opkg-version-compare-algorithm.patch [new file with mode: 0644]
package/system/fstools/files/snapshot
rules.mk
scripts/feeds
target/imagebuilder/Makefile
target/imagebuilder/files/Makefile

index a80cdbbea31029b612af83b0b5c75426caf4dab7..76b42e5015a4cd9572c3a487bb852d4639b7571b 100644 (file)
@@ -20,6 +20,8 @@
 /*.patch
 /llvm-bpf*
 key-build*
+private-key.pem
+public-key.pem
 *.orig
 *.rej
 *~
index 29ff89f90c214396c8edc15413098ac5eb7bae2f..6172e68710ec9fd3990d38adc96eef9611241de0 100644 (file)
--- a/README.md
+++ b/README.md
@@ -66,7 +66,7 @@ make4.1+ perl python3.6+ rsync subversion unzip which
 
 The main repository uses multiple sub-repositories to manage packages of
 different categories. All packages are installed via the OpenWrt package
-manager called `opkg`. If you're looking to develop the web interface or port
+manager called `apk`. If you're looking to develop the web interface or port
 packages to OpenWrt, please find the fitting repository below.
 
 * [LuCI Web Interface](https://github.com/openwrt/luci): Modern and modular
index 632fecb4a3aaece1cada2b8d2ae089c85dc2d1a6..a27aa709c4167f8078b6eaac3c367143f4226161 100644 (file)
@@ -14,9 +14,9 @@ ifneq ($(CONFIG_PER_FEED_REPO),)
   PACKAGE_SUBDIRS += $(foreach FEED,$(FEEDS_AVAILABLE),$(OUTPUT_DIR)/packages/$(ARCH_PACKAGES)/$(FEED))
 endif
 
-opkg_package_files = $(wildcard \
+apk_package_files = $(wildcard \
        $(foreach dir,$(PACKAGE_SUBDIRS), \
-         $(foreach pkg,$(1), $(dir)/$(pkg)_*.ipk)))
+         $(foreach pkg,$(1), $(dir)/$(pkg)_*.apk)))
 
 # 1: package name
 define FeedPackageDir
@@ -30,14 +30,14 @@ endef
 # 1: destination file
 define FeedSourcesAppend
 ( \
-  echo 'src/gz %d_core %U/targets/%S/packages'; \
+  echo '%U/targets/%S/packages/packages.adb'; \
   $(strip $(if $(CONFIG_PER_FEED_REPO), \
-       echo 'src/gz %d_base %U/packages/%A/base'; \
+       echo '%U/packages/%A/base/packages.adb'; \
        $(if $(filter %SNAPSHOT-y,$(VERSION_NUMBER)-$(CONFIG_BUILDBOT)), \
-               echo 'src/gz %d_kmods %U/targets/%S/kmods/$(LINUX_VERSION)-$(LINUX_RELEASE)-$(LINUX_VERMAGIC)';) \
+               echo '%U/targets/%S/kmods/$(LINUX_VERSION)-$(LINUX_RELEASE)-$(LINUX_VERMAGIC)/packages.adb';) \
        $(foreach feed,$(FEEDS_AVAILABLE), \
                $(if $(CONFIG_FEED_$(feed)), \
-                       echo '$(if $(filter m,$(CONFIG_FEED_$(feed))),# )src/gz %d_$(feed) %U/packages/%A/$(feed)';)))) \
+                       echo '$(if $(filter m,$(CONFIG_FEED_$(feed))),# )%U/packages/%A/$(feed)/packages.adb';)))) \
 ) >> $(1)
 endef
 
index b801ef993c310c1acafb4b635211e585dddeb588..3f42ed4369bff83ee14f73a0e0905adfe9595e76 100644 (file)
@@ -264,7 +264,7 @@ define Image/mkfs/ext4
 endef
 
 define Image/Manifest
-       $(call opkg,$(TARGET_DIR_ORIG)) list-installed > \
+       $(call apk,$(TARGET_DIR_ORIG)) list --quiet --manifest | sort > \
                $(BIN_DIR)/$(IMG_PREFIX)$(if $(PROFILE_SANITIZED),-$(PROFILE_SANITIZED)).manifest
 endef
 
@@ -304,25 +304,19 @@ mkfs_packages_add = $(foreach pkg,$(filter-out -%,$(mkfs_packages)),$(pkg)$(call
 mkfs_packages_remove = $(foreach pkg,$(patsubst -%,%,$(filter -%,$(mkfs_packages))),$(pkg)$(call GetABISuffix,$(pkg)))
 mkfs_cur_target_dir = $(call mkfs_target_dir,pkg=$(target_params))
 
-opkg_target = \
-       $(call opkg,$(mkfs_cur_target_dir)) \
-               -f $(mkfs_cur_target_dir).conf
+apk_target = $(call apk,$(mkfs_cur_target_dir))
 
 target-dir-%: FORCE
-       rm -rf $(mkfs_cur_target_dir) $(mkfs_cur_target_dir).opkg
+       rm -rf $(mkfs_cur_target_dir) $(mkfs_cur_target_dir).apk
        $(CP) $(TARGET_DIR_ORIG) $(mkfs_cur_target_dir)
-       -mv $(mkfs_cur_target_dir)/etc/opkg $(mkfs_cur_target_dir).opkg
-       echo 'src default file://$(PACKAGE_DIR_ALL)' > $(mkfs_cur_target_dir).conf
+       mv $(mkfs_cur_target_dir)/etc/apk/repositories $(mkfs_cur_target_dir).repositories
        $(if $(mkfs_packages_remove), \
-               -$(call opkg,$(mkfs_cur_target_dir)) remove \
-                       $(mkfs_packages_remove))
-       $(if $(call opkg_package_files,$(mkfs_packages_add)), \
-               $(opkg_target) update && \
-               $(opkg_target) install \
-                       $(call opkg_package_files,$(mkfs_packages_add)))
-       -$(CP) -T $(mkfs_cur_target_dir).opkg/ $(mkfs_cur_target_dir)/etc/opkg/
-       rm -rf $(mkfs_cur_target_dir).opkg $(mkfs_cur_target_dir).conf
+               $(apk_target) del $(mkfs_packages_remove))
+       $(if $(mkfs_packages_add), \
+               $(apk_target) add $(mkfs_packages_add))
+       mv $(mkfs_cur_target_dir).repositories $(mkfs_cur_target_dir)/etc/apk/repositories
        $(call prepare_rootfs,$(mkfs_cur_target_dir),$(TOPDIR)/files)
+       $(apk_target) list --quiet --manifest | sort > $(mkfs_cur_target_dir).manifest
 
 $(KDIR)/root.%: kernel_prepare
        $(call Image/mkfs/$(word 1,$(target_params)),$(target_params))
index c657bf5d82e7f02ad07bb5f3faa820f8dae90909..b042eb94dc0418e7a22f54a3ffb3311ba209ffbc 100644 (file)
@@ -205,8 +205,8 @@ define KernelPackage
     SECTION:=kernel
     CATEGORY:=Kernel modules
     DESCRIPTION:=$(DESCRIPTION)
-    EXTRA_DEPENDS:=kernel (=$(LINUX_VERSION)-$(LINUX_RELEASE)-$(LINUX_VERMAGIC))
-    VERSION:=$(LINUX_VERSION)$(if $(PKG_VERSION),+$(PKG_VERSION))-$(if $(PKG_RELEASE),$(PKG_RELEASE),$(LINUX_RELEASE))
+    EXTRA_DEPENDS:=kernel-$(LINUX_VERSION)-$(LINUX_RELEASE)-$(LINUX_VERMAGIC)
+    VERSION:=$(LINUX_VERSION)$(if $(PKG_VERSION),+$(PKG_VERSION))-$(if $(PKG_RELEASE),r$(PKG_RELEASE),r$(LINUX_RELEASE))
     PKGFLAGS:=$(PKGFLAGS)
     $(call KernelPackage/$(1))
     $(call KernelPackage/$(1)/$(BOARD))
@@ -263,7 +263,7 @@ $(call KernelPackage/$(1)/config)
   endif
   $$(eval $$(call BuildPackage,kmod-$(1)))
 
-  $$(IPKG_kmod-$(1)): $$(wildcard $$(call version_filter,$$(FILES)))
+  $$(APK_kmod-$(1)): $$(wildcard $$(call version_filter,$$(FILES)))
 
 endef
 
index 3063a86a28c19516bd23654a9798be3519b45d0f..385dcd5bc29c3d75fa433354cccfeb338453fdca 100644 (file)
@@ -1,16 +1,11 @@
 # SPDX-License-Identifier: GPL-2.0-only
 #
-# Copyright (C) 2006-2020 OpenWrt.org
+# Copyright (C) 2006-2022 OpenWrt.org
 
 ifndef DUMP
   include $(INCLUDE_DIR)/feeds.mk
 endif
 
-IPKG_REMOVE:= \
-  $(SCRIPT_DIR)/ipkg-remove
-
-IPKG_STATE_DIR:=$(TARGET_DIR)/usr/lib/opkg
-
 # Generates a make statement to return a wildcard for candidate ipkg files
 # 1: package name
 define gen_ipkg_wildcard
@@ -20,7 +15,9 @@ endef
 # 1: package name
 # 2: candidate ipk files
 define remove_ipkg_files
-  $(if $(strip $(2)),$(IPKG_REMOVE) $(1) $(2))
+for pkg in $(2); do \
+  $(STAGING_DIR_HOST)/bin/apk adbdump "$$pkg" | grep "^  name: $(1)" && rm "$$pkg" || true; \
+done
 endef
 
 # 1: package name
@@ -29,7 +26,7 @@ endef
 # 4: file is a script
 define BuildIPKGVariable
 ifdef Package/$(1)/$(2)
-  $$(IPKG_$(1)) : VAR_$(2)$(3)=$$(Package/$(1)/$(2))
+  $$(APK_$(1)) : VAR_$(2)$(3)=$$(Package/$(1)/$(2))
   $(call shexport,Package/$(1)/$(2))
   $(1)_COMMANDS += echo "$$$$$$$$$(call shvar,Package/$(1)/$(2))" > $(2)$(3); $(if $(4),chmod 0755 $(2)$(3);)
 endif
@@ -50,7 +47,7 @@ strip_deps=$(strip $(subst +,,$(filter-out @%,$(1))))
 filter_deps=$(foreach dep,$(call strip_deps,$(1)),$(if $(findstring :,$(dep)),$(call dep_if,$(dep)),$(dep)))
 
 define AddDependency
-  $$(if $(1),$$(if $(2),$$(foreach pkg,$(1),$$(IPKG_$$(pkg))): $$(foreach pkg,$(2),$$(IPKG_$$(pkg)))))
+  $$(if $(1),$$(if $(2),$$(foreach pkg,$(1),$$(APK_$$(pkg))): $$(foreach pkg,$(2),$$(APK_$$(pkg)))))
 endef
 
 define FixupReverseDependencies
@@ -101,8 +98,9 @@ ifeq ($(DUMP),)
   define BuildTarget/ipkg
     ABIV_$(1):=$(call FormatABISuffix,$(1),$(ABI_VERSION))
     PDIR_$(1):=$(call FeedPackageDir,$(1))
-    IPKG_$(1):=$$(PDIR_$(1))/$(1)$$(ABIV_$(1))_$(VERSION)_$(PKGARCH).ipk
+    APK_$(1):=$$(PDIR_$(1))/$(1)$$(ABIV_$(1))_$(VERSION)_$(PKGARCH).apk
     IDIR_$(1):=$(PKG_BUILD_DIR)/ipkg-$(PKGARCH)/$(1)
+    ADIR_$(1):=$(PKG_BUILD_DIR)/apk-$(PKGARCH)/$(1)
     KEEP_$(1):=$(strip $(call Package/$(1)/conffiles))
 
     TARGET_VARIANT:=$$(if $(ALL_VARIANTS),$$(if $$(VARIANT),$$(filter-out *,$$(VARIANT)),$(firstword $(ALL_VARIANTS))))
@@ -117,8 +115,8 @@ ifeq ($(DUMP),)
     ifdef do_install
       ifneq ($(CONFIG_PACKAGE_$(1))$(DEVELOPER),)
         IPKGS += $(1)
-        $(_pkg_target)compile: $$(IPKG_$(1)) $(PKG_INFO_DIR)/$(1).provides $(PKG_BUILD_DIR)/.pkgdir/$(1).installed
-        prepare-package-install: $$(IPKG_$(1))
+        $(_pkg_target)compile: $$(APK_$(1)) $(PKG_INFO_DIR)/$(1).provides $(PKG_BUILD_DIR)/.pkgdir/$(1).installed
+        prepare-package-install: $$(APK_$(1))
         compile: $(STAGING_DIR_ROOT)/stamp/.$(1)_installed
       else
         $(if $(CONFIG_PACKAGE_$(1)),$$(info WARNING: skipping $(1) -- package not selected))
@@ -194,14 +192,14 @@ $$(call addfield,Depends,$$(Package/$(1)/DEPENDS)
 Installed-Size: 0
 $(_endef)
 
-    $$(IPKG_$(1)) : export CONTROL=$$(Package/$(1)/CONTROL)
-    $$(IPKG_$(1)) : export DESCRIPTION=$$(Package/$(1)/description)
-    $$(IPKG_$(1)) : export PATH=$$(TARGET_PATH_PKG)
-    $$(IPKG_$(1)) : export PKG_SOURCE_DATE_EPOCH:=$(PKG_SOURCE_DATE_EPOCH)
-    $(PKG_INFO_DIR)/$(1).provides $$(IPKG_$(1)): $(STAMP_BUILT) $(INCLUDE_DIR)/package-ipkg.mk
-       @rm -rf $$(IDIR_$(1)); \
-               $$(call remove_ipkg_files,$(1),$$(call opkg_package_files,$(call gen_ipkg_wildcard,$(1))))
-       mkdir -p $(PACKAGE_DIR) $$(IDIR_$(1))/CONTROL $(PKG_INFO_DIR)
+    $$(APK_$(1)) : export CONTROL=$$(Package/$(1)/CONTROL)
+    $$(APK_$(1)) : export DESCRIPTION=$$(Package/$(1)/description)
+    $$(APK_$(1)) : export PATH=$$(TARGET_PATH_PKG)
+    $$(APK_$(1)) : export PKG_SOURCE_DATE_EPOCH:=$(PKG_SOURCE_DATE_EPOCH)
+    $(PKG_INFO_DIR)/$(1).provides $$(APK_$(1)): $(STAMP_BUILT) $(INCLUDE_DIR)/package-ipkg.mk
+       rm -rf $$(IDIR_$(1)); \
+               $$(call remove_ipkg_files,$(1),$$(call apk_package_files,$(call gen_ipkg_wildcard,$(1))))
+       mkdir -p $(PACKAGE_DIR) $$(IDIR_$(1)) $(PKG_INFO_DIR)
        $(call Package/$(1)/install,$$(IDIR_$(1)))
        $(if $(Package/$(1)/install-overlay),mkdir -p $(PACKAGE_DIR) $$(IDIR_$(1))/rootfs-overlay)
        $(call Package/$(1)/install-overlay,$$(IDIR_$(1))/rootfs-overlay)
@@ -227,28 +225,6 @@ $(_endef)
                ) || true \
        )
     endif
-       (cd $$(IDIR_$(1))/CONTROL; \
-               ( \
-                       echo "$$$$CONTROL"; \
-                       printf "Description: "; echo "$$$$DESCRIPTION" | sed -e 's,^[[:space:]]*, ,g'; \
-               ) > control; \
-               chmod 644 control; \
-               ( \
-                       echo "#!/bin/sh"; \
-                       echo "[ \"\$$$${IPKG_NO_SCRIPT}\" = \"1\" ] && exit 0"; \
-                       echo "[ -s "\$$$${IPKG_INSTROOT}/lib/functions.sh" ] || exit 0"; \
-                       echo ". \$$$${IPKG_INSTROOT}/lib/functions.sh"; \
-                       echo "default_postinst \$$$$0 \$$$$@"; \
-               ) > postinst; \
-               ( \
-                       echo "#!/bin/sh"; \
-                       echo "[ -s "\$$$${IPKG_INSTROOT}/lib/functions.sh" ] || exit 0"; \
-                       echo ". \$$$${IPKG_INSTROOT}/lib/functions.sh"; \
-                       echo "default_prerm \$$$$0 \$$$$@"; \
-               ) > prerm; \
-               chmod 0755 postinst prerm; \
-               $($(1)_COMMANDS) \
-       )
 
     ifneq ($$(KEEP_$(1)),)
                @( \
@@ -263,12 +239,59 @@ $(_endef)
                )
     endif
 
-       $(INSTALL_DIR) $$(PDIR_$(1))
-       $(FAKEROOT) $(STAGING_DIR_HOST)/bin/bash $(SCRIPT_DIR)/ipkg-build -m "$(FILE_MODES)" $$(IDIR_$(1)) $$(PDIR_$(1))
-       @[ -f $$(IPKG_$(1)) ]
+       $(INSTALL_DIR) $$(PDIR_$(1))/tmp
+       mkdir -p $$(ADIR_$(1))/
+       mkdir -p $$(IDIR_$(1))/lib/apk/packages/
+
+       (cd $$(ADIR_$(1)); $($(1)_COMMANDS))
+
+       ( \
+               echo "#!/bin/sh"; \
+               echo "[ \"\$$$${IPKG_NO_SCRIPT}\" = \"1\" ] && exit 0"; \
+               echo "[ -s "\$$$${IPKG_INSTROOT}/lib/functions.sh" ] || exit 0"; \
+               echo ". \$$$${IPKG_INSTROOT}/lib/functions.sh"; \
+               echo 'export root="$$$${IPKG_INSTROOT}"'; \
+               echo 'export pkgname="$(1)"'; \
+               echo "add_group_and_user"; \
+               [ ! -f $$(ADIR_$(1))/postinst-pkg ] || cat "$$(ADIR_$(1))/postinst-pkg"; \
+               echo "default_postinst"; \
+       ) > $$(ADIR_$(1))/post-install;
+
+       ( \
+               echo "#!/bin/sh"; \
+               echo "[ -s "\$$$${IPKG_INSTROOT}/lib/functions.sh" ] || exit 0"; \
+               echo ". \$$$${IPKG_INSTROOT}/lib/functions.sh"; \
+               echo 'export root="$$$${IPKG_INSTROOT}"'; \
+               echo 'export pkgname="$(1)"'; \
+               [ ! -f $$(ADIR_$(1))/prerm-pkg ] || cat "$$(ADIR_$(1))/prerm-pkg"; \
+               echo "default_prerm"; \
+       ) > $$(ADIR_$(1))/pre-deinstall;
+
+       if [ -n "$(USERID)" ]; then echo $(USERID) > $$(IDIR_$(1))/lib/apk/packages/$(1).rusers; fi;
+       if [ -n "$(ALTERNATIVES)" ]; then echo $(ALTERNATIVES) > $$(IDIR_$(1))/lib/apk/packages/$(1).alternatives; fi;
+       (cd $$(IDIR_$(1)) && find . -type f,l -printf "/%P\n" > $$(IDIR_$(1))/lib/apk/packages/$(1).list)
+       if [ -f $$(ADIR_$(1))/conffiles ]; then mv $$(ADIR_$(1))/conffiles $$(IDIR_$(1))/lib/apk/packages/$(1).conffiles; fi;
+
+       $(FAKEROOT) $(STAGING_DIR_HOST)/bin/apk mkpkg \
+         --info "name:$(1)$$(ABIV_$(1))" \
+         --info "version:$(VERSION)" \
+         --info "description:" \
+         --info "arch:$(PKGARCH)" \
+         --info "license:$(LICENSE)" \
+         --info "origin:$(SOURCE)" \
+         --info "provides:$$(foreach prov,$$(filter-out $(1)$$(ABIV_$(1)),$(PROVIDES)$$(if $$(ABIV_$(1)), \
+               $(1) $(foreach provide,$(PROVIDES),$(provide)$$(ABIV_$(1))))),$$(prov)=0 )" \
+         --script "post-install:$$(ADIR_$(1))/post-install" \
+         --script "pre-deinstall:$$(ADIR_$(1))/pre-deinstall" \
+         --info "depends:$$(subst $$(comma),,$$(Package/$(1)/DEPENDS))" \
+         --files "$$(IDIR_$(1))" \
+         --output "$$(APK_$(1))" \
+         --sign "$(BUILD_KEY_APK_SEC)"
+
+       @[ -f $$(APK_$(1)) ]
 
     $(1)-clean:
-       $$(call remove_ipkg_files,$(1),$$(call opkg_package_files,$(call gen_ipkg_wildcard,$(1))))
+       $$(call remove_ipkg_files,$(1),$$(call apk_package_files,$(call gen_ipkg_wildcard,$(1))))
 
     clean: $(1)-clean
 
index f2ed648d2f3eb51a31115d4d3d22dc4982959d97..cae2bfe2ba07a73683050e3c72ae07a21d23db37 100644 (file)
@@ -31,17 +31,16 @@ ifdef CONFIG_USE_MKLIBS
   endef
 endif
 
-# where to build (and put) .ipk packages
-opkg = \
-  IPKG_NO_SCRIPT=1 \
+apk = \
   IPKG_INSTROOT=$(1) \
-  TMPDIR=$(1)/tmp \
-  $(STAGING_DIR_HOST)/bin/opkg \
-       --offline-root $(1) \
-       --force-postinstall \
-       --add-dest root:/ \
-       --add-arch all:100 \
-       --add-arch $(if $(ARCH_PACKAGES),$(ARCH_PACKAGES),$(BOARD)):200
+  $(FAKEROOT) $(STAGING_DIR_HOST)/bin/apk \
+       --root $(1) \
+       --keys-dir $(TOPDIR) \
+       --no-cache \
+       --no-logfile \
+       --no-scripts \
+       --preserve-env \
+       --repository file://$(PACKAGE_DIR_ALL)/packages.adb
 
 TARGET_DIR_ORIG := $(TARGET_ROOTFS_DIR)/root.orig-$(BOARD)
 
@@ -68,14 +67,9 @@ define prepare_rootfs
        @mkdir -p $(1)/var/lock
        @( \
                cd $(1); \
-               for script in ./usr/lib/opkg/info/*.postinst; do \
-                       IPKG_INSTROOT=$(1) $$(command -v bash) $$script; \
-                       ret=$$?; \
-                       if [ $$ret -ne 0 ]; then \
-                               echo "postinst script $$script has failed with exit code $$ret" >&2; \
-                               exit 1; \
-                       fi; \
-               done; \
+               $(STAGING_DIR_HOST)/bin/tar -xf ./lib/apk/db/scripts.tar --wildcards "*.post-install" -O > script.sh; \
+               chmod +x script.sh; \
+               IPKG_INSTROOT=$(1) $$(command -v bash) script.sh; \
                for script in ./etc/init.d/*; do \
                        grep '#!/bin/sh /etc/rc.common' $$script >/dev/null || continue; \
                        if ! echo " $(3) " | grep -q " $$(basename $$script) "; then \
@@ -87,13 +81,11 @@ define prepare_rootfs
                        fi; \
                done || true \
        )
-       $(if $(SOURCE_DATE_EPOCH),sed -i "s/Installed-Time: .*/Installed-Time: $(SOURCE_DATE_EPOCH)/" $(1)/usr/lib/opkg/status)
        @-find $(1) -name CVS -o -name .svn -o -name .git -o -name '.#*' | $(XARGS) rm -rf
+       @-find $(1)/usr/cache/apk/ -name '*.apk' -delete
        rm -rf \
                $(1)/boot \
                $(1)/tmp/* \
-               $(1)/usr/lib/opkg/info/*.postinst* \
-               $(1)/usr/lib/opkg/lists/* \
                $(1)/var/lock/*.lock
        $(call clean_ipkg,$(1))
        $(call mklibs,$(1))
index 992f95534442c58d1a6de5dfe22a7271a2c5283f..9536ed09c4a5a8d2bc52fd50ab2ae776a91bb895 100644 (file)
@@ -12,6 +12,7 @@ DEVICE_TYPE?=router
 # Default packages - the really basic set
 DEFAULT_PACKAGES:=\
        base-files \
+       apk \
        ca-bundle \
        dropbear \
        fstools \
@@ -21,7 +22,6 @@ DEFAULT_PACKAGES:=\
        logd \
        mtd \
        netifd \
-       opkg \
        uci \
        uclient-fetch \
        urandom-seed \
index 209be34674747a728606f0c8b2d7dbcd2930ba7b..04945f731aeca753c566c5940acd1fe04cfab5cd 100644 (file)
@@ -53,29 +53,30 @@ $(curdir)/cleanup: $(TMP_DIR)/.build
 $(curdir)/merge:
        rm -rf $(PACKAGE_DIR_ALL)
        mkdir -p $(PACKAGE_DIR_ALL)
-       -$(foreach pdir,$(PACKAGE_SUBDIRS),$(if $(wildcard $(pdir)/*.ipk),ln -s $(pdir)/*.ipk $(PACKAGE_DIR_ALL);))
+       -$(foreach pdir,$(PACKAGE_SUBDIRS),$(if $(wildcard $(pdir)/*.apk),ln -s $(pdir)/*.apk $(PACKAGE_DIR_ALL);))
 
 $(curdir)/merge-index: $(curdir)/merge
-       (cd $(PACKAGE_DIR_ALL) && $(SCRIPT_DIR)/ipkg-make-index.sh . 2>&1 > Packages; )
+       (cd $(PACKAGE_DIR_ALL) && $(STAGING_DIR_HOST)/bin/apk mkndx \
+                       --root $(TOPDIR) \
+                       --keys-dir $(TOPDIR) \
+                       --sign $(BUILD_KEY_APK_SEC) \
+                       --output packages.adb \
+                       *.apk; \
+       )
 
 ifndef SDK
-  $(curdir)/compile: $(curdir)/system/opkg/host/compile
+  $(curdir)/compile: $(curdir)/system/apk/host/compile
 endif
 
-$(curdir)/install: $(TMP_DIR)/.build $(curdir)/merge $(if $(CONFIG_TARGET_PER_DEVICE_ROOTFS),$(curdir)/merge-index)
+$(curdir)/install: $(TMP_DIR)/.build $(curdir)/merge $(curdir)/merge-index
        - find $(STAGING_DIR_ROOT) -type d | $(XARGS) chmod 0755
        rm -rf $(TARGET_DIR) $(TARGET_DIR_ORIG)
        mkdir -p $(TARGET_DIR)/tmp
-       $(file >$(TMP_DIR)/opkg_install_list,\
-         $(call opkg_package_files,\
-           $(foreach pkg,$(shell cat $(PACKAGE_INSTALL_FILES) 2>/dev/null),$(pkg)$(call GetABISuffix,$(pkg)))))
-       $(call opkg,$(TARGET_DIR)) install $$(cat $(TMP_DIR)/opkg_install_list)
-       @for file in $(PACKAGE_INSTALL_FILES); do \
-               [ -s $$file.flags ] || continue; \
-               for flag in `cat $$file.flags`; do \
-                       $(call opkg,$(TARGET_DIR)) flag $$flag `cat $$file`; \
-               done; \
-       done || true
+
+       $(file >$(TMP_DIR)/apk_install_list,\
+           $(foreach pkg,$(shell cat $(PACKAGE_INSTALL_FILES) 2>/dev/null),$(pkg)$(call GetABISuffix,$(pkg))))
+       
+       $(call apk,$(TARGET_DIR)) add --initdb --arch $(ARCH_PACKAGES) $$(cat $(TMP_DIR)/apk_install_list)
 
        $(CP) $(TARGET_DIR) $(TARGET_DIR_ORIG)
 
@@ -83,25 +84,16 @@ $(curdir)/install: $(TMP_DIR)/.build $(curdir)/merge $(if $(CONFIG_TARGET_PER_DE
 
 $(curdir)/index: FORCE
        @echo Generating package index...
-       @for d in $(PACKAGE_SUBDIRS); do ( \
+       -for d in $(PACKAGE_SUBDIRS); do ( \
                mkdir -p $$d; \
                cd $$d || continue; \
-               $(SCRIPT_DIR)/ipkg-make-index.sh . 2>&1 > Packages.manifest; \
-               grep -vE '^(Maintainer|LicenseFiles|Source|SourceName|Require|SourceDateEpoch)' Packages.manifest > Packages; \
-               case "$$(((64 + $$(stat -L -c%s Packages)) % 128))" in 110|111) \
-                       $(call ERROR_MESSAGE,WARNING: Applying padding in $$d/Packages to workaround usign SHA-512 bug!); \
-                       { echo ""; echo ""; } >> Packages;; \
-               esac; \
-               gzip -9nc Packages > Packages.gz; \
+               $(STAGING_DIR_HOST)/bin/apk mkndx \
+                       --root $(TOPDIR) \
+                       --keys-dir $(TOPDIR) \
+                       --sign $(BUILD_KEY_APK_SEC) \
+                       --output packages.adb \
+                       *.apk; \
        ); done
-ifdef CONFIG_SIGNED_PACKAGES
-       @echo Signing package index...
-       @for d in $(PACKAGE_SUBDIRS); do ( \
-               [ -d $$d ] && \
-                       cd $$d || continue; \
-               $(STAGING_DIR_HOST)/bin/usign -S -m Packages -s $(BUILD_KEY); \
-       ); done
-endif
 
 $(curdir)/flags-install:= -j1
 
index 914f0598ff9c181952f20f769e64d2b1121b6ae2..caa9f15153ea7540385d7fcaafbcaf4ac8f7a4fa 100644 (file)
@@ -108,6 +108,10 @@ ifdef CONFIG_SIGNED_PACKAGES
        [ -s $(BUILD_KEY).ucert ] || \
                $(STAGING_DIR_HOST)/bin/ucert -I -c $(BUILD_KEY).ucert -p $(BUILD_KEY).pub -s $(BUILD_KEY)
 
+       [ -s $(BUILD_KEY_APK_SEC) -a -s $(BUILD_KEY_APK_PUB) ] || \
+               $(STAGING_DIR_HOST)/bin/openssl ecparam -name prime256v1 -genkey -noout -out $(BUILD_KEY_APK_SEC); \
+               $(STAGING_DIR_HOST)/bin/openssl ec -in $(BUILD_KEY_APK_SEC) -pubout > $(BUILD_KEY_APK_PUB)
+
   endef
 
 ifndef CONFIG_BUILDBOT
@@ -115,6 +119,9 @@ ifndef CONFIG_BUILDBOT
        mkdir -p $(1)/etc/opkg/keys
        $(CP) $(BUILD_KEY).pub $(1)/etc/opkg/keys/`$(STAGING_DIR_HOST)/bin/usign -F -p $(BUILD_KEY).pub`
 
+       mkdir -p $(1)/etc/apk/keys
+       $(CP) $(BUILD_KEY_APK_PUB) $(1)/etc/apk/keys/
+
   endef
 endif
 endif
@@ -217,15 +224,12 @@ endif
                cat $(BIN_DIR)/feeds.buildinfo >>$(1)/etc/build.feeds; \
                cat $(BIN_DIR)/version.buildinfo >>$(1)/etc/build.version)
 
-       $(if $(CONFIG_CLEAN_IPKG),, \
-               mkdir -p $(1)/etc/opkg; \
-               $(call FeedSourcesAppend,$(1)/etc/opkg/distfeeds.conf); \
-               $(VERSION_SED_SCRIPT) $(1)/etc/opkg/distfeeds.conf)
-       $(if $(CONFIG_IPK_FILES_CHECKSUMS),, \
-               rm -f $(1)/sbin/pkg_check)
-
        $(if $(CONFIG_TARGET_PREINIT_DISABLE_FAILSAFE), \
                rm -f $(1)/etc/banner.failsafe,)
+
+       mkdir -p $(1)/etc/apk/
+       $(call FeedSourcesAppend,$(1)/etc/apk/repositories)
+       $(VERSION_SED_SCRIPT) $(1)/etc/apk/repositories
 endef
 
 ifneq ($(DUMP),1)
index 4b1b838572a0cd6060856d44fcf9e5da4d14c697..d5c0173a04415c2c561a4a42468dbb070504b566 100644 (file)
@@ -178,17 +178,10 @@ config_list_foreach() {
 }
 
 default_prerm() {
-       local root="${IPKG_INSTROOT}"
-       local pkgname="$(basename ${1%.*})"
-       local ret=0
-
-       if [ -f "$root/usr/lib/opkg/info/${pkgname}.prerm-pkg" ]; then
-               ( . "$root/usr/lib/opkg/info/${pkgname}.prerm-pkg" )
-               ret=$?
-       fi
+       update_alternatives remove
 
        local shell="$(command -v bash)"
-       for i in $(grep -s "^/etc/init.d/" "$root/usr/lib/opkg/info/${pkgname}.list"); do
+       for i in $(grep -s "^/etc/init.d/" "$root/lib/apk/packages/${pkgname}.list"); do
                if [ -n "$root" ]; then
                        ${shell:-/bin/sh} "$root/etc/rc.common" "$root$i" disable
                else
@@ -199,12 +192,13 @@ default_prerm() {
                fi
        done
 
-       return $ret
+       return 0
 }
 
 add_group_and_user() {
-       local pkgname="$1"
-       local rusers="$(sed -ne 's/^Require-User: *//p' $root/usr/lib/opkg/info/${pkgname}.control 2>/dev/null)"
+       if [ -f "$root/lib/apk/packages/${pkgname}.rusers" ]; then
+               local rusers="$(cat $root/lib/apk/packages/${pkgname}.rusers)"
+       fi
 
        if [ -n "$rusers" ]; then
                local tuple oIFS="$IFS"
@@ -254,18 +248,58 @@ add_group_and_user() {
        fi
 }
 
-default_postinst() {
-       local root="${IPKG_INSTROOT}"
-       local pkgname="$(basename ${1%.*})"
-       local filelist="/usr/lib/opkg/info/${pkgname}.list"
-       local ret=0
-
-       add_group_and_user "${pkgname}"
+update_alternatives() {
+       local action="$1"
+
+       if [ -f "$root/lib/apk/packages/${pkgname}.alternatives" ]; then
+               for pkg_alt in $(cat $root/lib/apk/packages/${pkgname}.alternatives); do
+                       local best_prio=0;
+                       local best_src="/bin/busybox";
+                       pkg_prio=${pkg_alt%%:*};
+                       pkg_target=${pkg_alt#*:};
+                       pkg_target=${pkg_target%:*};
+                       pkg_src=${pkg_alt##*:};
+
+                       if [ -e "$root/$target" ]; then
+                               for alts in $root/lib/apk/packages/*.alternatives; do
+                    for alt in $(cat $alts); do
+                        prio=${alt%%:*};
+                        target=${alt#*:};
+                        target=${target%:*};
+                        src=${alt##*:};
+
+                        if [ "$target" = "$pkg_target" ] && \
+                                [ "$src" != "$pkg_src" ] && \
+                                [ "$best_prio" -lt "$prio" ]; then
+                            best_prio=$prio;
+                            best_src=$src;
+                        fi
+                    done
+                               done
+                       fi
 
-       if [ -f "$root/usr/lib/opkg/info/${pkgname}.postinst-pkg" ]; then
-               ( . "$root/usr/lib/opkg/info/${pkgname}.postinst-pkg" )
-               ret=$?
+                       case "$action" in
+                               install)
+                                       if [ "$best_prio" -lt "$pkg_prio" ]; then
+                                               ln -sf "$pkg_src" "$root/$pkg_target"
+                        echo "add alternative: $pkg_target -> $pkg_src"
+                                       fi
+                               ;;
+                               remove)
+                                       if [ "$best_prio" -lt "$pkg_prio" ]; then
+                                               ln -sf "$best_src" "$root/$pkg_target"
+                        echo "add alternative: $pkg_target -> $best_src"
+                                       fi
+                               ;;
+                       esac
+               done
        fi
+}
+
+default_postinst() {
+       local filelist="$root/lib/apk/packages/${pkgname}.list"
+
+       update_alternatives install
 
        if [ -d "$root/rootfs-overlay" ]; then
                cp -R $root/rootfs-overlay/. $root/
@@ -304,7 +338,7 @@ default_postinst() {
                fi
        done
 
-       return $ret
+       return 0
 }
 
 include() {
index ff917602701ab6d6729d4a9bc3e955df80bb5200..c7cee94a45acdb05c4b091a320b718487c8f8b8c 100644 (file)
@@ -50,6 +50,7 @@ define Package/kernel
   DEFAULT:=y
   TITLE:=Virtual kernel package
   VERSION:=$(LINUX_VERSION)-$(LINUX_RELEASE)-$(LINUX_VERMAGIC)
+  PROVIDES:="kernel-$(LINUX_VERSION)-$(LINUX_RELEASE)-$(LINUX_VERMAGIC)"
   URL:=http://www.kernel.org/
   PKG_FLAGS:=nonshared
 endef
index f9f8ac956bebb640effe6400a81c4366d7ff9d52..476ea090378f5e63f9d7249d19cce73dfea3e4e6 100644 (file)
@@ -27,7 +27,7 @@ define Package/gcc/Default
   SECTION:=libs
   CATEGORY:=Base system
   URL:=http://gcc.gnu.org/
-  VERSION:=$(LIBGCC_VERSION)-$(PKG_RELEASE)
+  VERSION:=$(LIBGCC_VERSION)-r$(PKG_RELEASE)
 endef
 
 define Package/libgcc
@@ -230,7 +230,7 @@ endef
 define Package/libc/Default
   SECTION:=libs
   CATEGORY:=Base system
-  VERSION:=$(LIBC_VERSION)-$(PKG_RELEASE)
+  VERSION:=$(LIBC_VERSION)-r$(PKG_RELEASE)
   DEPENDS:=+libgcc
   URL:=$(LIBC_URL)
 endef
index 889f1455047400671d13b541fae3f4974368e1c4..5fb095bf26738f29d49286dbff81918b5ca69f6c 100644 (file)
@@ -149,7 +149,7 @@ define Package/hostapd/Default
   TITLE:=IEEE 802.1x Authenticator
   URL:=http://hostap.epitest.fi/
   DEPENDS:=$(DRV_DEPENDS) +hostapd-common +libubus
-  EXTRA_DEPENDS:=hostapd-common (=$(PKG_VERSION)-$(PKG_RELEASE))
+  EXTRA_DEPENDS:=hostapd-common=$(PKG_VERSION)-$(PKG_RELEASE)
   USERID:=network=101:network=101
   PROVIDES:=hostapd
   CONFLICTS:=$(HOSTAPD_PROVIDERS)
@@ -254,7 +254,7 @@ define Package/wpad/Default
   SUBMENU:=WirelessAPD
   TITLE:=IEEE 802.1x Auth/Supplicant
   DEPENDS:=$(DRV_DEPENDS) +hostapd-common +libubus
-  EXTRA_DEPENDS:=hostapd-common (=$(PKG_VERSION)-$(PKG_RELEASE))
+  EXTRA_DEPENDS:=hostapd-common=$(PKG_VERSION)-$(PKG_RELEASE)
   USERID:=network=101:network=101
   URL:=http://hostap.epitest.fi/
   PROVIDES:=hostapd wpa-supplicant
@@ -399,7 +399,7 @@ define Package/wpa-supplicant/Default
   TITLE:=WPA Supplicant
   URL:=http://hostap.epitest.fi/wpa_supplicant/
   DEPENDS:=$(DRV_DEPENDS) +hostapd-common +libubus
-  EXTRA_DEPENDS:=hostapd-common (=$(PKG_VERSION)-$(PKG_RELEASE))
+  EXTRA_DEPENDS:=hostapd-common=$(PKG_VERSION)-$(PKG_RELEASE)
   USERID:=network=101:network=101
   PROVIDES:=wpa-supplicant
   CONFLICTS:=$(SUPPLICANT_PROVIDERS)
diff --git a/package/system/apk/Makefile b/package/system/apk/Makefile
new file mode 100644 (file)
index 0000000..134c576
--- /dev/null
@@ -0,0 +1,64 @@
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=apk
+PKG_RELEASE:=$(AUTORELEASE)
+
+PKG_SOURCE_DATE:=2023-01-31
+PKG_SOURCE_VERSION:=6b92da350bfb310e4e0ccfea8e870be476b9c1d7
+PKG_HASH:=a5d0d20ddba877a1dccd46b514c335fc199f74d28527494ca412375e15788fdb
+
+PKG_VERSION:=3.0.0_pre0_$(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-openwrt-move-layer-db-to-temp-folder.patch b/package/system/apk/patches/0001-openwrt-move-layer-db-to-temp-folder.patch
new file mode 100644 (file)
index 0000000..02a2971
--- /dev/null
@@ -0,0 +1,26 @@
+From 9918c683fcc2f148328332d58d030ec5750a1473 Mon Sep 17 00:00:00 2001
+From: Paul Spooren <mail@aparcar.org>
+Date: Sat, 19 Feb 2022 17:20:37 +0100
+Subject: [PATCH 1/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 6758e98..d8bcdfa 100644
+--- a/src/database.c
++++ b/src/database.c
+@@ -1621,7 +1621,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
+
diff --git a/package/system/apk/patches/0002-change-naming-to-name-_-version-_-arch-.apk.patch b/package/system/apk/patches/0002-change-naming-to-name-_-version-_-arch-.apk.patch
new file mode 100644 (file)
index 0000000..4e9d67b
--- /dev/null
@@ -0,0 +1,69 @@
+From 091488909354d3f6aabb3fe98379be9025ad04c1 Mon Sep 17 00:00:00 2001
+From: Paul Spooren <mail@aparcar.org>
+Date: Tue, 1 Feb 2022 09:30:20 +0100
+Subject: [PATCH 2/4] change naming to <name>_<version>_<arch>.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`.
+
+Also add the package architecture to package filenames. This allows a
+better overview when downloading packages manually i.e. from a CI.
+
+Signed-off-by: Paul Spooren <mail@aparcar.org>
+---
+ src/apk_package.h | 4 ++--
+ src/app_mkpkg.c   | 2 +-
+ src/database.c    | 6 ++++--
+ 3 files changed, 7 insertions(+), 5 deletions(-)
+
+diff --git a/src/apk_package.h b/src/apk_package.h
+index 8d9cba4..8cd33d8 100644
+--- a/src/apk_package.h
++++ b/src/apk_package.h
+@@ -102,8 +102,8 @@ 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_PRINTF(pkg)   pkg->name->name, BLOB_PRINTF(*pkg->version)
++#define PKG_VER_FMT           "%s_" BLOB_FMT "_" BLOB_FMT
++#define PKG_VER_PRINTF(pkg)   pkg->name->name, BLOB_PRINTF(*pkg->version), BLOB_PRINTF(*pkg->arch)
+ #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 e085090..a238250 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 d8bcdfa..8fbcd25 100644
+--- a/src/database.c
++++ b/src/database.c
+@@ -561,10 +561,12 @@ 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_blob(&to, *pkg->arch);
+       apk_blob_push_blob(&to, APK_BLOB_STR("."));
+       apk_blob_push_hexdump(&to, APK_BLOB_PTR_LEN((char *) pkg->csum.data,
+                                                   APK_CACHE_CSUM_BYTES));
+-- 
+2.35.1
+
diff --git a/package/system/apk/patches/0003-WIP-use-opkg-version-compare-algorithm.patch b/package/system/apk/patches/0003-WIP-use-opkg-version-compare-algorithm.patch
new file mode 100644 (file)
index 0000000..f492877
--- /dev/null
@@ -0,0 +1,110 @@
+From c62fdcd9c931f5923abc5ffdecd4e2883a31e9ef Mon Sep 17 00:00:00 2001
+From: Paul Spooren <mail@aparcar.org>
+Date: Tue, 29 Mar 2022 15:44:37 +0100
+Subject: [PATCH 3/4] WIP: use opkg version compare algorithm
+
+Signed-off-by: Paul Spooren <mail@aparcar.org>
+---
+ src/version.c | 70 +++++++++++++++++++++++++++++++++++++++++++++++++--
+ 1 file changed, 68 insertions(+), 2 deletions(-)
+
+diff --git a/src/version.c b/src/version.c
+index f93e4c5..9e0a84c 100644
+--- a/src/version.c
++++ b/src/version.c
+@@ -12,6 +12,70 @@
+ #include "apk_defines.h"
+ #include "apk_version.h"
++/*
++ * libdpkg - Debian packaging suite library routines
++ * vercmp.c - comparison of version numbers
++ *
++ * Copyright (C) 1995 Ian Jackson <iwj10@cus.cam.ac.uk>
++ */
++
++/* assume ascii; warning: evaluates x multiple times! */
++#define order(x) ((x) == '~' ? -1 \
++              : isdigit((x)) ? 0 \
++              : !(x) ? 0 \
++              : isalpha((x)) ? (x) \
++              : (x) + 256)
++
++static int verrevcmp(apk_blob_t a, apk_blob_t b)
++{
++      char *val = a.ptr;
++      char *ref = b.ptr;
++
++      if (!val)
++              val = "";
++      if (!ref)
++              ref = "";
++
++      while ((val - a.ptr) < a.len  || (ref - b.ptr) < b.len) {
++              int first_diff = 0;
++
++              while ((((val - a.ptr) < a.len) && !isdigit(*val)) || (((ref - b.ptr) < b.len) && !isdigit(*ref))) {
++                      int vc = order(*val), rc = order(*ref);
++                      if (vc != rc) {
++                              if (vc - rc)
++                                      return APK_VERSION_LESS;
++                              else
++                                      return APK_VERSION_GREATER;
++                      }
++                      val++;
++                      ref++;
++              }
++
++              while (*val == '0')
++                      val++;
++              while (*ref == '0')
++                      ref++;
++              while (isdigit(*val) && isdigit(*ref)) {
++                      if (!first_diff)
++                              first_diff = *val - *ref;
++                      val++;
++                      ref++;
++              }
++              if (isdigit(*val))
++                      return APK_VERSION_GREATER;
++              if (isdigit(*ref))
++                      return APK_VERSION_LESS;
++              if (first_diff) {
++                      if (first_diff > 0)
++                              return APK_VERSION_GREATER;
++                      else
++                              return APK_VERSION_LESS;
++              }
++
++      }
++      return APK_VERSION_EQUAL;
++}
++
+ /* Gentoo version: {digit}{.digit}...{letter}{_suf{#}}...{-r#} */
+ enum PARTS {
+@@ -192,6 +256,7 @@ int apk_version_result_mask(const char *op)
+ int apk_version_validate(apk_blob_t ver)
+ {
++      return 1;
+       int t = TOKEN_DIGIT;
+       while (t != TOKEN_END && t != TOKEN_INVALID)
+@@ -251,10 +316,11 @@ int apk_version_compare_blob_fuzzy(apk_blob_t a, apk_blob_t b, int fuzzy)
+ int apk_version_compare_blob(apk_blob_t a, apk_blob_t b)
+ {
+-      return apk_version_compare_blob_fuzzy(a, b, FALSE);
++      return verrevcmp(a, b);
++      // return apk_version_compare_blob_fuzzy(a, b, FALSE);
+ }
+ int apk_version_compare(const char *str1, const char *str2)
+ {
+-      return apk_version_compare_blob(APK_BLOB_STR(str1), APK_BLOB_STR(str2));
++      return verrevcmp(APK_BLOB_STR(str1), APK_BLOB_STR(str2));
+ }
+-- 
+2.35.1
+
index a495e3434523b7a4b1b2f1bc3f4c9298197fc745..a5e4b9bc91c69c74bca984da838e0a504a5028b1 100644 (file)
@@ -37,17 +37,7 @@ do_config_push() {
 }
 
 do_snapshot_upgrade() {
-       opkg update
-       [ $? -eq 0 ] || exit 1
-
-       opkg list-upgradable
-       [ $? -eq 0 ] || exit 2
-
-       UPDATES=`opkg list-upgradable | cut -d" " -f1`
-       [ -z "${UPDATES}" ] && exit 0
-
-       opkg upgrade ${UPDATES}
-       [ $? -eq 0 ] || exit 3
+       apk upgrade
 
        do_snapshot_push
        sleep 5
index 3d151338af11ca68923e76fd9fb585614a2d37ff..36dd3a3190608e854bde607f6ab973fbe27a21c6 100644 (file)
--- a/rules.mk
+++ b/rules.mk
@@ -243,6 +243,8 @@ HOST_CFLAGS:=-O2 $(HOST_CPPFLAGS)
 HOST_LDFLAGS:=-L$(STAGING_DIR_HOST)/lib $(if $(IS_PACKAGE_BUILD),-L$(STAGING_DIR_HOSTPKG)/lib -L$(STAGING_DIR)/host/lib)
 
 BUILD_KEY=$(TOPDIR)/key-build
+BUILD_KEY_APK_SEC=$(TOPDIR)/private-key.pem
+BUILD_KEY_APK_PUB=$(TOPDIR)/public-key.pem
 
 FAKEROOT:=$(STAGING_DIR_HOST)/bin/fakeroot
 
index aee73e793f54ecbea6da8fab98e936a91a9ceb8a..e8cc346e130fd00ceccf5edd58f49b48345d163d 100755 (executable)
@@ -865,7 +865,7 @@ sub feed_config() {
                printf "\t\tdepends on PER_FEED_REPO\n";
                printf "\t\tdefault y\n" if $installed;
                printf "\t\thelp\n";
-               printf "\t\t Enable the \\\"%s\\\" feed in opkg distfeeds.conf.\n", $feed->[1];
+               printf "\t\t Enable the \\\"%s\\\" feed in apk repositories.\n", $feed->[1];
                printf "\t\t Say M to add the feed commented out.\n";
                printf "\n";
        }
@@ -884,7 +884,7 @@ Commands:
            -s :            List of feed names and their URL.
            -r <feedname>:  List packages of specified feed.
            -d <delimiter>: Use specified delimiter to distinguish rows (default: spaces)
-           -f :            List feeds in feeds.conf compatible format (when using -s).
+           -f :            List feeds in opkg feeds.conf compatible format (when using -s).
 
        install [options] <package>: Install a package
        Options:
index 3bbadc7204d1e8859cbf363ae3101b753b08422f..2ef51ce7fe5fd2e8eb43ef2d0244dfd77da50678 100644 (file)
@@ -25,7 +25,7 @@ BUNDLER_COMMAND := PATH=$(BUNDLER_PATH) $(XARGS) $(SCRIPT_DIR)/bundle-libraries.
 all: compile
 
 $(BIN_DIR)/$(IB_NAME).tar.xz: clean
-       rm -rf $(PKG_BUILD_DIR)
+       #rm -rf $(PKG_BUILD_DIR)
        mkdir -p $(IB_KDIR) $(IB_LDIR) $(PKG_BUILD_DIR)/staging_dir/host/lib \
                $(PKG_BUILD_DIR)/target $(PKG_BUILD_DIR)/scripts $(IB_DTSDIR)
        -cp $(TOPDIR)/.config $(PKG_BUILD_DIR)/.config
@@ -35,15 +35,13 @@ $(BIN_DIR)/$(IB_NAME).tar.xz: clean
                $(INCLUDE_DIR) $(SCRIPT_DIR) \
                $(TOPDIR)/rules.mk \
                ./files/Makefile \
-               ./files/repositories.conf \
                $(TMP_DIR)/.targetinfo \
                $(TMP_DIR)/.packageinfo \
                $(PKG_BUILD_DIR)/
 
 ifeq ($(CONFIG_IB_STANDALONE),)
-       echo '## Remote package repositories' >> $(PKG_BUILD_DIR)/repositories.conf
-       $(call FeedSourcesAppend,$(PKG_BUILD_DIR)/repositories.conf)
-       $(VERSION_SED_SCRIPT) $(PKG_BUILD_DIR)/repositories.conf
+       $(call FeedSourcesAppend,$(PKG_BUILD_DIR)/repositories)
+       $(VERSION_SED_SCRIPT) $(PKG_BUILD_DIR)/repositories
 endif
 
        $(INSTALL_DIR) $(PKG_BUILD_DIR)/packages
@@ -58,26 +56,18 @@ endif
 ifeq ($(CONFIG_BUILDBOT),)
   ifeq ($(CONFIG_IB_STANDALONE),)
        $(FIND) $(call FeedPackageDir,libc) -type f \
-               \( -name 'libc_*.ipk' -or -name 'kernel_*.ipk' -or -name 'kmod-*.ipk' \) \
+               \( -name 'libc_*.apk' -or -name 'kernel_*.apk' -or -name 'kmod-*.apk' \) \
                -exec $(CP) -t $(PKG_BUILD_DIR)/packages {} +
   else
-       $(FIND) $(wildcard $(PACKAGE_SUBDIRS)) -type f -name '*.ipk' \
+       $(FIND) $(wildcard $(PACKAGE_SUBDIRS)) -type f -name '*.apk' \
                -exec $(CP) -t $(PKG_BUILD_DIR)/packages/ {} +
   endif
 else
        $(FIND) $(call FeedPackageDir,libc) -type f \
-               \( -name 'libc_*.ipk' -or -name 'kernel_*.ipk' \) \
+               \( -name 'libc_*.apk' -or -name 'kernel_*.apk' \) \
                -exec $(CP) -t $(IB_LDIR)/ {} +
 endif
 
-ifneq ($(CONFIG_SIGNATURE_CHECK),)
-       echo ''                                                        >> $(PKG_BUILD_DIR)/repositories.conf
-       echo 'option check_signature'                                  >> $(PKG_BUILD_DIR)/repositories.conf
-       $(INSTALL_DIR) $(PKG_BUILD_DIR)/keys
-       $(CP) -L $(STAGING_DIR_ROOT)/etc/opkg/keys/ $(PKG_BUILD_DIR)/
-       $(CP) -L $(STAGING_DIR_ROOT)/usr/sbin/opkg-key $(PKG_BUILD_DIR)/scripts/
-endif
-
        $(CP) -L $(TOPDIR)/target/linux $(PKG_BUILD_DIR)/target/
        if [ -d $(TOPDIR)/staging_dir/host/lib/grub ]; then \
                $(CP) $(TOPDIR)/staging_dir/host/lib/grub/ $(PKG_BUILD_DIR)/staging_dir/host/lib; \
@@ -108,8 +98,11 @@ endif
        $(CP) $(STAGING_DIR_HOST)/bin/* $(PKG_BUILD_DIR)/staging_dir/host/bin/
        (cd $(PKG_BUILD_DIR); find staging_dir/host/bin/ $(IB_LDIR)/scripts/dtc/ -type f | \
                $(BUNDLER_COMMAND))
+
+       $(INSTALL_DIR) $(PKG_BUILD_DIR)/staging_dir/hostpkg/bin
        $(CP) $(TOPDIR)/staging_dir/host/lib/libfakeroot* $(PKG_BUILD_DIR)/staging_dir/host/lib
        STRIP=$(STAGING_DIR_HOST)/bin/sstrip $(SCRIPT_DIR)/rstrip.sh $(PKG_BUILD_DIR)/staging_dir/host/bin/
+
        (cd $(BUILD_DIR); \
                tar -I '$(STAGING_DIR_HOST)/bin/xz -7e -T$(if $(filter 1,$(NPROC)),2,0)' -cf $@ $(IB_NAME) \
                --mtime="$(shell date --date=@$(SOURCE_DATE_EPOCH))"; \
index 275932577b4c7024e4bb2e496f4c36cbdca0628d..a0e2e84404a5a5888c8d31a4b89cf60063a03e3c 100644 (file)
@@ -83,6 +83,7 @@ help: FORCE
 # override variables from rules.mk
 PACKAGE_DIR:=$(TOPDIR)/packages
 LISTS_DIR:=$(subst $(space),/,$(patsubst %,..,$(subst /,$(space),$(TARGET_DIR))))$(DL_DIR)
+PACKAGE_DIR_ALL:=$(TOPDIR)/packages
 export OPKG_KEYS:=$(TOPDIR)/keys
 OPKG:=$(call opkg,$(TARGET_DIR)) \
        -f $(TOPDIR)/repositories.conf \
@@ -90,6 +91,11 @@ OPKG:=$(call opkg,$(TARGET_DIR)) \
        --cache $(DL_DIR) \
        --lists-dir $(LISTS_DIR)
 
+APK:=$(call apk,$(TARGET_DIR)) \
+       --cache-dir $(DL_DIR) \
+       --allow-untrusted
+
+
 include $(INCLUDE_DIR)/target.mk
 -include .profiles.mk
 
@@ -148,41 +154,36 @@ _call_manifest: FORCE
        mkdir -p $(TARGET_DIR) $(BIN_DIR) $(TMP_DIR) $(DL_DIR)
        $(MAKE) package_reload >/dev/null
        $(MAKE) package_install >/dev/null
-       $(OPKG) list-installed $(if $(STRIP_ABI),--strip-abi)
+       $(APK) list --manifest 
 
 package_index: FORCE
        @echo >&2
        @echo Building package index... >&2
        @mkdir -p $(TMP_DIR) $(TARGET_DIR)/tmp
-       (cd $(PACKAGE_DIR); $(SCRIPT_DIR)/ipkg-make-index.sh . > Packages && \
-               gzip -9nc Packages > Packages.gz; \
-               $(if $(CONFIG_SIGNATURE_CHECK), \
-                       $(STAGING_DIR_HOST)/bin/usign -S -m Packages -s $(BUILD_KEY)) \
-       ) >/dev/null 2>/dev/null
-       $(OPKG) update >&2 || true
+       $(APK) add --initdb >&2 || true
+       $(APK) update >&2 || true
 
 package_reload:
        if [ -d "$(PACKAGE_DIR)" ] && ( \
-                       [ ! -f "$(PACKAGE_DIR)/Packages" ] || \
-                       [ ! -f "$(PACKAGE_DIR)/Packages.gz" ] || \
-                       [ "`find $(PACKAGE_DIR) -cnewer $(PACKAGE_DIR)/Packages.gz`" ] ); then \
+                       [ ! -f "$(PACKAGE_DIR)/packages.adb" ] || \
+                       [ "`find $(PACKAGE_DIR) -cnewer $(PACKAGE_DIR)/packages.adb`" ] ); then \
                echo "Package list missing or not up-to-date, generating it." >&2 ;\
                $(MAKE) package_index; \
        else \
                mkdir -p $(TARGET_DIR)/tmp; \
-               $(OPKG) update >&2 || true; \
+               $(APK) update >&2 || true; \
        fi
 
 package_list: FORCE
        @$(MAKE) -s package_reload
-       @$(OPKG) list --size 2>/dev/null
+       @$(APK) list --size 2>/dev/null
 
 package_install: FORCE
        @echo
        @echo Installing packages...
-       $(OPKG) install $(firstword $(wildcard $(LINUX_DIR)/libc_*.ipk $(PACKAGE_DIR)/libc_*.ipk))
-       $(OPKG) install $(firstword $(wildcard $(LINUX_DIR)/kernel_*.ipk $(PACKAGE_DIR)/kernel_*.ipk))
-       $(OPKG) install $(BUILD_PACKAGES)
+       $(APK) add $(firstword $(wildcard $(LINUX_DIR)/libc-*.apk $(PACKAGE_DIR)/libc_*.apk))
+       $(APK) add $(firstword $(wildcard $(LINUX_DIR)/kernel-*.apk $(PACKAGE_DIR)/kernel_*.apk))
+       $(APK) add $(BUILD_PACKAGES)
 
 prepare_rootfs: FORCE
        @echo
@@ -254,7 +255,7 @@ endif
 
 image:
        $(MAKE) -s _check_profile
-       $(MAKE) -s _check_keys
+       #$(MAKE) -s _check_keys
        (unset PROFILE FILES PACKAGES MAKEFLAGS; \
        $(MAKE) -s _call_image \
                $(if $(PROFILE),USER_PROFILE="$(PROFILE_FILTER)") \
@@ -265,7 +266,7 @@ image:
 
 manifest: FORCE
        $(MAKE) -s _check_profile
-       $(MAKE) -s _check_keys
+       #$(MAKE) -s _check_keys
        (unset PROFILE FILES PACKAGES MAKEFLAGS; \
        $(MAKE) -s _call_manifest \
                $(if $(PROFILE),USER_PROFILE="$(PROFILE_FILTER)") \
@@ -277,7 +278,7 @@ ifeq ($(PACKAGE),)
        @exit 1
 endif
        @$(MAKE) -s package_reload
-       @$(OPKG) whatdepends -A $(PACKAGE)
+       @$(APK) list --depends $(PACKAGE)
 
 package_depends: FORCE
 ifeq ($(PACKAGE),)