build: allow packages to declare ABI versions to detect necessary package rebuilds
authorFelix Fietkau <nbd@openwrt.org>
Sun, 23 Feb 2014 17:32:04 +0000 (17:32 +0000)
committerFelix Fietkau <nbd@openwrt.org>
Sun, 23 Feb 2014 17:32:04 +0000 (17:32 +0000)
If a package directly depends on another package that recently changed
its ABI version, it will be cleaned up and rebuilt (assuming quilt is
not used).

This helps with packages that have no stable ABI, e.g. libubox, ubus,
etc.

Signed-off-by: Felix Fietkau <nbd@openwrt.org>
SVN-Revision: 39720

include/package-defaults.mk
include/package-ipkg.mk
include/package.mk

index 0505a43c4fdc4a508891121c30aea25d7498d6db..62ccbb93ef0a8c2f65e7f47855142919f6d5de9b 100644 (file)
@@ -32,6 +32,7 @@ define Package/Default
   else
     VERSION:=$(PKG_RELEASE)
   endif
   else
     VERSION:=$(PKG_RELEASE)
   endif
+  ABI_VERSION:=
   ifneq ($(PKG_FLAGS),)
     PKGFLAGS:=$(PKG_FLAGS)
   else
   ifneq ($(PKG_FLAGS),)
     PKGFLAGS:=$(PKG_FLAGS)
   else
index 043431c349c73a497e62274d4acb799ec632f902..cb2a4087fe32b4f2c941c2bee4c16d1dc56806b2 100644 (file)
@@ -83,6 +83,9 @@ ifeq ($(DUMP),)
       ifneq ($(CONFIG_PACKAGE_$(1))$(SDK)$(DEVELOPER),)
         IPKGS += $(1)
         compile: $$(IPKG_$(1)) $(PKG_INFO_DIR)/$(1).provides $(STAGING_DIR_ROOT)/stamp/.$(1)_installed
       ifneq ($(CONFIG_PACKAGE_$(1))$(SDK)$(DEVELOPER),)
         IPKGS += $(1)
         compile: $$(IPKG_$(1)) $(PKG_INFO_DIR)/$(1).provides $(STAGING_DIR_ROOT)/stamp/.$(1)_installed
+        ifneq ($(ABI_VERSION),)
+        compile: $(PKG_INFO_DIR)/$(1).version
+        endif
 
         ifeq ($(CONFIG_PACKAGE_$(1)),y)
           .PHONY: $(PKG_INSTALL_STAMP).$(1)
 
         ifeq ($(CONFIG_PACKAGE_$(1)),y)
           .PHONY: $(PKG_INSTALL_STAMP).$(1)
@@ -124,6 +127,10 @@ ifeq ($(DUMP),)
        rm -rf $(STAGING_DIR_ROOT)/tmp-$(1)
        touch $$@
 
        rm -rf $(STAGING_DIR_ROOT)/tmp-$(1)
        touch $$@
 
+    $(PKG_INFO_DIR)/$(1).version: $$(IPKG_$(1))
+       echo '$(ABI_VERSION)' | cmp -s - $$@ || \
+               echo '$(ABI_VERSION)' > $$@
+
     $(PKG_INFO_DIR)/$(1).provides: $$(IPKG_$(1))
     $$(IPKG_$(1)): $(STAMP_BUILT) $(INCLUDE_DIR)/package-ipkg.mk
        @rm -rf $(PACKAGE_DIR)/$(1)_* $$(IDIR_$(1))
     $(PKG_INFO_DIR)/$(1).provides: $$(IPKG_$(1))
     $$(IPKG_$(1)): $(STAMP_BUILT) $(INCLUDE_DIR)/package-ipkg.mk
        @rm -rf $(PACKAGE_DIR)/$(1)_* $$(IDIR_$(1))
index 79066fe1e2833c7335d812c7101da3d1734b167a..d14c525506b0e13230812a8c1a0185299b8ded57 100644 (file)
@@ -39,6 +39,15 @@ include $(INCLUDE_DIR)/host.mk
 include $(INCLUDE_DIR)/unpack.mk
 include $(INCLUDE_DIR)/depends.mk
 
 include $(INCLUDE_DIR)/unpack.mk
 include $(INCLUDE_DIR)/depends.mk
 
+find_library_dependencies = $(wildcard $(patsubst %,$(STAGING_DIR)/pkginfo/%.version, \
+       $(filter-out $(BUILD_PACKAGES),$(foreach dep, \
+               $(filter-out @%, $(patsubst +%,%,$(1))), \
+               $(if $(findstring :,$(dep)), \
+                       $(word 2,$(subst :,$(space),$(dep))), \
+                       $(dep) \
+               ) \
+       ))))
+
 STAMP_NO_AUTOREBUILD=$(wildcard $(PKG_BUILD_DIR)/.no_autorebuild)
 PREV_STAMP_PREPARED:=$(if $(STAMP_NO_AUTOREBUILD),$(wildcard $(PKG_BUILD_DIR)/.prepared*))
 ifneq ($(PREV_STAMP_PREPARED),)
 STAMP_NO_AUTOREBUILD=$(wildcard $(PKG_BUILD_DIR)/.no_autorebuild)
 PREV_STAMP_PREPARED:=$(if $(STAMP_NO_AUTOREBUILD),$(wildcard $(PKG_BUILD_DIR)/.prepared*))
 ifneq ($(PREV_STAMP_PREPARED),)
@@ -227,6 +236,9 @@ define Package/$(1)/description
 endef
 endif
 
 endef
 endif
 
+  BUILD_PACKAGES += $(1)
+  $(STAMP_PREPARED): $$(if $(QUILT)$(DUMP),,$(call find_library_dependencies,$(DEPENDS)))
+
   $(foreach FIELD, TITLE CATEGORY SECTION VERSION,
     ifeq ($($(FIELD)),)
       $$(error Package/$(1) is missing the $(FIELD) field)
   $(foreach FIELD, TITLE CATEGORY SECTION VERSION,
     ifeq ($($(FIELD)),)
       $$(error Package/$(1) is missing the $(FIELD) field)