2020-09-22 02:48:37 +00:00
|
|
|
# SPDX-License-Identifier: GPL-2.0-only
|
2015-03-29 07:29:18 +00:00
|
|
|
#
|
2020-09-22 02:48:37 +00:00
|
|
|
# Copyright (C) 2006-2020 OpenWrt.org
|
2006-07-19 13:25:09 +00:00
|
|
|
|
2007-09-28 01:23:56 +00:00
|
|
|
ifneq ($(__prereq_inc),1)
|
|
|
|
__prereq_inc:=1
|
|
|
|
|
2006-07-19 13:25:09 +00:00
|
|
|
prereq:
|
2006-07-20 23:51:25 +00:00
|
|
|
if [ -f $(TMP_DIR)/.prereq-error ]; then \
|
2006-07-29 11:30:06 +00:00
|
|
|
echo; \
|
2006-07-19 13:25:09 +00:00
|
|
|
cat $(TMP_DIR)/.prereq-error; \
|
2006-11-11 23:11:02 +00:00
|
|
|
rm -f $(TMP_DIR)/.prereq-error; \
|
2006-07-19 13:25:09 +00:00
|
|
|
echo; \
|
|
|
|
false; \
|
|
|
|
fi
|
2006-07-20 23:51:25 +00:00
|
|
|
|
2006-11-11 23:11:02 +00:00
|
|
|
.SILENT: prereq
|
2007-09-28 01:23:56 +00:00
|
|
|
endif
|
2006-07-19 13:25:09 +00:00
|
|
|
|
2015-02-05 16:57:02 +00:00
|
|
|
PREREQ_PREV=
|
|
|
|
|
|
|
|
# 1: display name
|
|
|
|
# 2: error message
|
2006-07-19 13:25:09 +00:00
|
|
|
define Require
|
2006-10-05 12:39:52 +00:00
|
|
|
export PREREQ_CHECK=1
|
2006-07-19 13:25:09 +00:00
|
|
|
ifeq ($$(CHECK_$(1)),)
|
|
|
|
prereq: prereq-$(1)
|
|
|
|
|
2015-02-05 16:57:02 +00:00
|
|
|
prereq-$(1): $(if $(PREREQ_PREV),prereq-$(PREREQ_PREV)) FORCE
|
2015-02-07 10:07:05 +00:00
|
|
|
printf "Checking '$(1)'... "
|
2023-05-25 06:31:52 +00:00
|
|
|
if $(NO_TRACE_MAKE) -f $(firstword $(MAKEFILE_LIST)) check-$(1) PATH="$(ORIG_PATH)" >/dev/null 2>/dev/null; then \
|
2006-07-19 13:25:09 +00:00
|
|
|
echo 'ok.'; \
|
2023-05-25 06:31:52 +00:00
|
|
|
elif $(NO_TRACE_MAKE) -f $(firstword $(MAKEFILE_LIST)) check-$(1) PATH="$(ORIG_PATH)" >/dev/null 2>/dev/null; then \
|
prereq-build: allow host command symlinks to update
This makes the prereq stage update the symlinks
installed into staging_dir/host/bin
by rearrainging the way they are verified.
Before, seeing or installing a symlink would result in
a successful exit code, and not installing a symlink
would result is a failed exit code. However,
that is not able to account for the difference
between existing good and bad links, or whether
the link would be the same if it was reinstalled,
because the check can match the program to a different path.
Instead, let a success exit code represent
identifying an existing symlink as exactly the same
as what would be installed if it did not exist,
and let a fail exit code represent
needing to install the symlink
or not having a match to the check criteria.
The failing exit code is caught by a new second attempt
for all of the check-* targets which will then indicate
to the user that there was an update by having a success
exit code when the check is run again and the link is the same.
When there is nothing to update, the checks will run only once.
This relies on the ls command to be POSIX-conformant with long format:
"path/to/link -> target/of/link"
Also, make sure the symlink is executable, not just a file,
and the directory only needs to be created once.
Fixes: #12610
Signed-off-by: Michael Pratt <mcpratt@pm.me>
(cherry picked from commit f75204036ccc56700df18258602cc65726dd653b)
2022-05-22 10:10:56 +00:00
|
|
|
echo 'updated.'; \
|
2006-07-19 13:25:09 +00:00
|
|
|
else \
|
|
|
|
echo 'failed.'; \
|
2015-02-07 10:07:05 +00:00
|
|
|
echo "$(PKG_NAME): $(strip $(2))" >> $(TMP_DIR)/.prereq-error; \
|
2006-07-19 13:25:09 +00:00
|
|
|
fi
|
|
|
|
|
|
|
|
check-$(1): FORCE
|
|
|
|
$(call Require/$(1))
|
|
|
|
CHECK_$(1):=1
|
2006-07-20 23:51:25 +00:00
|
|
|
|
|
|
|
.SILENT: prereq-$(1) check-$(1)
|
2014-10-12 15:00:41 +00:00
|
|
|
.NOTPARALLEL:
|
2006-07-19 13:25:09 +00:00
|
|
|
endif
|
2015-02-05 16:57:02 +00:00
|
|
|
|
|
|
|
PREREQ_PREV=$(1)
|
2006-07-19 13:25:09 +00:00
|
|
|
endef
|
|
|
|
|
|
|
|
|
|
|
|
define RequireCommand
|
|
|
|
define Require/$(1)
|
2021-11-25 01:12:58 +00:00
|
|
|
command -v $(1)
|
2006-07-19 13:25:09 +00:00
|
|
|
endef
|
|
|
|
|
|
|
|
$$(eval $$(call Require,$(1),$(2)))
|
|
|
|
endef
|
|
|
|
|
2007-08-12 11:53:23 +00:00
|
|
|
define RequireHeader
|
|
|
|
define Require/$(1)
|
|
|
|
[ -e "$(1)" ]
|
|
|
|
endef
|
2015-03-29 07:29:18 +00:00
|
|
|
|
2007-08-12 11:53:23 +00:00
|
|
|
$$(eval $$(call Require,$(1),$(2)))
|
|
|
|
endef
|
|
|
|
|
2023-01-09 13:23:23 +00:00
|
|
|
# 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
|
|
|
|
|
2015-02-05 16:57:02 +00:00
|
|
|
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)
|
prereq-build: allow host command symlinks to update
This makes the prereq stage update the symlinks
installed into staging_dir/host/bin
by rearrainging the way they are verified.
Before, seeing or installing a symlink would result in
a successful exit code, and not installing a symlink
would result is a failed exit code. However,
that is not able to account for the difference
between existing good and bad links, or whether
the link would be the same if it was reinstalled,
because the check can match the program to a different path.
Instead, let a success exit code represent
identifying an existing symlink as exactly the same
as what would be installed if it did not exist,
and let a fail exit code represent
needing to install the symlink
or not having a match to the check criteria.
The failing exit code is caught by a new second attempt
for all of the check-* targets which will then indicate
to the user that there was an update by having a success
exit code when the check is run again and the link is the same.
When there is nothing to update, the checks will run only once.
This relies on the ls command to be POSIX-conformant with long format:
"path/to/link -> target/of/link"
Also, make sure the symlink is executable, not just a file,
and the directory only needs to be created once.
Fixes: #12610
Signed-off-by: Michael Pratt <mcpratt@pm.me>
(cherry picked from commit f75204036ccc56700df18258602cc65726dd653b)
2022-05-22 10:10:56 +00:00
|
|
|
mkdir -p "$(STAGING_DIR_HOST)/bin"; \
|
2015-02-05 16:57:02 +00:00
|
|
|
for cmd in $(call QuoteHostCommand,$(3)) $(call QuoteHostCommand,$(4)) \
|
|
|
|
$(call QuoteHostCommand,$(5)) $(call QuoteHostCommand,$(6)) \
|
2015-02-07 10:07:31 +00:00
|
|
|
$(call QuoteHostCommand,$(7)) $(call QuoteHostCommand,$(8)) \
|
2018-04-05 11:54:41 +00:00
|
|
|
$(call QuoteHostCommand,$(9)) $(call QuoteHostCommand,$(10)) \
|
|
|
|
$(call QuoteHostCommand,$(11)) $(call QuoteHostCommand,$(12)); do \
|
2015-02-05 16:57:02 +00:00
|
|
|
if [ -n "$$$$$$$$cmd" ]; then \
|
2023-05-25 06:31:52 +00:00
|
|
|
bin="$$$$$$$$(command -v "$$$$$$$${cmd%% *}")"; \
|
2015-02-05 16:57:02 +00:00
|
|
|
if [ -x "$$$$$$$$bin" ] && eval "$$$$$$$$cmd" >/dev/null 2>/dev/null; then \
|
prereq-build: allow host command symlinks to update
This makes the prereq stage update the symlinks
installed into staging_dir/host/bin
by rearrainging the way they are verified.
Before, seeing or installing a symlink would result in
a successful exit code, and not installing a symlink
would result is a failed exit code. However,
that is not able to account for the difference
between existing good and bad links, or whether
the link would be the same if it was reinstalled,
because the check can match the program to a different path.
Instead, let a success exit code represent
identifying an existing symlink as exactly the same
as what would be installed if it did not exist,
and let a fail exit code represent
needing to install the symlink
or not having a match to the check criteria.
The failing exit code is caught by a new second attempt
for all of the check-* targets which will then indicate
to the user that there was an update by having a success
exit code when the check is run again and the link is the same.
When there is nothing to update, the checks will run only once.
This relies on the ls command to be POSIX-conformant with long format:
"path/to/link -> target/of/link"
Also, make sure the symlink is executable, not just a file,
and the directory only needs to be created once.
Fixes: #12610
Signed-off-by: Michael Pratt <mcpratt@pm.me>
(cherry picked from commit f75204036ccc56700df18258602cc65726dd653b)
2022-05-22 10:10:56 +00:00
|
|
|
case "$$$$$$$$(ls -dl -- $(STAGING_DIR_HOST)/bin/$(strip $(1)))" in \
|
|
|
|
*" -> $$$$$$$$bin"*) \
|
|
|
|
[ -x "$(STAGING_DIR_HOST)/bin/$(strip $(1))" ] && exit 0 \
|
|
|
|
;; \
|
2023-05-27 21:11:47 +00:00
|
|
|
"-"*) \
|
|
|
|
find "$(STAGING_DIR_HOST)/stamp" | grep $(strip $(1)) && \
|
|
|
|
[ -x "$(STAGING_DIR_HOST)/bin/$(strip $(1))" ] && exit 0 \
|
|
|
|
;; \
|
2023-05-29 09:38:33 +00:00
|
|
|
*" -> /"*) \
|
|
|
|
;; \
|
|
|
|
*" -> "*) \
|
|
|
|
[ -x "$(STAGING_DIR_HOST)/bin/$(strip $(1))" ] && exit 0 \
|
|
|
|
;; \
|
prereq-build: allow host command symlinks to update
This makes the prereq stage update the symlinks
installed into staging_dir/host/bin
by rearrainging the way they are verified.
Before, seeing or installing a symlink would result in
a successful exit code, and not installing a symlink
would result is a failed exit code. However,
that is not able to account for the difference
between existing good and bad links, or whether
the link would be the same if it was reinstalled,
because the check can match the program to a different path.
Instead, let a success exit code represent
identifying an existing symlink as exactly the same
as what would be installed if it did not exist,
and let a fail exit code represent
needing to install the symlink
or not having a match to the check criteria.
The failing exit code is caught by a new second attempt
for all of the check-* targets which will then indicate
to the user that there was an update by having a success
exit code when the check is run again and the link is the same.
When there is nothing to update, the checks will run only once.
This relies on the ls command to be POSIX-conformant with long format:
"path/to/link -> target/of/link"
Also, make sure the symlink is executable, not just a file,
and the directory only needs to be created once.
Fixes: #12610
Signed-off-by: Michael Pratt <mcpratt@pm.me>
(cherry picked from commit f75204036ccc56700df18258602cc65726dd653b)
2022-05-22 10:10:56 +00:00
|
|
|
esac; \
|
2015-02-05 16:57:02 +00:00
|
|
|
ln -sf "$$$$$$$$bin" "$(STAGING_DIR_HOST)/bin/$(strip $(1))"; \
|
2023-05-23 12:17:47 +00:00
|
|
|
exit 0; \
|
2015-02-05 16:57:02 +00:00
|
|
|
fi; \
|
|
|
|
fi; \
|
|
|
|
done; \
|
|
|
|
exit 1
|
|
|
|
endef
|
|
|
|
|
|
|
|
$$(eval $$(call Require,$(1),$(if $(2),$(2),Missing $(1) command)))
|
|
|
|
endef
|