$@ The file name of the target.
$< The name of the first dependency.
Для получения дополнительной информации: Ссылка на символ Makefile
$ @
- это имя создаваемой цели - создаваемой программы или объектного файла.
$ <
- это имя файла, который вызвал его перестройку. - это имя файла, «существование которого позволило выбрать правило вывода для цели».
В этом примере у вас может быть:
program.o: program.c
${CC} ${CFLAGS} -c -o $@ $<
В этом случае $ @
- это 'program.o', а $ <
- 'program.c'. (Правило должно генерировать объектный файл из-за параметра ' -c
'.)
Остерегайтесь '$ <'; если был заголовок, который был более свежим, чем программа, вместо этого будет соответствовать '$ <' - и тогда строка компиляции не будет работать. Однако, как показано, это достаточно безопасно.
Бета-комментарии о '$ <' ...
В POSIX определении 'make' говорится:
$ <
В правиле вывода макрос $ <должен оценивать к имени файла, существование которого позволило выбрать правило вывода для цели. В правиле .DEFAULT макрос $ <должен оценивать текущее имя цели. В противном случае значение макроса $ <не указывается.
Например, в правиле вывода .c.a $ <представляет предварительный файл .c.
Итак, в приведенном мной примере "$ <" технически "не указано". И, в правильном контексте, , который будет:
.c.o:
${CC} ${CFLAGS} -c -o $@ $<
Тогда '$ <' безусловно является 'progname.c' при построении 'progname.o'.
Некоторые версии 'make' делали с ним странные вещи; Кажется, что и GNU Make (3.81), и Solaris 10 работают нормально. Я подозреваю, что я попал в ловушку временного искажения. Я использовал следующий make-файл:
all: x.o
x.o: x.c
${CC} ${CFLAGS} -c -o $@ $<
x.o: x.h
Я использовал ' echo "int main () {return 0;}"> x.c
'и' echo> x.h
'для создания кода. Не имело значения, какой файл был затронут из «x.c» и «x.h»; в любом случае компиляция была «правильной». У меня есть старая производная программа, которая примерно в 1992 году была совместима с Sun MAKE того времени во многих отношениях, но неправильно с ней обращалась.
В 7-м издании Руководства программиста UNIX говорится:
Указано правило для создания файла с суффиксом s2 , который зависит от файла с аналогичным именем с суффиксом s1 {{1 }} как запись для 'target' s1s2 . В такой записи специальный макрос $ * обозначает целевое имя с удаленным суффиксом , $ @ - полное целевое имя, $ <- полный список предварительных требований и $? для списка требований, которые устарели.
Здесь ничего не говорится о том, что это значит вне этого контекста. Я отмечаю, что «make» 7-го издания будет перечислять как «x.c», так и «x.h» для «$ <», но POSIX говорит, что это неверно.
В «Руководстве пользователя make» SUN (версия A от 16 марта 1987 г.) говорится:
$ <
Имя файла зависимости, как если бы оно было выбрано командойmake
для использования с неявное правило.
Это более или менее соответствует тому, что вы сейчас видите.
Ну что ж, такова жизнь; все меняется вокруг тебя. Иногда вы замечаете, что это происходит; иногда нет.