2010-07-13 7 views
22

Ho un makefile che prende le opzioni nella riga di comandoForza GNU make per ricostruire oggetti interessati per definizione compilatore

make OPTION_1=1 

In base al valore che aggiungerà ulteriori definizioni del compilatore per un sottoinsieme di oggetti.

ifeq ($(OPTION_1), 1) 
CC_FLAGS += -DOPTION_1_ON 
endif 

La modifica della definizione influenza il contenuto del file di intestazione incluso - uno stub o di un'implementazione è esposto ai file oggetto.

Come è possibile ottenere make per ricostruire i file "interessati" da questa opzione?

risposta

39

Io uso un file di ricordare l'ultimo valore di tali opzioni, in questo modo:

.PHONY: force 
compiler_flags: force 
    echo '$(CC_FLAGS)' | cmp -s - [email protected] || echo '$(CC_FLAGS)' > [email protected] 

Il bit cmp || echo significa che il file di compiler_flags viene toccato solo quando l'impostazione cambia, così ora si può scrivere qualcosa di simile

$(OBJECTS): compiler_flags 

causare una ricostruzione di $(OBJECTS) ogni volta che cambiano i flag del compilatore. La regola per compiler_flags verrà eseguita ogni volta che si esegue make, ma una ricostruzione di $(OBJECTS) verrà attivata solo se il file compiler_flags è stato effettivamente modificato.

+0

Grazie per l'esempio. Peccato che non sembra possibile farlo senza un file temporaneo. – Oliver

+0

Modificato per evitare la creazione di 'compiler_flags.tmp', lo rende un po 'più ordinato. Sospetto che non sia quello che intendevi, comunque. Non c'è modo di creare * qualche * file per ricordare l'impostazione, dal momento che make non ha altro modo di preservare lo stato tra più chiamate. – slowdog

+1

Questo è più di un po 'inefficiente se la tua build diventa grande. Implica un'invocazione della shell e una lettura di file anche per una build aggiornata. In queste circostanze, codifica i flag del compilatore in _filename_. – bobbogo

0

metterli in una destinazione quindi chiamare il tocco su ogni file.