Что такое $ и $ <в Make-файле? [дубликат]

7
задан codaddict 11 February 2011 в 16:53
поделиться

2 ответа

$@  The file name of the target. 

$<  The name of the first dependency. 

Для получения дополнительной информации: Ссылка на символ Makefile

5
ответ дан 7 December 2019 в 05:21
поделиться

$ @ - это имя создаваемой цели - создаваемой программы или объектного файла.

$ < - это имя файла, который вызвал его перестройку. - это имя файла, «существование которого позволило выбрать правило вывода для цели».

В этом примере у вас может быть:

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 для использования с неявное правило.

Это более или менее соответствует тому, что вы сейчас видите.


Ну что ж, такова жизнь; все меняется вокруг тебя. Иногда вы замечаете, что это происходит; иногда нет.

3
ответ дан 7 December 2019 в 05:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: