2010-10-14 14 views
123

Questo è il mio Makefile:Perché pensare che l'obiettivo sia aggiornato?

REBAR=./rebar 
REBAR_COMPILE=$(REBAR) get-deps compile 

all: compile 

compile: 
    $(REBAR_COMPILE) 

test: 
    $(REBAR_COMPILE) skip_deps=true eunit 

clean: 
    -rm -rf deps ebin priv doc/* 

docs: 
    $(REBAR_COMPILE) doc 

ifeq ($(wildcard dialyzer/sqlite3.plt),) 
static: 
    $(REBAR_COMPILE) build_plt analyze 
else 
static: 
    $(REBAR_COMPILE) analyze 
endif 

posso correre make compile più volte e ottenere

[email protected]:~/workspace/gm-controller/lib/erlang-sqlite$ make compile 
./rebar get-deps compile 
==> erlang-sqlite (get-deps) 
==> erlang-sqlite (compile) 

Tuttavia, per qualche motivo, l'esecuzione make test dà sempre

[email protected]:~/workspace/gm-controller/lib/erlang-sqlite$ make test 
make: `test' is up to date. 

anche se i file sono non compilato. La domanda è, perché?

esecuzione lo stesso comando lavora direttamente:

[email protected]:~/workspace/gm-controller/lib/erlang-sqlite$ ./rebar get-deps compile skip_deps=true eunit 
==> erlang-sqlite (get-deps) 
==> erlang-sqlite (compile) 
Compiled src/sqlite3_lib.erl 
Compiled src/sqlite3.erl 
==> erlang-sqlite (eunit) 
... 

risposta

265

Forse hai un file/directory denominata test nella directory. Se questa directory esiste e non ha dipendenze più recenti, questa destinazione non viene ricostruita.

Per forzare ricostruire su questo tipo di obiettivi non-relative ai file, si dovrebbe fare di loro falsa come segue:

.PHONY: all test clean 

Si noti che è possibile dichiarare tutti i tuoi obiettivi falsi lì.

+0

Avevo una directory chiamata build e un'altra chiamata lib. Col senno di poi, questi non sono nomi di obiettivi perfetti. Ugh ..... fare. – MattD

+1

* Dove 'all',' test' e 'clear' sono i nomi dei target makefile – ThorSummoner

+0

Un'altra soluzione sta cambiando l'etichetta. Nel tuo caso, cambia 'test' per' test_rule' o qualcosa di diverso. – auraham

8

MODIFICA: questo vale solo per alcune versioni di make - è necessario controllare la pagina man.

È anche possibile passare il flag -B a make. Come per la pagina man, questo fa:

-B, --always-make Eseguire incondizionatamente tutti gli obiettivi.

Così make -B test risolverebbe il problema se si fosse in una situazione in cui non si desidera modificare il Makefile o modificare il nome della cartella di prova.

+0

'-B' è la modalità compatibile con le versioni precedenti per me ... (FreeBSD, il toolkit OS/GNU non sembra essere specificato in questione) –

+0

Oh interessante ...' 'sempre funziona per te? – jamesc

+0

No. L'obiettivo '.PHONY' sembra però abbastanza portatile ... (almeno per FreeBSD, non sono sicuro di cose come Solaris) –

Problemi correlati