На самом деле вы правы: он запускает другой экземпляр 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
выполняющую работу.
ИЗМЕНИТЬ 4 августа
Что происходит в случае параллельной сборки с -j
опцией make ? Есть способ навести порядок. Из руководства make, раздел 4.2:
Однако иногда возникает ситуация, когда вы хотите наложить определенный порядок на правила, которые должны быть вызваны, без принудительного обновления цели, если выполняется одно из этих правил. В этом случае вы хотите определить предпосылки только для заказа. Предварительные условия только для заказа можно указать, поместив вертикальную черту (|) в список предварительных требований: любые предварительные требования слева от вертикальной черты являются нормальными; любые предварительные условия справа относятся только к порядку: цели: нормальные-предварительные условия | заказ-только-предпосылки
Нормальный раздел предварительных условий, конечно, может быть пустым. Кроме того, вы все равно можете объявить несколько строк предварительных условий для одной и той же цели: они добавляются соответствующим образом. Обратите внимание, что если вы объявляете один и тот же файл как обычное предварительное условие, так и предварительное условие только для заказа, нормальное предварительное условие имеет приоритет (поскольку они являются строгим надмножеством поведения предварительного условия только для заказа).
Следовательно, make-файл становится
.PHONY : clearscr fresh clean all
all :
compile executable
clean :
rm -f *.o $(EXEC)
fresh : | clean clearscr all
clearscr:
clear
ИЗМЕНИТЬ 5 декабря
Запуск более одного экземпляра make-файла не представляет большого труда, поскольку каждая команда внутри задачи в любом случае будет подчиненной оболочкой . Но вы можете использовать многоразовые методы, используя функцию вызова .
log_success = (echo "\x1B[32m>> $1\x1B[39m")
log_error = (>&2 echo "\x1B[31m>> $1\x1B[39m" && exit 1)
install:
@[ "$(AWS_PROFILE)" ] || $(call log_error, "AWS_PROFILE not set!")
command1 # this line will be a subshell
command2 # this line will be another subshell
@command3 # Use `@` to hide the command line
$(call log_error, "It works, yey!")
uninstall:
@[ "$(AWS_PROFILE)" ] || $(call log_error, "AWS_PROFILE not set!")
....
$(call log_error, "Nuked!")
.PHONY :
рассматривается как некое ключевое слово, которое всегда выполняется, в то время как нефальшивые цели предназначены для файлов.t2
будет зависеть отt0
,t1
иt3
. Если вам это нужно, вы должны поставитьt3
как требуетсяt2
,t1
как требуетсяt3
иt0
как требуетсяt1
. Это означает 3 разных правила. Однако вам следует это проверить. Я не уверен на 100%.Если вы удалили
make all
строку из своей «новой» цели:Вы можете просто запустить команду
make fresh all
, которая будет выполняться какmake fresh; make all
.Некоторые могут рассматривать это как второй экземпляр make, но это определенно не подэкземпляр make (make внутри make), к чему, похоже, привела ваша попытка.
источник