У меня есть правило, которое создает файл, а другое - копирует его. Но при запуске make предварительные условия правила вызываются дважды, но я не знаю почему!
Если у меня есть $ (shell ./myscript) в предварительном требовании вместо фактического $ (warning ...), сценарий вызывается дважды!
Makefile, воспроизводящий ошибку:
NAME := test
$(NAME):
@touch $@
install-$(NAME): $(NAME) install-copy-$(NAME)
.PHONY: install-$(NAME)
.PRECIOUS: %.copy
.SECONDEXPANSION:
%.copy: $$*
@cp $< $@
install-copy-%: $$(warning START) $$*.copy $$(warning END)
@echo done
Фактический выход:
make: START
make: START
make: END
done
Ожидаемый результат:
make: START
make: END
done
Почему СТАРТ выставляется дважды? Если у меня есть функция, которая вызывает сценарий вместо $ (предупреждения), сценарий вызывается дважды.
Понятия не имею ... Я хочу сохранить .SECONDEXPANSION, потому что я не хочу, чтобы $ (сценарий оболочки ...) или $ (предупреждение ...) вызывалось, когда правило не вызывается. Я не могу перечислить все файлы, которые будут установлены в .PRECIOUS, потому что я не знаю, поскольку этот файл создается внешним скриптом. (как doxygen). С .PRECIOUS:% .copy в первый раз START выводится дважды, но как только файл существует, START выводится один раз ...
Спасибо!
Makefile с реальным случаем:
NAME := test
INSTALL_DIR := saved
# generate the documentation into $$*/
generateDoc-%:
touch $*/$(shell head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13 ; echo '')
install-$(NAME): generateDoc-$(NAME) install-doc-$(NAME)
.PHONY: install-$(NAME)
.PRECIOUS: $(INSTALL_DIR)/%
.SECONDEXPANSION:
$(INSTALL_DIR)/%: $$(NAME)/$$*
cp $< $@
install-doc-%: $$(warning START) $$(subst $$*,$$(INSTALL_DIR),$$(shell find $$* -type f)) $$(warning END)
@echo done
warning
утверждения в список предварительных требований - это очень странно. - person Beta   schedule 09.10.2019shell ls $$*/documentation
не найдет файлов для копирования оттуда - person Alex Cohn   schedule 10.10.2019cp test/documentation/%
до/usr/doc
не произойдет. - person Alex Cohn   schedule 11.10.2019