Warum glaubt man, das Ziel sei aktuell?

223

Das ist mein 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

Ich kann make compilemehrmals laufen und bekommen

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

Aus irgendeinem Grund make testgibt Laufen jedoch immer

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

auch wenn die Dateien nicht kompiliert sind. Die Frage ist, warum?

Das Ausführen des gleichen Befehls funktioniert direkt:

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)
...
Alexey Romanov
quelle

Antworten:

459

Möglicherweise haben Sie eine Datei / ein Verzeichnis mit dem Namen testim Verzeichnis. Wenn dieses Verzeichnis vorhanden ist und keine neueren Abhängigkeiten aufweist, wird dieses Ziel nicht neu erstellt.

Um die Wiederherstellung dieser Art von nicht dateibezogenen Zielen zu erzwingen, sollten Sie sie wie folgt fälschen:

.PHONY: all test clean

Beachten Sie, dass Sie dort alle Ihre falschen Ziele deklarieren können.

Didier Trosset
quelle
2
Ich hatte ein Verzeichnis namens build und ein anderes namens lib. Im Nachhinein sind dies keine perfekten Zielnamen. Ugh ..... machen.
MattD
9
* Wo all, testund clearsind Ihre Makefile-
Zielnamen
Eine andere Lösung ist das Ändern des Etiketts. In Ihrem Fall ändern Sie testfür test_ruleoder etwas anderes.
Auraham
@MattD ich auch, ist das ein Problem für machen?
Gromit190
@Birger Wenn Sie Ziele haben, die Sie aufrufen möchten, wie "make build" und "make lib", und diese Verzeichnisse vorhanden sind, müssen Sie diese oder eine ähnliche Strategie verwenden.
MattD
34

BEARBEITEN: Dies gilt nur für einige Versionen von make- Sie sollten Ihre Manpage überprüfen.

Sie können die -BFlagge auch an übergeben make. Laut Manpage bedeutet dies:

-B, --always-make Machen Sie bedingungslos alle Ziele.

So make -B testwürde Ihr Problem lösen , wenn Sie in einer Situation sind , wo Sie bearbeiten wollen nicht die Makefileoder den Namen Ihres Testordners ändern.

jamesc
quelle
-Bist abwärtskompatibler Modus für mich ... (FreeBSD, OS / GNU Toolkit scheint nicht in Frage gestellt zu sein)
Gert van den Berg
Oh interessant ... Funktioniert das --always-makefür dich?
Jamesc
Nee. Das .PHONYZiel scheint jedoch irgendwie tragbar zu sein ... (Zumindest für FreeBSD, nicht sicher über Dinge wie Solaris)
Gert van den Berg
1
Dies widerspricht dem Zweck, automatisch zu bestimmen, welche Teile eines Programms nach einer Änderung neu erstellt werden müssen. Wenn Ihr Makefile die --always-makeOption zum Arbeiten benötigt, ist Ihr Makefile beschädigt.
Osvein
1
@GertvandenBerg .PHONY wird Teil von Ausgabe 8 des POSIX-Standards austingroupbugs.net/view.php?id=523 sein
osvein
9

Dies passiert, wenn Sie eine Datei mit demselben Namen wie der Makefile-Zielname in dem Verzeichnis haben, in dem sich das Makefile befindet.

Geben Sie hier die Bildbeschreibung ein

Piyush Sonigra
quelle
Das war mein Problem. Vielen Dank!
Aidan Rosswood
1

Mein Fehler war, den Zielnamen "Dateiname.c:" anstelle von "Dateiname:" zu machen.

ThorSummoner
quelle