mirror of
https://github.com/genodelabs/genode.git
synced 2024-12-28 17:48:53 +00:00
139a2cfae9
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
124 lines
5.0 KiB
PHP
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);
|