2010-07-16 15 views
58

Ho un makefile strutturato qualcosa di simile:makefile eseguire un altro obiettivo

all : 
    compile executable 

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

mi sono reso conto che stavo correndo costantemente "make clean" seguito da "chiaro" nel mio terminale prima di eseguire "fare tutto". Mi piace avere un terminale pulito prima di provare a setacciare gli errori di compilazione C++. Così ho provato ad aggiungere un terzo target:

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

Questo funziona, tuttavia questo esegue una seconda istanza di make (credo). C'è un modo giusto per ottenere la stessa funzionalità senza eseguire una seconda istanza di make?

risposta

96

In realtà hai ragione: esegue un'altra istanza di creazione. Una possibile soluzione potrebbe essere:

.PHONY : clearscr fresh clean all 

all : 
    compile executable 

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

fresh : clean clearscr all 

clearscr: 
    clear 

Chiamando make fresh si ottiene prima il bersaglio clean, poi il clearscreen che corre clear e infine all che fa il lavoro.

EDIT

Cosa succede in caso di parallelo costruisce con l'opzione di make -j? C'è un modo per correggere l'ordine. Dal manuale marca, paragrafo 4.2:

Di tanto in tanto, però, si ha una situazione in cui si vuole imporre un ordinamento specifico sulle regole ad essere invocate senza costringere l'obiettivo di essere aggiornato se viene eseguita una di queste regole . In tal caso, si desidera definire i prerequisiti di solo ordine. I prerequisiti di solo ordine possono essere specificati inserendo un simbolo pipe (|) nell'elenco dei prerequisiti: qualsiasi prerequisito alla sinistra del simbolo pipe è normale; eventuali prerequisiti a destra sono solo per l'ordine: obiettivi: prerequisiti normali | prerequisiti di sola ordinazione

La sezione dei prerequisiti normali può ovviamente essere vuota. Inoltre, è possibile dichiarare più righe di prerequisiti per lo stesso obiettivo: vengono aggiunti in modo appropriato. Si noti che se si dichiara che lo stesso file è sia un prerequisito normale che un solo ordine, il prerequisito normale ha la precedenza (poiché è un superset rigoroso del comportamento di un prerequisito di solo ordine).

Da qui la makefile diventa

.PHONY : clearscr fresh clean all 

all : 
    compile executable 

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

fresh : | clean clearscr all 

clearscr: 
    clear 
+1

@ sas4740.: fondamentalmente tutto segue '.PHONY:' viene considerato come una parola chiave che viene sempre eseguita, mentre i target non fasulli sono intesi come file. – Dacav

+0

sono "condizionali prerequisiti" condizionali? per target t2 Voglio prima fare t0, che solo se t0 succede t1 e solo se entrambi i successi eseguono qualche task in t3 – fantastory

+1

@fantastory, no, I ** think ** sono indipendenti. 't2' dipenderà da' t0', 't1' e' t3'. Se hai bisogno di questo dovresti mettere 't3' come richiesto da' t2', 't1' come richiesto da' t3' e 't0' come richiesto da' t1'. Questo significa 3 diverse regole. Dovresti verificare questo, comunque. Non sono sicuro al 100%. – Dacav

-11

al Linux prompt dei comandi: chiaro & fanno

+0

Penso che intendessimo "make clean && make clear" ma ciò non aiuta con l'inefficienza del caricamento effettuare una seconda volta –

+7

puoi renderlo più chiaro :) – fantastory

+3

@fantastory: prova con 'make clear | more' – Dacav

0

Se è stato rimosso la linea make all dal tuo obiettivo "fresco":

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

Si potrebbe semplicemente eseguire il comando make fresh all, che verrà eseguito come make fresh; make all.

Alcuni potrebbero considerare questo come una seconda istanza di marca, ma non è certamente un sub-istanza di marca (un make all'interno di un make), che è ciò che il vostro tentativo sembrava comportare

Problemi correlati