2012-07-09 13 views
7

Alcuni giorni fa ho postato una risposta nello stack overflow su come scrivere un make gerarchico (http://stackoverflow.com/questions/1498213/make-hierarchical-make-file). La risposta è stata cancellata, quindi presumo che sia stato completamente sbagliato o fuori tema (o entrambi).Come scrivere un Makefile gerarchico semplice?

Mi piacerebbe sapere come scrivere Makefile gerarchico. Questo è un Makefile che chiama diversi Makefile nelle sottodirectory. Presumo una struttura di directory simile:

- project 
    |--module1 
     |--Makefile 
     |--... 
    |--module2 
    |--Makefile 
    |--module2.1 
    |--module2.2 
    |--... 
    |--module3 
    |--Makefile 
    |--... 
    |--etc 

Suppongo inoltre che i membri del progetto hanno concordato solo solo su un insieme minimo di obiettivi makefile come: (di default), pulito, installare, e così. Così, i seguenti comandi tra cui fanno bandiere saranno propagare ai moduli:

cd project 
make clean 
make -k 
make install 
#etc 

Cosa c'è di sbagliato con il seguente Makefile di progetto:

PACKAGES = \ 
    module1 \ 
    module2 \ 
    emodule3 

VIRTUAL_PACKAGES = $(addsuffix /.virtual.Makefile,${PACKAGES}) 

TARGETS=clean install all 

.PHONY: $(TARGETS) 
default: all 

FLAGS = $(ifeq $(MAKEFLAGS) "","",-$(MAKEFLAGS)) 

$(TARGETS): $(VIRTUAL_PACKAGES) 

$(VIRTUAL_PACKAGES): 
    $(MAKE) $(FLAGS) -C $(@D) $(MAKECMDGOALS) 

sì, il $ VIRTUAL_PACKAGES nel Makefile sembra strano. L'alternativa di mescolare un ciclo for è un po 'più breve, ma non sono sicuro se è meglio (come ho bisogno di fare affidamento su bash): PACCHETTI = \ module1 \ module2 \ emodule3

TARGETS=clean install all 

.PHONY: $(TARGETS) 
default: all 

FLAGS = $(ifeq $(MAKEFLAGS) "","",-$(MAKEFLAGS)) 

$(TARGETS): 
    for p in $(PACKAGES) ; do $(MAKE) $(FLAGS) -C $$p [email protected] || break; done 

Grazie !

+0

Ritiene che l'assegnazione a 'lavoro FLAGS'? Quale versione di Make stai usando? – Beta

+0

Una soluzione non ricorsiva: http://stackoverflow.com/a/7321954/412080 –

+0

Può o potrebbe non esserti utile, ma per la gestione di progetti complessi trovo molto più semplice. È davvero facile avere una gerarchia di CMakeLists.txt. I makefile verranno generati automaticamente. – Hindol

risposta

7

Qui ci sono "draghi". Può essere fatto, ma le implicazioni possono essere complicate.

Google, "Ricorsivo considera danneggiato". Otterrete delle ottime (semplici) illustrazioni di esattamente ciò che volete (ad es. Gerarchia), oltre a buone spiegazioni delle insidie ​​/ preoccupazioni. Alcune delle "risposte" discuteranno le possibili "migliori pratiche" e i modi per mitigare i problemi. Quindi, puoi decidere se i problemi sollevati sono convincenti per la tua applicazione o meno.

Il documento originale:

http://miller.emu.id.au/pmiller/books/rmch/

Alcuni altri link:

http://c2.com/cgi/wiki?RecursiveMakeConsideredHarmful

http://dbaspot.com/configuration-management/194597-thoughts-recursive-make-considered-harmful.html

Problemi correlati