toplevel.mk: implement logic to invalidate targetinfo with some config
authorChristian Marangi <ansuelsmth@gmail.com>
Fri, 24 May 2024 18:13:49 +0000 (20:13 +0200)
committerChristian Marangi <ansuelsmth@gmail.com>
Tue, 11 Jun 2024 21:58:16 +0000 (23:58 +0200)
Implement some logic to invalidate targetinfo files in tmp with the
changing of some config.

Some config might affect DEFAULT_PACKAGES list but DEFAULT_PACKAGES is
only evaluated once. This cause the interesting scenario where someone
install feeds packages, targetinfo is evaluated in tmp and then add some
config like CONFIG_USE_APK. Using make defconfig will still select OPKG
as default package as DEFAULT_PACKAGES in targetinfo has been already
evaluated in the feeds install and is never updated.

To handle this add some logic in toplevel.mk to cache the current state
of these special config and wipe targetinfo when these change.

This cause the targetinfo to be reevaluated and handle this REALLY
corner case.

Link: https://github.com/openwrt/openwrt/pull/15543
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
include/target.mk
include/toplevel.mk

index df34f937d35b874c5a95a6a748635d39aa8ce083..4eccff3cd957504ff3306009e1e8308749ea9f0a 100644 (file)
@@ -9,8 +9,9 @@ __target_inc=1
 ifneq ($(DUMP),)
   # Parse generic config that might be set before a .config is generated to modify the
   # default package configuration
-  GENERIC_CONFIG := CONFIG_USE_APK CONFIG_SELINUX CONFIG_SMALL_FLASH CONFIG_SECCOMP
-  $(foreach config, $(GENERIC_CONFIG), \
+  # Keep DYNAMIC_DEF_PKG_CONF in sync with toplevel.mk to reflect the same configs
+  DYNAMIC_DEF_PKG_CONF := CONFIG_USE_APK CONFIG_SELINUX CONFIG_SMALL_FLASH CONFIG_SECCOMP
+  $(foreach config, $(DYNAMIC_DEF_PKG_CONF), \
     $(eval $(config) := $(shell grep "$(config)=y" $(TOPDIR)/.config 2>/dev/null)) \
   )
 endif
index 4ec99b30de30fd9b2cbcc93eb4f3733c4b1a03af..f711a306144746e94f7839674f0d132faa011cbe 100644 (file)
@@ -75,7 +75,22 @@ endif
 
 _ignore = $(foreach p,$(IGNORE_PACKAGES),--ignore $(p))
 
-prepare-tmpinfo: FORCE
+# Config that will invalidate the .targetinfo as they will affect
+# DEFAULT_PACKAGES.
+# Keep DYNAMIC_DEF_PKG_CONF in sync with target.mk to reflect the same configs
+DYNAMIC_DEF_PKG_CONF := CONFIG_USE_APK CONFIG_SELINUX CONFIG_SMALL_FLASH CONFIG_SECCOMP
+check-dynamic-def-pkg: FORCE
+       @+DEF_PKG_CONFS=""; \
+       if [ -f $(TOPDIR)/.config ]; then \
+               for config in $(DYNAMIC_DEF_PKG_CONF); do \
+                       DEF_PKG_CONFS="$$DEF_PKG_CONFS "$$(grep "$$config"=y $(TOPDIR)/.config); \
+               done; \
+       fi; \
+       [ ! -f tmp/.packagedynamicdefault ] || OLD_DEF_PKG_CONFS=$$(cat tmp/.packagedynamicdefault); \
+       [ "$$DEF_PKG_CONFS" = "$$OLD_DEF_PKG_CONFS" ] || rm -rf tmp/info/.targetinfo*; \
+       echo "$$DEF_PKG_CONFS" > tmp/.packagedynamicdefault;
+
+prepare-tmpinfo: check-dynamic-def-pkg FORCE
        @+$(MAKE) -r -s $(STAGING_DIR_HOST)/.prereq-build $(PREP_MK)
        mkdir -p tmp/info feeds
        [ -e $(TOPDIR)/feeds/base ] || ln -sf $(TOPDIR)/package $(TOPDIR)/feeds/base