Почему заставляет думать, что цель актуальна?


224

Это мой 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

Я могу запустить make compileнесколько раз и получить

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

Однако по какой-то причине бег make testвсегда дает

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

даже если файлы не скомпилированы. Вопрос в том, почему?

Выполнение этой же команды напрямую работает:

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)
...

Ответы:


460

Может быть, у вас есть файл / каталог с именем testв каталоге. Если этот каталог существует и не имеет более новых зависимостей, тогда эта цель не перестраивается.

Для принудительного перестроения таких целей, не связанных с файлами, вы должны сделать их фальшивыми:

.PHONY: all test clean

Обратите внимание, что вы можете объявить все свои фальшивые цели там.


2
У меня был каталог под названием build, а другой - lib. Оглядываясь назад, это не идеальные целевые имена. Уф ..... сделать.
MattD

9
* Где all, testи clearваши целевые имена Makefile
ThorSummoner

Еще одно решение - смена этикетки. В вашем случае поменяйте testна test_ruleили что-то другое.
Авраам

@ MattD я тоже, это проблема для make?
gromit190

@Birger Если у вас есть цели, которые вы хотите вызвать, такие как «make build» и «make lib», и у вас есть эти каталоги, то вам нужно будет использовать эту стратегию или такую, как она.
MattD

34

РЕДАКТИРОВАТЬ: Это относится только к некоторым версиям make- вы должны проверить свою справочную страницу.

Вы также можете передать -Bфлаг make. Согласно man-странице, это делает:

-B, --always-make Безоговорочно ставить все цели.

Так make -B testбы решить вашу проблему , если вы были в ситуации , когда вы не хотите , чтобы отредактировать Makefileили изменить имя папки тестирования.


-Bдля меня это режим обратной совместимости ... (Набор инструментов FreeBSD, OS / GNU, кажется, не указан в вопросе)
Герт ван ден Берг

Ох, интересно ... У --always-makeтебя работает?
Jamesc

Нет. .PHONYЦель кажется вид портативного , хотя ... (По крайней мере , на FreeBSD, не уверен , о том , как Solaris)
Герт ван ден Берг

1
Это не соответствует цели make - автоматически определяет, какие части программы необходимо перестроить после изменения. Если вашему make-файлу нужна --always-makeопция, ваш make-файл не работает.
Освеин

1
@GertvandenBerg .PHONY станет частью проблемы 8 стандарта POSIX austingroupbugs.net/view.php?id=523
osvein


1

моя ошибка заключалась в создании целевого имени «filename.c:» вместо просто «filename:»

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.