2011-08-22 13 views
5

Sto scrivendo un Makefile che esegue una generazione di dipendenze e mi sono trovato a dover duplicare le regole perché la base (legacy) contiene una combinazione di file .cpp e .cc. Sembra un po 'brutto. È comunque necessario specificare che i prerequisiti di un target possono essere sia .cpp o .cc file?Evita la duplicazione delle regole di creazione GNU

Quindi, piuttosto che avere:

%.d : %.cpp 
    $(CPP) -MM $(CPPFLAGS) $< 

%.d : %.cc 
    $(CPP) -MM $(CPPFLAGS) $< 

creare qualcosa senza la duplicazione come:

%.d : %.(cpp | cc) 
    $(CPP) -MM $(CPPFLAGS) $< 

O è questa ridondanza forzata solo un elemento sfavorevole di GNU make di design?

+0

se si utilizza GNU autotools è possibile utilizzare macro m4 – Kevin

risposta

3

Prima opzione, utilizzare una variabile per definire il corpo regola una volta, e riutilizzarlo in base alle esigenze: Seconda opzione

DEPGEN=$(CPP) -MM $(CPPFLAGS) $< 
%.d: %.cpp ; $(DEPGEN) 
%.d: %.cc ; $(DEPGEN) 

, utilizzare $(eval) per generare dinamicamente le regole:

$(foreach src,cpp cc,$(eval %.d: %.$(src) ; $$(CPP) -MM $$(CPPFLAGS) $$<)) 
+0

L'opzione 1 è esattamente quello che stavo cercando. – Alastair

1

Questo dovrebbe funzionare:

%.d :: %.cpp 
    $(CPP) -MM $(CPPFLAGS) $< 

%.d :: %.cc 
    $(CPP) -MM $(CPPFLAGS) $< 

Un'altra idea:

%.d : %.c 
    $(CPP) -MM $(CPPFLAGS) $< 

%.c : %.cpp 
    ln $< [email protected] # or cp -p 

Un'altra idea è quella di rendere GNU make generare le due regole del modello. Ci sono essentally due modi per farlo:

  • li scrivere a makefile (%-cc.mk o simili) che è includere all'interno del vostro makefile effettivo con include dichiarazione GNU di make
  • allestire ed analizzare li linea con GNU make di $(eval) e $(call) funzioni

Come la maggior parte tutto il resto nello sviluppo toolchain C/Unix, queste tecniche sono essenzialmente una forma di pre-elaborazione, che li rende facili da capire al prezzo di essere davvero difficile utilizzare (molte fughe doppie o triple, davvero difficili da tenere traccia di ciò che viene espanso quando; il debugging può essere un dolore reale, almeno nella mia esperienza).

Quindi prenotarli per casi d'uso più complicati (di cui Stack Overflow ne elenca alcuni).

+0

Nessuna di queste opzioni sembra portare a un makefile più succinto. Probabilmente starò solo con il modulo originale. Grazie per i tuoi suggerimenti però. – Alastair

Problemi correlati