$(call AddDependency,$(1),$$(DEPS))
endef
+# Format provide and add ABI and version if it's not a virtual provide marked
+# with an @.
+#
+# 1: provide name
+# 2: provide version
+# 3: (optional) ABI preformatted by FormatABISuffix
+define AddProvide
+$(if $(filter @%,$(1)),$(patsubst @%,%,$(1)),$(1)$(3)=$(2))
+endef
+
+# Remove virtual provides prefix and self. apk doesn't like it when packages
+# specify a redundant provide pointing to self.
+#
+# 1: package name
+# 2: list of provides
+define SanitizeProvides
+$(filter-out $(1),$(patsubst @%,%,$(2)))
+endef
+
# Format provides both for apk and control
#
# - If ABI version is defined:
# this implies that only one version of a provide can be installed at the
# same time
#
+# - Both with and without an ABI, if a provide starts with an @, treat it as a
+# virtual provide, that doesn't own the name by not appending version.
+# Multiple packages with the same virtual provides can be installed
+# side-by-side.
+#
+# - apk doesn't like it when packages specify a redundant provide pointing to
+# self. Filter it out, but keep virtual self provides, in the form of
+# @${package_name}-any.
+#
+# - Packages implicitly add a virtual @${package_name}-any provide in Package.
+#
# 1: package name
# 2: package version
# 3: list of provides
# 4: list of alternatives
define FormatProvides
$(strip $(if $(ABIV_$(1)), \
- $(1) $(foreach provide,$(3), $(provide)$(ABIV_$(1))=$(2)), \
+ $(1) $(foreach provide, \
+ $(filter-out $(1),$(3)), \
+ $(call AddProvide,$(provide),$(2),$(ABIV_$(1))) \
+ ), \
$(if $(4), \
- $(3), \
- $(foreach provide,$(3), $(provide)=$(2)) \
+ $(filter-out $(1),$(3)), \
+ $(foreach provide, \
+ $(filter-out $(1),$(3)), \
+ $(call AddProvide,$(provide),$(2)) \
+ ) \
) \
))
endef
$(if $(ABI_VERSION),echo '$(ABI_VERSION)' | cmp -s - $(PKG_INFO_DIR)/$(1).version || { \
mkdir -p $(PKG_INFO_DIR); \
echo '$(ABI_VERSION)' > $(PKG_INFO_DIR)/$(1).version; \
- $(foreach pkg,$(filter-out $(1),$(PROVIDES)), \
+ $(foreach pkg,$(call SanitizeProvides,$(1),$(PROVIDES)), \
cp $(PKG_INFO_DIR)/$(1).version $(PKG_INFO_DIR)/$(pkg).version; \
) \
} )
fi; \
done; $(Package/$(1)/extra_provides) \
) | sort -u > $(PKG_INFO_DIR)/$(1).provides
- $(if $(PROVIDES),@for pkg in $(filter-out $(1),$(PROVIDES)); do cp $(PKG_INFO_DIR)/$(1).provides $(PKG_INFO_DIR)/$$$$pkg.provides; done)
+ $(if $(PROVIDES),@for pkg in $(call SanitizeProvides,$(1),$(PROVIDES)); do cp $(PKG_INFO_DIR)/$(1).provides $(PKG_INFO_DIR)/$$$$pkg.provides; done)
$(CheckDependencies)
$(RSTRIP) $$(IDIR_$(1))