Ответ 1
На самом деле вы правы: он запускает другой экземпляр make. Возможное решение:
.PHONY : clearscr fresh clean all
all :
compile executable
clean :
rm -f *.o $(EXEC)
fresh : clean clearscr all
clearscr:
clear
Вызывая make fresh
, вы получаете сначала цель clean
, затем clearscreen
, которая запускает clear
и, наконец, all
, которая выполняет задание.
ИЗМЕНИТЬ
Что происходит в случае параллельных сборок с параметром -j
?
Там есть способ зафиксировать заказ. Из руководства по эксплуатации, раздел 4.2:
Иногда, однако, у вас есть ситуация, когда вы хотите наложить конкретный порядок в правилах, которые должны быть вызваны, не заставляя цель обновляться, если выполняется одно из этих правил. В этом случае вы хотите определить предварительные условия только для заказа. Предварительные требования только для заказа могут быть указаны путем помещения символа трубы (|) в список предварительных условий: любые предпосылки слева от символа трубы являются нормальными; любые предварительные условия справа - только для заказа: цели: нормальные условия | заказ-только-предпосылки
Конечно, нормальный раздел обязательных условий может быть пустым. Кроме того, вы все равно можете объявить несколько строк предпосылок для одной и той же цели: они добавляются соответствующим образом. Обратите внимание, что если вы объявляете тот же файл как нормальным, а только предварительным условием для заказа, нормальное условие имеет приоритет (поскольку они являются строгим надмножеством поведения только для заказа).
Следовательно, make файл становится
.PHONY : clearscr fresh clean all
all :
compile executable
clean :
rm -f *.o $(EXEC)
fresh : | clean clearscr all
clearscr:
clear