# - package implicitly provides `${package_name}=${package_version}`
# this implies that only one version of a package can be installed at the
# same time
-# - if `alternatives` is defined
-# - for each `provides`, provide `${provide}`
-# this implies that multiple versions of a provide can be installed at the
-# same time
-# - else if `alternatives` is _not_ defined
-# - for each `provides`, provide `${provide}=${package_version}`
-# this implies that only one version of a provide can be installed at the
-# same time
+# - for each `provides`, provide `${provide}=${package_version}` 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.
# - kmods implicitly add a virtual @kmod-${package_name}-any provide in
# KernelPackage.
#
+# - Aside from the two aforementioned implicit provides, packages are expected
+# to manage their provides themselves.
+#
+# - When multiple variants inside the same package have the same provide, a
+# default variant must be set using DEFAULT_VARIANT:=1.
+#
+# - Cross-package provides must be virtual and a default variant must be set. If
+# different packages provide the same versioned (i.e. non-virtual) provide the
+# package with a higher version will be preferred, which results in unintended
+# behavior, because the order might change with package updates.
+#
+# Example:
+# - both uclient-fetch and wget provide wget
+# - wget doesn't have a default variant called wget that would provide an
+# implicit @wget-any
+# - add wget to PROVIDES for both wget-ssl and wget-nossl variants so they
+# can't be installed at the same time
+# - add @wget-any to both packages so packages outside of wget can provide
+# it
+# - uclient-fetch has only one variant
+# - add @wget-any to PROVIDES
+# - mark uclient-fetch as the default variant using DEFAULT_VARIANT:=1
+# - switch wget consumer that don't depend on a specific version like apk to
+# depend on @wget-any
+#
+# - Alternatives don't affect the packaging.
+#
# 1: package name
# 2: package version
# 3: list of provides
-# 4: list of alternatives
define FormatProvides
-$(strip $(if $(ABIV_$(1)), \
- $(1) $(foreach provide, \
- $(filter-out $(1),$(3)), \
- $(call AddProvide,$(provide),$(2),$(ABIV_$(1))) \
- ), \
- $(if $(4), \
- $(filter-out $(1),$(3)), \
- $(foreach provide, \
- $(filter-out $(1),$(3)), \
- $(call AddProvide,$(provide),$(2)) \
- ) \
- ) \
-))
+$(strip
+ $(if $(ABIV_$(1)),
+ $(1) $(foreach provide,
+ $(filter-out $(1),$(3)),
+ $(call AddProvide,$(provide),$(2),$(ABIV_$(1)))
+ ),
+ $(foreach provide,
+ $(filter-out $(1),$(3)),
+ $(call AddProvide,$(provide),$(2))
+ )
+ )
+)
endef
ifneq ($(PKG_NAME),toolchain)
Package/$(1)/PROVIDES := $$(patsubst @%,%,$(PROVIDES))
Package/$(1)/PROVIDES := $$(filter-out $(1)$$(ABIV_$(1)),$$(Package/$(1)/PROVIDES)$$(if $$(ABIV_$(1)), $(1) $$(foreach provide,$$(Package/$(1)/PROVIDES),$$(provide)$$(ABIV_$(1)))))
else
- Package/$(1)/PROVIDES := $$(call FormatProvides,$(1),$(VERSION),$(PROVIDES),$(ALTERNATIVES))
+ Package/$(1)/PROVIDES := $$(call FormatProvides,$(1),$(VERSION),$(PROVIDES))
endif
$(_define) Package/$(1)/CONTROL