Я использую Gnu Make 3.81 и получаю сообщение об ошибке, которое пытается совместить шаблонное правило, в котором также есть переменная.Правило шаблона Makefile с переменной в целевом
Вот маленький пример, который я мог придумать:
YYMMDD:=$(shell date +%y%m%d)
TMP_DIR:=/tmp/$(YYMMDD)
# create a temporary directory, and put a "source" file in it
$(TMP_DIR):
mkdir $(TMP_DIR)
echo something > $(TMP_DIR)/somefile.orig
# to build an "object" file in the temp dir, process the "source" file
$(TMP_DIR)/%.new: $(TMP_DIR)/%.orig
wc -l $< > [email protected]
atarget: $(TMP_DIR) $(TMP_DIR)/somefile.new
Затем, когда я бегу make atarget
, я получаю:
mkdir /tmp/141021
echo something > /tmp/141021/somefile.orig
make: *** No rule to make target `/tmp/141021/somefile.new', needed by `atarget'. Stop.
Не должны ли эта работа? похоже, что правило шаблона должно соответствовать этому просто отлично.
Я думаю, что кое-что я тогда не понимаю. Почему бы не сделать просто проверку, чтобы увидеть, что файл «.orig» существует на самом деле? – brooks94
У файла есть кеш, файлы которого существуют по соображениям производительности. Кэш обновляется, когда make знает, что какой-то файл был создан. В этом случае не было выполнено правило, в котором говорится, что он создаст этот файл. Также обратите внимание, что ваш make-файл недействителен, если вы включили параллелизм ('-j'), так как make затем начнет создавать' $ (TMP_DIR) ', а затем сразу начнет пытаться найти следующую цель, которую он не смог найти, поскольку команда для сборки '$ (TMP_DIR)' не было завершено. В общем, это просто плохая идея полагаться на «побочные эффекты» правил, а не на явные предпосылки. – MadScientist
Если это правда, почему работает правило по умолчанию «% .o:% .c»? – brooks94