2009-04-07 18 views
8

Sto imparando makefile e so come creare un semplice makefile. Sto passando a makefile nidificati. Qui è la mia struttura di directoryCreazione del makefile nidificato

/src 
...makefile 
...main.cpp 
...foo 
......makefile 
......foo.cpp 
......foo.h 

Quando radice makefile si chiama, chiama il makefile nella directory foo. Ecco le mie domande

  1. Quali makefile devo usare per scrivere il codice per collegare tutti i file oggetto? Se si trova nel makefile di root, devo specificare tutti i nomi dei file oggetto lì?
  2. Questo makefile nidificato è una procedura consigliata? O è bello avere solo un makefile che è alla radice?

Qualsiasi aiuto sarebbe fantastico!

risposta

15

C'è molto da dire per non facendo questo. Leggi Recursive Make Considered Harmful. Anche in PDF form.

La versione breve è quella ricorsiva che crea in modo efficace diversi alberi di dipendenza disgiunti ma eventualmente sovrapposti e non può garantire una build corretta o massimizzata. Il problema peggiora se speri di costruire in parallelo.

Per risolvere il problema, si dispone di una singola marca non ricorsiva che costruisca un singolo albero delle dipendenze su tutto lo spanning che consenta di risolvere tutti i problemi di cui sopra.

strutture di esempio per make non ricorsiva e soluzioni ai diversi problemi difficili che sorgono nel scriverle si possono trovare nel documento originale e nelle risposte a:

+1

Se non farlo è una cattiva idea, forse una soluzione alternativa dovrebbe essere suggerita come risposta. – deadalnix

+1

Sì. Questa risposta è in una forma che non è più accettabile sul sito. Le modifiche risolvono solo parzialmente il problema, ma è qualcosa. – dmckee

3

La marca ricorsiva è generalmente considerata dannosa.

Se si vuole veramente scrivere "make" nella directory di root e creare tutto usando solo i makefile POSIX, è l'unico modo. In tal caso, collegare i sottoprogetti nella propria directory e gli elementi finali insieme in root.

Se siete disposti a utilizzare la sintassi gmake, date un'occhiata al Makefile qui: http://github.com/singpolyma/theveeb-ecosystem

+1

È possibile utilizzare una marca POSIX (non GNU) per eseguire una build non ricorsiva suddividendola in due passaggi: 1) concatena tutti i file make.inc in tutti i sottodir; 2) esegui il makefile risultante. Ma la maggior parte delle persone usa comunque GNU, che ha la direttiva "include". –

+0

Ah, è vero, non ho mai pensato al concatenamento hack. Tendo ad usare include. Normalmente voglio essere molto POSIX, ma con i makefile a volte è un po 'peloso a causa della direttiva no include :) – singpolyma

0

Ci sono più moderni sistemi di compilazione, come SCons che hanno una sintassi più semplice che fare e di evitare molte insidie ​​di marca. Ad esempio, SCons analizza i file di origine per determinare le dipendenze su se stessi, mentre per fare uno è necessario specificare manualmente le dipendenze. Se ad es. aggiungere una nuova istruzione #include a un file di implementazione make non ricompilerà il file di implementazione se l'intestazione cambia (a meno che non si aggiunga la nuova dipendenza). SCons rileva automaticamente la nuova dipendenza e ricompila tutto il necessario.