2010-07-16 4 views
58

У меня есть Makefile структурированного что-то вроде этого:Makefile выполнить другую цель

all : 
    compile executable 

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

я понял, что я постоянно работаю «сделать чистый», а затем «ясно» в моем терминале перед запуском «сделать все». Мне нравится иметь чистый терминал, прежде чем я попытаюсь просеять неприятные ошибки компиляции C++. Поэтому я попытался добавить третью цель:

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

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

ответ

96

На самом деле вы правы: он запускает другой экземпляр 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

Что происходит в случае параллельной сборки с -j вариант сделать в? Есть способ установить заказ. С макияжем руководства, раздел 4.2:

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

Раздел нормальных предпосылок, конечно, может быть пустым. Кроме того, вы все равно можете объявить несколько строк предпосылок для одной и той же цели: они добавляются соответствующим образом. Обратите внимание, что если вы объявляете тот же файл как нормальным, а обязательным условием, нормальное предварительное условие имеет приоритет (поскольку они являются строгим надмножеством поведения только для заказа).

Поэтому Makefile становится

.PHONY : clearscr fresh clean all 

all : 
    compile executable 

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

fresh : | clean clearscr all 

clearscr: 
    clear 
+1

@ sas4740.: в основном все следует за '.PHONY:' рассматривается как некоторое ключевое слово, которое всегда выполняется, а не фальшивые цели предназначены для файлов. – Dacav

+0

являются условными условиями «только для заказа»? для цели t2 Я хочу сначала сделать t0, а не только если t0 успешно выполнит t1, и только если оба succeds запускают некоторую задачу в t3 – fantastory

+1

@fantastory, нет, я ** думаю ** они независимы. 't2' будет зависеть от' t0', 't1' и' t3'. Если вам это нужно, вы должны поместить 't3' в соответствии с требованиями' t2', 't1' в соответствии с требованиями' t3' и 't0' в соответствии с требованиями' t1'. Это означает 3 разных правила. Однако вы должны проверить это. Я не уверен на 100%. – Dacav

-11

В Linux командной строке: ясно & сделать

+0

Я думаю, что вы имели в виду «make clean && make clear» , но это не помогает при неэффективности загрузки сделать второй раз –

+7

вы можете сделать его более понятным :) – fantastory

+3

@fantastory: попробуйте с 'make clear | more' – Dacav

0

Если вы удалили make all линию от ваших "свежих" целей:

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

Вы можете просто запустить команду make fresh all, который будет выполняться как make fresh; make all.

Некоторые могут рассматривать это как второй экземпляр марки, но это, безусловно, не является суб-экземпляром макияжа (макияжа внутри макияжа), которая является то, что ваша попытка, казалось, привести к

Смежные вопросы