genode/tool/depot/mk/extract_post_dependencies.inc
Martin Stein 139a2cfae9 tool: use local LC_ALL=C instead of LC_COLLATE=C
We used to export 'LC_COLLATE=C' for the environment of Genode tools. This was
meant to ensure that sorting is always done C-style and not dependent on the
users locale settings. This is required, for instance, to ensure that the same
archive always yields the same hash.

However, 'export LC_COLLATE=C' is not sufficient. It can be outruled by an
'LC_ALL' setting in the users environment. The manual of 'sort' recommends to
set 'LC_ALL=C' locally if you want reliable results and this is what this
commit does. Furthermore it removes the former 'export LC_COLLATE=C'
directives.

Note that I couldn't find a way to set 'LC_ALL' local to 'exec ... sort' in
TCL. This is why I set it global instead using TCLs 'env' array.

Note that the Make directive '$(sort ...)' and the TCL directive 'lsort',
unlike the Shell directive 'sort', are not affected by the users locale
settings.

Fixes #4144
2021-05-28 14:15:26 +02:00

124 lines
5.0 KiB
PHP

#
# Obtain version information from recipes
#
# The 'archive_curr_version' function takes the archive type and name as
# arguments and returns the version identifier as present in the corresponding
# recipe. The nested foreach loop populates 'ARCHIVE_VERSION' with the version
# identifier for each archive.
#
# If an archive is given with a complete (versioned) name, we don't need to
# consult any recipe but only check if the corresponding archive exists within
# the depot. For binary archives, it suffices that the corresponding source
# archive is present.
#
$(foreach TYPE,api src raw pkg,\
$(foreach PATH,${ARCHIVES(${TYPE})},\
$(eval ARCHIVE_VERSION(${PATH}) := $(call archive_curr_version,$(PATH)))))
archive_exists_in_depot = $(wildcard $(DEPOT_DIR)/$1)
ARCHIVES_WITH_NO_VERSION := $(sort \
$(foreach TYPE,api src raw pkg,\
$(foreach A,${ARCHIVES(${TYPE})},\
$(if $(call archive_exists_in_depot,$A),,\
$(if ${ARCHIVE_VERSION($A)},,$A)))))
checked_versions_defined:
ifneq ($(ARCHIVES_WITH_NO_VERSION),)
@echo "Error: incomplete or missing recipe ($(sort $(ARCHIVES_WITH_NO_VERSION)))"; false
endif
#
# Read content of a file as list, sort it and remove duplicates
#
# \param $1 absolute file path
#
sorted_file_content = $(if $(wildcard $1),$(shell cat $1 | $(SORT) -u),\
$(error Failed to read file $1))
#
# Absolute path to content.mk file for given archive
#
# \param $1 archive type, can be 'src', 'api' or 'raw'
# \param $2 api, src or raw archive name in the form 'genodelabs/api/base'
#
content_mk_file = $(addsuffix /content.mk,$(call recipe_dir,$1/$(call archive_recipe,$2)))
#
# Return a given string minus another given string
#
# \param $1 string that shall be returned minus the other one
# \param $2 string that shall be removed from the other one
#
remove_from_string=$(1:$2=)
#
# Repository directory for a given recipe name
#
# \param $1 recipe type in the form 'api'
# \param $2 recipe name in the form 'base'
#
rep_dir_of_recipe=$(call remove_from_string,$(call recipe_dir,$1/$2),/recipes/$1/$2)
#
# Repository directory for a given archive
#
# \param $1 archive type in the form 'api'
# \param $2 archive name in the form 'genodelabs/api/base'
#
rep_dir_of_archive=$(call rep_dir_of_recipe,$1,$(call archive_recipe,$2))
# path to temporary file that is used to buffer the names of missing ports
MISSING_PORTS_FILE := $(DEPOT_DIR)/var/missing_ports
# path to temporary make file that is created to fill the missing-ports file
GEN_MISSING_PORTS_MK := $(DEPOT_DIR)/var/gen_missing_ports.mk
# wether to invoke sub-makes with '--quiet'
QUIET = $(if $(VERBOSE),--quiet)
#
# Invoke sub-make to create or update missing-ports file
#
update_missing_ports_file: checked_versions_defined checked_no_uncategorized
$(VERBOSE)mkdir -p $(dir $(GEN_MISSING_PORTS_MK))
$(VERBOSE)( echo -e "all:\n"; \
echo -e "MAKE := $(MAKE)\n"; \
$(foreach TYPE,api src raw pkg,\
$(foreach A,${ARCHIVES(${TYPE})},\
target=$(call versioned_archive,$A); \
content_mk=$(call content_mk_file,$(TYPE),$A); \
rep_dir=$(call rep_dir_of_archive,$(TYPE),$A); \
echo "ARCHIVES(${TYPE}) += $$target"; \
echo "CONTENT_MK($$target) := $$content_mk"; \
echo "REP_DIR($$target) := $$rep_dir"; \
) ) \
echo -e ""; \
$(foreach A,${ARCHIVES(pkg)},\
$(foreach DEP,$(call pkg_pkg_archives,$A),\
echo -e "$(call versioned_archive,$A) :" \
"$(call versioned_archive,$(DEP))";)) \
echo -e ""; \
echo -e "\$${ARCHIVES(src)} : \$${ARCHIVES(api)}"; \
echo -e "\$${ARCHIVES(pkg)} : \$${ARCHIVES(api)}"; \
echo -e "\$${ARCHIVES(pkg)} : \$${ARCHIVES(src)}"; \
echo -e "\$${ARCHIVES(pkg)} : \$${ARCHIVES(raw)}"; \
echo -e "\nTARGETS := \$$(foreach T,api src raw,\$${ARCHIVES(\$$T)})"; \
echo -e "\nall: \$$(TARGETS)"; \
echo -e "\n\$$(TARGETS):"; \
echo -e "\t$(VERBOSE)\$$(MAKE) \\"; \
echo -e "\t $(QUIET) \\"; \
echo -e "\t -f $(GENODE_DIR)/tool/depot/mk/content_env_missing_ports.mk \\"; \
echo -e "\t GENODE_DIR=$(GENODE_DIR) \\"; \
echo -e "\t CONTRIB_DIR=$(GENODE_DIR)/contrib \\"; \
echo -e "\t CONTENT_MK=\$${CONTENT_MK(\$$@)} \\"; \
echo -e "\t REP_DIR=\$${REP_DIR(\$$@)} \\"; \
echo -e "\t MISSING_PORTS_FILE=$(MISSING_PORTS_FILE) \\"; \
echo -e "\t VERBOSE=$(VERBOSE)"; \
) > $(GEN_MISSING_PORTS_MK)
$(VERBOSE)mkdir -p $(dir $(MISSING_PORTS_FILE))
$(VERBOSE)rm -f $(MISSING_PORTS_FILE)
$(VERBOSE)touch $(MISSING_PORTS_FILE)
$(VERBOSE)$(MAKE) $(QUIET) -C $(DEPOT_DIR) -f $(GEN_MISSING_PORTS_MK);