Подтвердить что ты не робот

Порядок обработки компонентов в make файле

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

abc: x y z

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

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

4b9b3361

Ответ 1

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

abc: x y z

Порядок x y z.

abc: x y z
y : z

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

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

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

Ответ 2

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

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

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

Ответ 3

Описание POSIX make содержит обоснование, в котором говорится:

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

foo: y.tab.o lex.o main.o
     $(CC) $(CFLAGS) -o [email protected] t.tab.o lex.o main.o

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

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

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

Ответ 4

Из fooobar.com/info/304603/... вы можете добавить символ трубы:

abc: | x y z

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

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