#unix #makefile
Вопрос:
Я попробовал ниже два способа, но всегда получал (не печатал «В следующем фрагменте»):
В азбуке
В Начале
START :
test.ABC
echo "In Start"
%.ABC : %.nextFrag
echo "In ABC"
%.nextFrag:
echo "In nextFrag"
#способ 2:
START :
test.ABC
echo "In Start"
%.ABC : $*.nextFrag
echo "in ABC"
%.nextFrag:
echo "In nextFrag"
Комментарии:
1. Я новичок в Makefile, хочу знать, как я могу использовать подстановочные знаки для целей и зависимостей.
2. Поскольку
%.nextFrag
правило не имеет предварительных условий, любой целевой объект, использующий это правило шаблона, будет считаться обновленным, если файл существует, и будет считаться устаревшим (и восстановленным) только в том случае, если целевой объект не существует. Итак, если вы не видитеInNextFrag
напечатанного, это означает, что у вас есть файлtest.nextFrag
, который уже существует на диске, и поэтому для его создания ничего не нужно делать.3. Пример «способ 2» не может работать, потому что автоматические переменные, такие как
$*
, доступны только внутри рецепта; вы не можете использовать их в списке необходимых условий.
Ответ №1:
(Примечание: это в основном относится к GNU make
.)
%
не является подстановочным знаком (по крайней мере, не в том смысле, что *
, ?
, и [...]
являются подстановочными знаками). Он используется для определения так называемого правила шаблона, которое используется только для определения предварительных условий. В правиле шаблона %
соответствует произвольной строке, поэтому %.c
это будет означать, что «все файлы *.c` являются необходимыми условиями.
Для того, что вы делаете, когда шаблоны, по-видимому, не соответствуют каким-либо файлам, вы просто хотите использовать поддельные целевые объекты, которые являются целевыми именами, которые не соответствуют ни одному файлу.
.PHONY: START test.ABC nextFrag
START: test.ABC
echo "In Start"
test.ABC: nextFrag
echo "In ABC
nextFrag:
echo "In nextFrag"