Работает ли подстановочный знак % в зависимостях в файле Makefile?

#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"