È necessaria una regola di dipendenza del makefile in grado di gestire i file mancanti
-
04-07-2019 - |
Domanda
Usiamo GNU Make per il nostro sistema. Alla fine dei nostri makefile, abbiamo un include chiamato Makedepends che genera un sacco di file .d usando l'opzione -MM su gcc. Quindi includiamo il file .d per ogni file .cc usando una riga include $ (CXXFILES: .cc = .d). Ma quando eliminiamo il file o spostiamo i file, il passaggio delle dipendenze si interrompe e dobbiamo eliminare manualmente i file .d (anche un clean clean non funziona perché le dipendenze falliscono)
Esiste un modo per generare questi file .d di dipendenza o includere questi file .d di dipendenza che gestiranno con grazia una cancellazione o delocalizzazione dei file?
MODIFICA: Ad esempio: ho serial.cc e i makefile generano un file serial.d che ha una dipendenza da buffer.h, ma poi lo cambio in modo da non aver più bisogno di buffer.h e cancellare il buffer .h. La prossima volta che eseguo make, si strozzerà perché include il file .d che rende ancora seriale.o dipendente da buffer.h.
Soluzione
http://make.mad-scientist.net/papers / advanced-auto-dependency-generation ha una descrizione di questo esatto problema e un paio di modi per risolverlo. Il primo è un po 'fuorviante, ma il "avanzato" è essenzialmente perfetto.
Altri suggerimenti
Due possibilità:
Innanzitutto, puoi aggiungere una regola al tuo Makefile per eseguire il passaggio di dipendenza:
.SUFFIXES: .d
%.d::
makedepend_command_here
In caso contrario, dalla sezione Last Resort
della pagina info
per GNU Make:
Ad esempio, durante il test a makefile, potrebbe non interessarti se i file di origine contengono solo dati reali che esistono. Quindi potresti farlo in questo modo:
%:: touch $@
per causare tutti i file sorgente necessari (come prerequisiti) da creare automaticamente.
Funzionerà per creare file .d
vuoti per te?
Se usi makepp con l'opzione --rm-stale
, noterà i file che non sono più costruibili e li rimuoverà. Se questo è un normale caso d'uso per te, puoi mettere quell'opzione in .makepprc
alla radice del tuo albero di compilazione, e sarà sempre usato.
Ma ovviamente makepp gestisce da solo tutto questo rilevamento delle dipendenze, quindi non è necessario ingombrare il tuo makefile. È anche meglio del tuo approccio, perché può generare le intestazioni necessarie in tempo per il compilatore, dove gcc -MM
fallirebbe.
C'è molto altro da creare. Oltre a fare quasi tutto ciò che GNU può fare, ci sono molte altre cose utili e puoi persino estendere i tuoi makefile con un po 'di programmazione Perl.