build: lock versions for special APK packages main master
authorPaul Spooren <mail@aparcar.org>
Sat, 1 Feb 2025 23:01:58 +0000 (23:01 +0000)
committerPaul Spooren <mail@aparcar.org>
Tue, 4 Feb 2025 13:48:59 +0000 (13:48 +0000)
The three packages base-files, libc and kernel are special, the former
can't be upgraded in place since it's content are modified on startup,
the latter two are virtual packages only used as constraints for the
package manager.

Historically base-files was "locked" via a special OPKG function, the
latter two were hidden from the package index and thereby never picked
as possible upgrade.

Time moved forward and we now have APK and tools like OWUT. The latter
compares available packages with installed packages and generates user
readable output, requiring versions for libc and kernel, too. At the
same time, APK uses a different looking mechanism, which is set during
installation instead of part of the package metadata.

In short, this patch adds version constraints to the three packages,
allowing them to be part of the package index.

Fixes: #17774
Fixes: #17775
Fixes: efahl/owut#31
Signed-off-by: Paul Spooren <mail@aparcar.org>
include/version.mk
package/Makefile
package/base-files/Makefile
package/kernel/linux/Makefile
package/libs/toolchain/Makefile
target/imagebuilder/Makefile
target/imagebuilder/files/Makefile

index e9829e860afe230dca2fd7c2833e89a5230bf740..b1e414f1895184274a87c70c9a8528720c6295b6 100644 (file)
@@ -6,6 +6,9 @@
 # Substituted by SDK, do not remove
 # REVISION:=x
 # SOURCE_DATE_EPOCH:=x
+# BASE_FILES_VERSION:=x
+# KERNEL_VERSION:=x
+# LIBC_VERSION:=x
 
 PKG_CONFIG_DEPENDS += \
        CONFIG_VERSION_HOME_URL \
index ca43eb7e01642bd870c41152963de72c9122b44c..701ed3b13b496a6fe08ee3784a90e99343d33a79 100644 (file)
@@ -100,7 +100,11 @@ ifneq ($(CONFIG_USE_APK),)
            $(foreach pkg,$(shell cat $(PACKAGE_INSTALL_FILES) 2>/dev/null),$(pkg)$(call GetABISuffix,$(pkg))))
        $(call apk,$(TARGET_DIR)) add --no-cache --initdb --no-scripts --arch $(ARCH_PACKAGES) \
                --repositories-file /dev/null --repository file://$(PACKAGE_DIR_ALL)/packages.adb \
-               $$(cat $(TMP_DIR)/apk_install_list)
+               $$(cat $(TMP_DIR)/apk_install_list) \
+                       "base-files=$(shell cat $(TMP_DIR)/base-files.version)" \
+                       "libc=$(shell cat $(TMP_DIR)/libc.version)" \
+                       "kernel=$(shell cat $(TMP_DIR)/kernel.version)"
+
        rm -rf $(TARGET_DIR)/run
 else
        $(file >$(TMP_DIR)/opkg_install_list,\
@@ -131,7 +135,7 @@ ifneq ($(CONFIG_USE_APK),)
                        --keys-dir $(TOPDIR) \
                        --sign $(BUILD_KEY_APK_SEC) \
                        --output packages.adb \
-                       $$(ls *.apk | grep -vE '^(base-files-|kernel-|libc-)'); \
+                       *.apk; \
                echo -n '{"architecture": "$(ARCH_PACKAGES)", "packages":{' > index.json; \
                $(STAGING_DIR_HOST)/bin/apk adbdump packages.adb | \
                        awk '/- name: / {pkg = $$NF} ; / version: / {printf "\"%s\": \"%s\", ", pkg, $$NF}' | \
index b90ee3a64ebca22bbe94228c10bc6e145b9ce844..693d259ee4cd0365c936405298c221bdc28c6422 100644 (file)
@@ -256,6 +256,7 @@ ifneq ($(CONFIG_USE_APK),)
 
        rm -f $(1)/etc/uci-defaults/13_fix-group-user
        rm -f $(1)/sbin/pkg_check
+       echo $(PKG_RELEASE)~$(lastword $(subst -, ,$(REVISION))) >$(TMP_DIR)/base-files.version
 else
        $(if $(CONFIG_CLEAN_IPKG),, \
                mkdir -p $(1)/etc/opkg; \
index 8dfb01ad66118a70be28f5c7019dd8c1c757de52..203cf0d1285416d1c1fecfaebb5e3c3bd8df3c13 100644 (file)
@@ -64,6 +64,7 @@ define Package/kernel/install
        strings $(LINUX_DIR)/modules.builtin.modinfo | \
                grep -E -v "\.(file$(if CONFIG_MODULE_STRIPPED,|parmtype))=" | \
                tr '\n' '\0' > $(1)/$(MODULES_SUBDIR)/modules.builtin.modinfo
+       echo $(LINUX_VERSION)~$(LINUX_VERMAGIC)-r$(LINUX_RELEASE) > $(TMP_DIR)/kernel.version
 endef
 
 define Package/kernel/extra_provides
index 7c117b144de34315d7f7ba2aed356c7584705974..ab0c0545b0c1b91c032574ad7e4d726de1bed7b5 100644 (file)
@@ -578,6 +578,7 @@ ifeq ($(CONFIG_EXTERNAL_TOOLCHAIN),)
   endef
 
   define Package/libc/install
+    echo $(LIBC_VERSION)-r$(PKG_RELEASE) > $(TMP_DIR)/libc.version; \
     $(call Package/$(LIBC)/install,$1)
   endef
 
@@ -697,6 +698,7 @@ else
   endef
 
   define Package/libc/install
+       echo $(LIBC_VERSION)-r$(PKG_RELEASE) > $(TMP_DIR)/libc.version; \
        for file in $(call qstrip,$(CONFIG_LIBC_FILE_SPEC)); do \
                $(INSTALL_DIR) $(1)/lib ; \
                $(CP) $(call qstrip,$(CONFIG_LIBC_ROOT_DIR))/$$$$file $(1)/lib/ ; \
index 9181d86a1cc8310ce3d6378923ebaaeaf5ddab04..afc97550c1d4fc0607b55a7bdbc4c394d3df68f1 100644 (file)
@@ -127,6 +127,9 @@ endif
        fi
        $(SED) 's,^# REVISION:=.*,REVISION:=$(REVISION),g' $(PKG_BUILD_DIR)/include/version.mk
        $(SED) 's,^# SOURCE_DATE_EPOCH:=.*,SOURCE_DATE_EPOCH:=$(SOURCE_DATE_EPOCH),g' $(PKG_BUILD_DIR)/include/version.mk
+       $(SED) 's,^# BASE_FILES_VERSION:=.*,BASE_FILES_VERSION:=$(shell cat $(TMP_DIR)/base-files.version),g' $(PKG_BUILD_DIR)/include/version.mk
+       $(SED) 's,^# LIBC_VERSION:=.*,LIBC_VERSION:=$(shell cat $(TMP_DIR)/libc.version),g' $(PKG_BUILD_DIR)/include/version.mk
+       $(SED) 's,^# KERNEL_VERSION:=.*,KERNEL_VERSION:=$(shell cat $(TMP_DIR)/kernel.version),g' $(PKG_BUILD_DIR)/include/version.mk
        $(SED) '/LINUX_VERMAGIC:=/ { s,unknown,$(LINUX_VERMAGIC),g }' $(PKG_BUILD_DIR)/include/kernel.mk
        find $(PKG_BUILD_DIR) -name CVS -o -name .git -o -name .svn \
          | $(XARGS) rm -rf
index 07cca7eea4a38862742f225b5d179d36c3750981..b27021d60025eb4de7aa1294c610620688aaad4e 100644 (file)
@@ -227,7 +227,10 @@ ifeq ($(CONFIG_USE_APK),)
        $(OPKG) install $(wildcard $(PACKAGE_DIR)/kernel_*.ipk)
        $(OPKG) install $(BUILD_PACKAGES)
 else
-       $(APK) add --arch $(ARCH_PACKAGES) --no-scripts $(BUILD_PACKAGES)
+       $(APK) add --arch $(ARCH_PACKAGES) --no-scripts $(BUILD_PACKAGES) \
+        "base-files=$(BASE_FILES_VERSION)" \
+        "libc=$(LIBC_VERSION)" \
+        "kernel=$(KERNEL_VERSION)"
 endif
 
 prepare_rootfs: FORCE