Что означают эти конструкции Makefile? - PullRequest
4 голосов
/ 29 января 2009

Может кто-нибудь помочь мне разобраться в следующем файле make?

BINS=file1 file2 file3

all: $(BINS)

clean: 
        rm -f $(BINS) *~ 

$*: $@.c
        gcc -g -o $@ $?

Вот мои вопросы:

  1. Что такое опция -g для gcc?
  2. Что такое $ * и $ @
  3. Как узнать, как выполнить последнюю цель?

Спасибо!

Ответы [ 5 ]

5 голосов
/ 29 января 2009

Из документации gcc и make:

  1. "- g Создать отладочную информацию в собственном формате операционной системы".

  2. а. "$ * Стебель, с которым совпадает неявное правило (см. Как совпадают шаблоны). Если целью является dir / a.foo.b, а целевой шаблон -.%. B, то стебель - dir / foo. полезно для построения имен связанных файлов. В правиле статического шаблона ствол является частью имени файла, соответствующего «%» в целевом шаблоне. "

    б. «$ @ Имя файла цели правила. Если цель является членом архива, то« $ @ »- это имя файла архива. В правиле шаблона, имеющем несколько целей (см. Введение в правила шаблона), '$ @' - это имя цели, из-за которой выполнялись команды правила. "

    с. «$? Имена всех предпосылок, которые новее, чем цель, с пробелами между ними». (Не спрашивается, но стоит добавить.)

  3. "'all" Скомпилируйте всю программу. Это должно быть целью по умолчанию. "

Этот пример make-файла немного ограничен, так как кажется, что он собирает только программы на Си. GNU make имеет несколько более обширных примеров, которые полезны для обучения написанию make-файлов.

3 голосов
/ 29 января 2009

1.) Что такое опция -g для gcc?

Создать информацию для отладки

2.) Что такое $ * и $ @

$* является основой правила. Когда вы делаете правило, как

%.ext: %.otherext
    ext2otherext --input $? --output $@ --logfile $*.log

, и правило пытается сделать file.ext из file.otherext, затем в журнал переходит к file.log

$@ - целевое имя файла (file.ext в случае выше).

3.) Как узнать, как выполнить последнюю цель?

Это загадка.

$* используется для файлов-посредников: например, когда вы пытаетесь сделать %.so из %.c, вам понадобится посредник %.o, который не является ни целью, ни источником. Вы положили:

%.so: %.c
    gcc -fPIC -g -c -o $*.o $?
    ld -shared -o $@ $*.o

Другими словами, в %.extension правиле $* - это все, кроме .extension.

В качестве цели $* не имеет смысла.

Вы уверены, что это правило где-то выполняется? Когда я пытаюсь воспроизвести его, используя ваш Makefile, он применяет правила по умолчанию (cc -o) вместо gcc -g -o

Правило, которое вам нужно, похоже:

%: %.c
    gcc -g -o $@ $?
1 голос
/ 29 января 2009

Первая строка делает то, что вы ожидаете, глядя на нее - она ​​создает список имен и присваивает его BIN. Затем определяется цель создания с именем all, которая зависит от целей, перечисленных в $BIN (all нельзя построить, пока не будет построена каждая цель в $BIN). all - специальная цель сборки; если вы просто запустите make вместо, скажем, make clean, цель all будет создана автоматически. Фактических команд, связанных с all, нет - он просто гарантирует, что все его зависимости построены. Последняя довольно простая команда определяет цель сборки с именем clean, которая удаляет каждый файл, указанный в $BIN (обратите внимание, что $BIN используется как список целей сборки и список файлов в этом make-файле) и все резервное копирование.

Далее мы попадаем на линию, которая в основном магическая. $* - это специальная цель сборки, которая означает «что-либо специально не определенное». Когда make пытается построить all, он находит цель и начинает работу над своими зависимостями. Но когда он пытается построить file1, явная цель не определена. Вместо этого он использует $* для построения file1. Точно так же $@ заменяется именем цели сборки, а $? - его зависимостями (вроде того, для которого лучше проверить руководство). Когда make идет на сборку file1, тогда правило $* заставляет его вести себя так, как если бы было определено следующее правило:

file1: file1.c
        gcc -g -o file1 file1.c

Наконец, опция -g позволяет просто компилировать отладочную информацию.

1 голос
0 голосов
/ 29 января 2009

Q1 и Q2 уже даны исчерпывающие ответы, поэтому краткое объяснение только для Q3:

Make всегда выполняет первую цель, если вы не указали другую. Это также называется целью по умолчанию. Обычно цель по умолчанию называется «все».

...