Насправді ви праві: він запускає інший екземпляр 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
яка виконує роботу.
EDIT 4 серпня
Що відбувається у випадку паралельних побудов із -j
варіантом make ? Існує спосіб фіксації замовлення. З інструкції до виготовлення, розділ 4.2:
Однак інколи у вас виникає ситуація, коли ви хочете накласти певне замовлення на правила, які слід викликати, не примушуючи оновлення цілі, якщо виконується одне з цих правил. У цьому випадку потрібно визначити передумови лише для замовлення. Необхідні умови для замовлення можна вказати, розмістивши символ труби (|) у списку передумов: будь-які передумови зліва від символу труби є нормальними; будь-які передумови праворуч - лише замовлення: цілі: звичайні передумови | передумови лише для замовлення
Звичайно, розділ звичайних передумов може бути порожнім. Також ви можете оголосити кілька рядків передумов для однієї цілі: вони додаються належним чином. Зауважте, що якщо ви оголошуєте один і той же файл як звичайною, так і умовою лише для замовлення, нормальна умова має перевагу (оскільки вони є суворим набором поведінки лише для замовлення).
Отже, makefile стає
.PHONY : clearscr fresh clean all
all :
compile executable
clean :
rm -f *.o $(EXEC)
fresh : | clean clearscr all
clearscr:
clear
EDIT 5 грудня
Запускати більше ніж один екземпляр makefile - це не велика справа, оскільки кожна команда всередині завдання в будь - якому випадку буде підколюшкою. Але ви можете використовувати багаторазові методи за допомогою функції виклику .
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 :
, трактується як якесь ключове слово, яке завжди виконується, тоді як некеровані цілі призначені для файлів.