Maestro Makefile per sottoprogetti non compilerà sottoprogetti
-
22-08-2019 - |
Domanda
Ho un progetto che sto lavorando per rilasciare che in realtà contiene 3 sottoprogetti, ognuno dei quali devono essere compilati in una sola volta. Il mio makefile si presenta più o meno in questo modo:
all: a b c
a:
@cd a && make
b:
@cd b && make
c:
@cd c && make
Progetti A e B, sia compilare bene, ma per il 3 ° del progetto, mi dice non c'è niente da fare, anche se il passaggio alla directory C ed eseguendo make in effetti compilare il codice.
Per essere un po 'più specifico: Progetto C nell'esempio di cui sopra è in realtà SpiderMonkey di Mozilla. Mentre A e B sono il codice / makefile che ho scritto, C è solo una copia grezza di SpiderMonkey dal sito di Mozilla. Il comando in realtà compilare per che è:
make JS_DIST=/usr JS_THREADSAFE=1 JS_HAS_FILE_OBJECT=1
Nel mio padrone Makefile, ho:
spidermonkey:
@cd spidermonkey/src && $(MAKE) JS_DIST=/usr JS_THREADSAFE=1 JS_HAS_FILE_OBJECT=1
Running "rendere Spidermonkey" uscite "make: Niente da fare per` spidermonkey'." Come posso fare per eseguire il comando?
EDIT: Ho provato ad aggiungere le seguenti linee al mio makefile:
.PHONY: spidermonkey
Così come rinominare la regola SpiderMonkey al mq, ma ancora nessun cambiamento.
EDIT: Colpa mia! Ho avuto spazi quando mi avrebbe dovuto avere una scheda. doh!
Soluzione
Probabilmente si dispone di un file o la directory toplevel chiamato "SpiderMonkey". Rendere pensa che questo è ciò che la sua supposta per creare, e dal momento che è già lì, soste.
Una delle regole più importanti da seguire quando si scrive makefiles è ogni bersaglio dovrebbe creare un file con lo stesso nome come destinazione . In altre parole, se avete
a:
<some command>
Questo comando dovrebbe produrre un unico file chiamato "a".
Regole che non producono i file, ma sono lì solo come segnaposto vengono chiamati obiettivi fasulli , e dovrebbero essere dichiarate in questo modo:
.PHONY: a
Assicurarsi poi sempre presumere che una deve essere rifatto.
Inoltre, come regola generale, non usare "fare" per invocare fare in modo ricorsivo, usare $ (FARE) al posto .
EDIT: cambiato "pseudo" a "falso"
Altri suggerimenti
Fai controlla solo per l'esistenza di un file (o cartella) denominato lo stesso come l'obiettivo regola, e se non c'è (ed è più recente rispetto le dipendenze), quindi dal punto di vista di make non c'è più nulla da fare.
Quindi, il problema è che si dispone di una regola spidermonkey (senza dipendenze), così come una directory chiamata SpiderMonkey, e poi fare pensa "il target è già fatto, niente da fare per me". Per ottenere far fare quello che vuoi, rinominare la regola SpiderMonkey (o la directory).
A proposito di ricorsiva make a proposito, questa non è una buona idea neccessarily, vedi ricorsivo Fai considerati nocivi .