Вот общее решение вашей конкретной проблемы.
Вы хотите иметь возможность зависеть от переменной как обязательного условия. То есть вы можете сделать это обязательным условием для любой цели в вашем файле makefile, а когда значение переменной изменится, вы восстановите эти цели.
Вот функция, которая делает это, вы используете эту функцию для объявления переменной, которая будет надежной, а затем вы можете использовать ее как необходимое условие.
Обратите внимание, что если переменная не используется в командной строке, она все равно будет означать, что переменная все еще имеет значение, а именно пустую строку.
define DEPENDABLE_VAR
.PHONY: phony
$1: phony
@if [[ `cat $1 2>&1` != '$($1)' ]]; then \
echo -n $($1) > $1 ; \
fi
endef
#declare ARGS to be dependable
$(eval $(call DEPENDABLE_VAR,ARGS))
foo:foo.c ARGS
$(CC) $(CFLAGS) $(ARGS) -c foo.c -o foo
В самом деле, мы могли бы опустить необходимость «декларация», а просто написать подобную функцию, которая будет делать все переменными надежны по умолчанию. Но мне это не нравится. Я предпочитаю, чтобы пользователи, которые меняют make-файлы, я пишу, явно заявляют о своих намерениях. Это хорошо для них :)
Единственное «лучшее» решение, которое я знаю, это отслеживать дополнительные файлы для этой информации, которые затем используются в качестве дополнительных предварительных условий для конечной цели (количество генераторов make и т. Д. Используют этот трюк). –
Я бы этого не сделал. Если 'foo' зависит от значения' $ (ARGS) ', его следует переделать, когда значение' $ ARGS ''отличается от последнего. Но вы не знаете, что это за значение. Я думаю, что лучше сделать ценность частью цели. – reinierpost
@reinierpost да, вы знаете «что это за значение» :) Взгляните на мой ответ :) –