Perché pensare che l'obiettivo sia aggiornato?


224

Questo è il mio Makefile:

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 compilepiù volte e ottenere

aromanov@alexey-desktop:~/workspace/gm-controller/lib/erlang-sqlite$ make compile
./rebar get-deps compile
==> erlang-sqlite (get-deps)
==> erlang-sqlite (compile)

Tuttavia, per qualche motivo, correre make testdà sempre

aromanov@alexey-desktop:~/workspace/gm-controller/lib/erlang-sqlite$ make test
make: `test' is up to date.

anche se i file non sono compilati. La domanda è: perché?

L'esecuzione dello stesso comando funziona direttamente:

aromanov@alexey-desktop:~/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)
...

Risposte:


460

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

Per forzare la ricostruzione su questo tipo di destinazioni non correlate al file, è necessario renderle false come segue:

.PHONY: all test clean

Nota che puoi dichiarare lì tutti i tuoi bersagli fasulli.


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

9
* Where all, teste clearsono i nomi dei target del tuo makefile
ThorSummoner,

Un'altra soluzione sta cambiando l'etichetta. Nel tuo caso, cambia testper test_ruleo qualcosa di diverso.
Auraham,

@MattD anche io, è un problema per make?
gromit190,

@Birger se hai obiettivi che vuoi invocare come "make build" e "make lib" e hai quelle directory presenti, allora dovrai usare questa strategia o una simile.
MattD,

34

EDIT: Questo vale solo per alcune versioni di make- dovresti controllare la tua pagina man.

Puoi anche passare la -Bbandiera a make. Secondo la pagina man, questo fa:

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

Quindi make -B testrisolverei il tuo problema se ti trovassi in una situazione in cui non vuoi modificare Makefileo cambiare il nome della tua cartella di test.


-Bè una modalità retrocompatibile per me ... (FreeBSD, OS / GNU toolkit non sembra essere specificato in questione)
Gert van den Berg

Oh interessante ... Funziona --always-makeper te?
Jamesc

No. Il .PHONYbersaglio sembra portatile ... (almeno per FreeBSD, non sono sicuro di cose come Solaris)
Gert van den Berg

1
Ciò sfida lo scopo del make - determinare automaticamente quali parti di un programma devono essere ricostruite dopo una modifica. Se il tuo makefile ha bisogno --always-makedell'opzione per funzionare, il tuo makefile è rotto.
Osvein,

1
@GertvandenBerg .PHONY farà parte del numero 8 dello standard POSIX austingroupbugs.net/view.php?id=523
osvein,

10

Succede quando hai un file con lo stesso nome del nome di destinazione Makefile nella directory in cui è presente Makefile.

inserisci qui la descrizione dell'immagine


Questo era il mio problema Grazie!
Aidan Rosswood,

1

il mio errore è stato quello di creare il nome target "nomefile.c:" anziché solo "nomefile:"

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.