2013-06-24 15 views
6

Attualmente sto lavorando su un progetto che richiede la traduzione di un elenco di file in una directory in un'intestazione C++ per memorizzare informazioni sulle risorse. Per esempio:Crea dipendenze ricorsive

/ 
update.py 
resources.h 
Makefile 
/resources 
    resource1.png 
    /sub1 
    /sub2 
     resource2.png 

Quello che voglio è per Makefile per eseguire update.py solo quando una delle risorse ovunque nella struttura di directory è cambiato. Nessun altro makefile sta per toccare le risorse, solo risorse.h. Che tipo di makefile ho bisogno di fare questo?

PS Da quello che ho letto, la ricerca ricorsiva con make è una cattiva idea, ma se nient'altro sta toccando lo stesso file, sarebbe un problema?

risposta

12

io non sono sicuro di quello che hai letto, ma non c'è alcuna scrittura di una regola come questa nel make problema:

RESOURCES := $(shell find . -name resource\*.png -print) 
resources.h: update.py $(RESOURCES) 
     ./update.py $(RESOURCES) 

o qualsiasi altra cosa.

+0

Questo fallisce se trova un file con uno spazio al suo interno. Probabilmente ha bisogno di un piccolo ritocco. – HectorJ

+0

In generale, non è possibile gestire nomi di file contenenti spazi bianchi utilizzando le versioni correnti di make. – MadScientist

1

Penso che ti sia sbagliato: Recursive Make Considered Harmful spiega che non devi chiamare una marca da un'altra, perché nessuno dei due avrà la panoramica completa delle dipendenze. Questo prima o poi porta a build errati che è possibile risolvere solo con make clean.

makepp è un'alternativa che ti aiuta a evitare quella trappola. Si risolve anche il problema con un ricorsiva (niente a che fare con sopra ricorsione) jolly:

RESOURCES := **/resource\*.png 
resources.h: $(RESOURCES) 
    .$/update.py $(inputs) 

Questo funziona anche se i file non sono ancora arrivati, perché i caratteri jolly di makepp tengono conto di quello che potrebbe essere costruito in base alle proprie regole . Nota come nota la dipendenza del programma automaticamente. Il divertente $/ si sposterà in entrambi i modi a seconda del sistema su cui viene eseguito, quindi è più portatile.

C'è molto altro da fare. Oltre a fare quasi tutto quello che GNU può fare, ci sono molte altre cose utili, e puoi anche estendere i tuoi makefile con qualche programmazione Perl.