genode/tool/depot/mk/dependencies.inc
Norman Feske 1b96d01690 tool/depot: allow versioned entries in used_apis
Normally, the APIs listed in 'used_apis' files do not carry a version
but implictly refer to the current version. This patch allows for
specifiying an concrete version. This is a useful feature in the context
of the Goa tool.
2022-05-25 12:22:10 +02:00

130 lines
4.4 KiB
PHP

#
# \brief Dependency-resolution functions
# \author Norman Feske
# \date 2017-03-22
#
# The following accessor functions must be defined when including this file:
#
# api_file return path to 'api' file of a library source archive
# used_apis_file return path to 'used_apis' file for a source archive
# pkg_src_archives return source archives of a package
# pkg_raw_archives return raw-data archives of a package
# pkg_pkg_archives return package-archive dependencies of a package
#
#
# Extend ARCHIVES(pkg) with package dependencies
#
_pkg_archives = $(call pkg_pkg_archives,$1)
_check_unvisited = $(if $(filter $(VISITED_PKGS),$1),\
$(error recursive package dependency: $(VISITED_PKGS)),\
$(eval VISITED_PKGS += $1))
_pkg_deps_rec = $(call _check_unvisited,$1) $1 \
$(foreach PKG,$(call _pkg_archives,$1),\
$(call _pkg_deps_rec,$(PKG)))
_pkg_deps = $(foreach PKG,$1,\
$(eval VISITED_PKGS :=) $(call _pkg_deps_rec,$(PKG)))
ARCHIVES(pkg) := $(sort ${ARCHIVES(pkg)} $(call _pkg_deps,${ARCHIVES(pkg)}))
#
# Extend ARCHIVES(binpkg) with binary-package dependencies
#
# return list of source archives needed by a given binary package
_binpkg_src_archives = $(call pkg_src_archives,$(call pkg_of_binpkg,$1))
# return list of package archives contained in a binary package
_binpkg_pkg_archives = $(foreach P,$(call pkg_pkg_archives,$(call pkg_of_binpkg,$1)),\
$(call binpkg_for_pkg,$(call bin_archive_spec,$1),$P))
# override behavior of '_pkg_archives' to work on binary packages
_pkg_archives = $(call _binpkg_pkg_archives,$1)
ARCHIVES(binpkg) := $(sort ${ARCHIVES(binpkg)} $(call _pkg_deps,${ARCHIVES(binpkg)}))
#
# Extend ARCHIVES(pkg) with binary-package dependencies
#
ARCHIVES(pkg) := $(sort ${ARCHIVES(pkg)} $(foreach P,${ARCHIVES(binpkg)},\
$(call pkg_of_binpkg,$P)))
#
# Extend ARCHIVES(bin) with binary-package dependencies
#
# return non-empty result if source archive exists
_src_exists = $(wildcard $(dir $(call used_apis_file,$1)))
# return binary-archive path for architecture $1 and source archive $2
_bin_for_src = $(strip \
$(if $(call _src_exists,$2),\
$(call archive_user,$2)/bin/$1/$(call archive_recipe,$2)/$(call archive_version,$2)))
# return list of binary archives contained in a binary package
_binpkg_bin_archives = $(foreach S,$(call _binpkg_src_archives,$1),\
$(call _bin_for_src,$(call bin_archive_spec,$1),$S))
ARCHIVES(bin) := $(sort ${ARCHIVES(bin)} $(foreach P,${ARCHIVES(binpkg)},\
$(call _binpkg_bin_archives,$P)))
#
# Extend ARCHIVES(src) with package dependencies
#
ARCHIVES(src) := $(sort ${ARCHIVES(src)} $(foreach P,${ARCHIVES(pkg)},\
$(call pkg_src_archives,$P)))
#
# Extend ARCHIVES(raw) with package dependencies
#
ARCHIVES(raw) := $(sort ${ARCHIVES(raw)} $(foreach P,${ARCHIVES(pkg)},\
$(call pkg_raw_archives,$P)))
#
# Extend ARCHIVES(src) with binary dependencies
#
ARCHIVES(src) := $(sort ${ARCHIVES(src)}\
$(foreach B,${ARCHIVES(bin)},\
$(call src_of_bin,$B)))
#
# Extend ARCHIVES(api) with the APIs used by ARCHIVES(src)
#
# The 'used_apis' file can contain fully specified entries or shortcuts.
# A fully specified entry has the form '<user>/api/<name>/version'.
# A shortcut has the form '<name>/version'. In this case, the '<user>' is
# implicitely equal to the depot user of the src archive.
#
_used_apis = $(call file_content,$(call used_apis_file,$1))
api_full_specified = $(call path_element,4,$1)
src_api_archives = $(foreach A,$(call _used_apis,$1),\
$(if $(call api_full_specified,$A),\
$A,$(addprefix $(call archive_user,$1)/api/,$A)))
ARCHIVES(api) := $(sort ${ARCHIVES(api)} $(foreach A,${ARCHIVES(src)},\
$(call src_api_archives,$A)))
#
# Extend ARCHIVES(api) with the APIs implemented by library ARCHIVES(src)
#
_lib_api = $(call file_content,$(call api_file,$1))
_lib_api_archive = $(addprefix $(call archive_user,$1)/api/,$(call _lib_api,$1))
ARCHIVES(api) := $(sort ${ARCHIVES(api)} $(foreach A,${ARCHIVES(src)},\
$(call _lib_api_archive,$A)))