Здесь много чего не так. Во-первых, ваш рецепт неправильный; %
в рецепте не является особенным для изготовления и не будет заменено. Ваша команда touch %.txt
создает файл с буквальным именем %.txt
независимо от того, какой шаблон соответствует. Вы хотите использовать touch $@
здесь; см. обсуждение автоматических переменных .
Во-вторых, ваше правило:
%: %.txt
не делает то, что вы думаете, что делает. В отличие от явных правил, создание неявного или шаблонного правила без рецепта не просто создает обязательное отношение для цели, которая соответствует шаблону: вместо этого удаляет существующее правило шаблона .
Поскольку у вас нет ранее существовавшего шаблонного правила, ваш make-файл идентичен простому написанию:
%.txt:
touch %.txt
и нет способа создать цель clojure
с этим make-файлом.
Одним из решений является создание фиктивного рецепта, подобного следующему:
% : %.txt
@:
%.txt:
touch $@
Другое решение, если у вас нет других целей, которые вы хотите добавить в свой make-файл, было бы использовать правило статического шаблона , чтобы указать make, что каждая цель должна рассматриваться как этот тип:
$(MAKECMDGOALS): % : %.txt
%.txt:
touch $@
Переменная MAKECMDGOALS
содержит любые цели, которые вы указали в командной строке.