Dlaczego myślę, że cel jest aktualny?

223

To jest mój 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

Mogę biegać make compilewiele razy i dostać

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

Jednak z jakiegoś powodu bieganie make testzawsze daje

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

nawet jeśli pliki nie są skompilowane. Pytanie brzmi: dlaczego?

Uruchomienie tego samego polecenia działa bezpośrednio:

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)
...
Aleksiej Romanow
źródło

Odpowiedzi:

459

Może masz w katalogu plik / testkatalog. Jeśli ten katalog istnieje i nie ma nowszych zależności, to nie można go odbudować.

Aby wymusić przebudowę na tego rodzaju obiektach niezwiązanych z plikami, należy je podrobić w następujący sposób:

.PHONY: all test clean

Pamiętaj, że możesz tam zadeklarować wszystkie swoje fałszywe cele.

Didier Trosset
źródło
2
Miałem katalog o nazwie build i inny o nazwie lib. Z perspektywy czasu nie są to idealne nazwy docelowe. Ugh ..... marka.
MattD
9
* Gdzie all, testi clearsą twoje docelowe nazwy makefile
ThorSummoner
Innym rozwiązaniem jest zmiana etykiety. W twoim przypadku, zmień testna test_rulelub coś innego.
auraham,
@MattD, ja też, czy to problem dla make?
gromit190,
@Birger, jeśli masz cele, które chcesz wywołać, takie jak „make build” i „make lib” i masz te katalogi, musisz użyć tej strategii lub podobnej.
MattD
34

EDYCJA: Dotyczy to tylko niektórych wersji make - powinieneś sprawdzić swoją stronę podręcznika man.

Możesz także przekazać -Bflagę do make. Zgodnie ze stroną podręcznika:

-B, --always-make Bezwarunkowo uczyń wszystkie cele.

Więc make -B testrozwiązałby twój problem, gdybyś był w sytuacji, w której nie chcesz edytować Makefileani zmieniać nazwy folderu testowego.

jamesc
źródło
-Bjest dla mnie trybem wstecznej kompatybilności ... (Wydaje się, że pytanie nie dotyczy zestawu FreeBSD, OS / GNU)
Gert van den Berg
Och ciekawe ... Czy --always-makedziała dla ciebie?
jamesc
Nie. .PHONYCel wydaje się rodzajem przenośnego mimo ... (Przynajmniej do FreeBSD, nie wiem o takich rzeczach jak Solaris)
Gert van den Berg
1
Jest to sprzeczne z celem make - automatycznego określania, które części programu należy odbudować po zmianie. Jeśli plik makefile potrzebuje --always-makeopcji do działania, plik makefile jest uszkodzony.
osvein
1
@GertvandenBerg .PHONY będzie częścią wydania 8 standardu POSIX austingroupbugs.net/view.php?id=523
osvein
9

Dzieje się tak, gdy masz plik o tej samej nazwie co nazwa docelowa Makefile w katalogu, w którym znajduje się Makefile.

wprowadź opis zdjęcia tutaj

Piyush Sonigra
źródło
To był mój problem. Dzięki!
Aidan Rosswood
1

moim błędem było utworzenie nazwy docelowej „nazwa_pliku.c:” zamiast po prostu „nazwa_pliku:”

ThorSummoner
źródło