Порядок обработки компонентов в make-файле - PullRequest
31 голосов
/ 06 февраля 2012

В make-файле строка зависимости имеет вид -

abc: x y z

Все три компонента (x, y, z) сами являются целями в строках зависимостей ниже в make-файле.

Если вызывается make abc , в каком порядке будут выполнены три цели x, y, z?

Ответы [ 4 ]

45 голосов
/ 06 февраля 2012

По умолчанию порядок выполнения совпадает с указанным в списке предварительных условий, если между этими предварительными условиями не определены какие-либо зависимости.

abc: x y z

Порядок x y z.

abc: x y z
y : z

Порядок будет x z y.

Но в идеале вы должны создать свои Make-файлы так, чтобы они не зависели от порядка, в котором указаны предварительные условия.То есть, если y должен быть выполнен после z, то должна иметь a y : z зависимость.

И имейте в виду, что GNU Make может выполнять некоторые рецепты параллельно,см. ответ Мат .

36 голосов
/ 06 февраля 2012

Вы действительно не должны зависеть от порядка, в котором они выполняются - при прочих равных условиях все три рецепта для этих предпосылок могут работать параллельно.

Единственное строгое правило - все предварительные условия должны быть выполнены до запуска целевого рецепта.

Если между x, y и z нет никаких зависимостей и нет параллельного выполнения, GNU make запускает их в указанном вами порядке, но это не гарантируется в документах.

16 голосов
/ 06 февраля 2012

Описание POSIX make включает обоснование, которое гласит:

Утилиты make в большинстве исторических реализаций обрабатывают предпосылки цели в порядке слева направо, и формат make-файла требует этого. Он поддерживает стандартную идиому, используемую во многих make-файлах, которые производят yacc программ; например:

foo: y.tab.o lex.o main.o
     $(CC) $(CFLAGS) -o $@ t.tab.o lex.o main.o

В этом примере, если make выбрал какой-либо произвольный порядок, lex.o может быть сделан не с правильным y.tab.h. Хотя могут быть более эффективные способы выразить это отношение, оно широко используется исторически. Реализации, которые хотят обновлять предварительные требования параллельно, должны требовать явного расширения make или формата make-файла для его выполнения, как описано ранее.

( Я полагаю, что t.tab.o в строке $(CC) является опечаткой для y.tab.o, но именно об этом на самом деле говорится. )

Таким образом, наблюдаемое поведение при обработке предпосылок слева направо имеет здесь подтверждение, хотя это только в разделе «Обоснование», а не в основном описании. Обоснование также упоминает проблемы с параллелью make и т. Д.

0 голосов
/ 16 августа 2017

С https://stackoverflow.com/a/22638294/636849, вы можете добавить символ трубы:

abc: | x y z

Из руководства по эксплуатации: Предварительные условия только для заказа можно указать, поместив символ трубы (|) в список предварительных условий: любые предварительные условия слева от символа трубы являются нормальными; любые предпосылки справа - только для заказа:

цели: нормальные условия | заказ-только-предпосылки

...