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

Makefile выполняет другую цель

У меня есть makefile, структурированный примерно так:

all : 
    compile executable

clean :
    rm -f *.o $(EXEC)

Я понял, что я последовательно запускаю "make clean", а затем "clear" в моем терминале перед запуском "make all". Мне нравится иметь чистый терминал, прежде чем я попытаюсь просеять неприятные ошибки компиляции С++. Поэтому я попытался добавить третью цель:

fresh :
    rm -f *.o $(EXEC)
    clear
    make all

Это работает, однако это запускает второй экземпляр make (я считаю). Есть ли правильный способ получить одну и ту же функциональность без запуска 2-го экземпляра make?

4b9b3361

Ответ 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

Ответ 2

В командной строке linux: очистить и сделать