3210aa8e0a
Now that most cases do the same thing in SetupHostCommand, merge them together into one. To allow moving the generic symlink check, invert the check and let it check for relative links by matching on link targets that do not start with a slash. This then allows us to also drop the absolute link case, shortening the case statement further. This reorders the check to * if it is not a symlink, do not change it * if it is a symlink and it points to the found command, do not change it * if it is a symlink with a relative path, do not change it * else, update/replace it Signed-off-by: Jonas Gorski <jonas.gorski@gmail.com>
126 lines
2.9 KiB
Makefile
126 lines
2.9 KiB
Makefile
# SPDX-License-Identifier: GPL-2.0-only
|
|
#
|
|
# Copyright (C) 2006-2020 OpenWrt.org
|
|
|
|
ifneq ($(__prereq_inc),1)
|
|
__prereq_inc:=1
|
|
|
|
prereq:
|
|
if [ -f $(TMP_DIR)/.prereq-error ]; then \
|
|
echo; \
|
|
cat $(TMP_DIR)/.prereq-error; \
|
|
rm -f $(TMP_DIR)/.prereq-error; \
|
|
echo; \
|
|
false; \
|
|
fi
|
|
|
|
.SILENT: prereq
|
|
endif
|
|
|
|
PREREQ_PREV=
|
|
|
|
# 1: display name
|
|
# 2: error message
|
|
define Require
|
|
export PREREQ_CHECK=1
|
|
ifeq ($$(CHECK_$(1)),)
|
|
prereq: prereq-$(1)
|
|
|
|
prereq-$(1): $(if $(PREREQ_PREV),prereq-$(PREREQ_PREV)) FORCE
|
|
printf "Checking '$(1)'... "
|
|
if $(NO_TRACE_MAKE) -f $(firstword $(MAKEFILE_LIST)) check-$(1) PATH="$(ORIG_PATH)" >/dev/null 2>/dev/null; then \
|
|
echo 'ok.'; \
|
|
elif $(NO_TRACE_MAKE) -f $(firstword $(MAKEFILE_LIST)) check-$(1) PATH="$(ORIG_PATH)" >/dev/null 2>/dev/null; then \
|
|
echo 'updated.'; \
|
|
else \
|
|
echo 'failed.'; \
|
|
echo "$(PKG_NAME): $(strip $(2))" >> $(TMP_DIR)/.prereq-error; \
|
|
fi
|
|
|
|
check-$(1): FORCE
|
|
$(call Require/$(1))
|
|
CHECK_$(1):=1
|
|
|
|
.SILENT: prereq-$(1) check-$(1)
|
|
.NOTPARALLEL:
|
|
endif
|
|
|
|
PREREQ_PREV=$(1)
|
|
endef
|
|
|
|
|
|
define RequireCommand
|
|
define Require/$(1)
|
|
command -v $(1)
|
|
endef
|
|
|
|
$$(eval $$(call Require,$(1),$(2)))
|
|
endef
|
|
|
|
define RequireHeader
|
|
define Require/$(1)
|
|
[ -e "$(1)" ]
|
|
endef
|
|
|
|
$$(eval $$(call Require,$(1),$(2)))
|
|
endef
|
|
|
|
# 1: header to test
|
|
# 2: failure message
|
|
# 3: optional compile time test
|
|
# 4: optional link library test (example -lncurses)
|
|
define RequireCHeader
|
|
define Require/$(1)
|
|
echo 'int main(int argc, char **argv) { $(3); return 0; }' | gcc -include $(1) -x c -o $(TMP_DIR)/a.out - $(4)
|
|
endef
|
|
|
|
$$(eval $$(call Require,$(1),$(2)))
|
|
endef
|
|
|
|
define QuoteHostCommand
|
|
'$(subst ','"'"',$(strip $(1)))'
|
|
endef
|
|
|
|
# 1: display name
|
|
# 2: failure message
|
|
# 3: test
|
|
define TestHostCommand
|
|
define Require/$(1)
|
|
($(3)) >/dev/null 2>/dev/null
|
|
endef
|
|
|
|
$$(eval $$(call Require,$(1),$(2)))
|
|
endef
|
|
|
|
# 1: canonical name
|
|
# 2: failure message
|
|
# 3+: candidates
|
|
define SetupHostCommand
|
|
define Require/$(1)
|
|
mkdir -p "$(STAGING_DIR_HOST)/bin"; \
|
|
for cmd in $(call QuoteHostCommand,$(3)) $(call QuoteHostCommand,$(4)) \
|
|
$(call QuoteHostCommand,$(5)) $(call QuoteHostCommand,$(6)) \
|
|
$(call QuoteHostCommand,$(7)) $(call QuoteHostCommand,$(8)) \
|
|
$(call QuoteHostCommand,$(9)) $(call QuoteHostCommand,$(10)) \
|
|
$(call QuoteHostCommand,$(11)) $(call QuoteHostCommand,$(12)); do \
|
|
if [ -n "$$$$$$$$cmd" ]; then \
|
|
bin="$$$$$$$$(command -v "$$$$$$$${cmd%% *}")"; \
|
|
if [ -x "$$$$$$$$bin" ] && eval "$$$$$$$$cmd" >/dev/null 2>/dev/null; then \
|
|
case "$$$$$$$$(ls -dl -- $(STAGING_DIR_HOST)/bin/$(strip $(1)))" in \
|
|
"-"* | \
|
|
*" -> $$$$$$$$bin"* | \
|
|
*" -> "[!/]*) \
|
|
[ -x "$(STAGING_DIR_HOST)/bin/$(strip $(1))" ] && exit 0 \
|
|
;; \
|
|
esac; \
|
|
ln -sf "$$$$$$$$bin" "$(STAGING_DIR_HOST)/bin/$(strip $(1))"; \
|
|
exit 1; \
|
|
fi; \
|
|
fi; \
|
|
done; \
|
|
exit 1
|
|
endef
|
|
|
|
$$(eval $$(call Require,$(1),$(if $(2),$(2),Missing $(1) command)))
|
|
endef
|