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!

È stato utile?

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 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top