Почему вы думаете, что цель обновлена?
Это мой файл 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
несколько раз и получить
[email protected]:~/workspace/gm-controller/lib/erlang-sqlite$ make compile
./rebar get-deps compile
==> erlang-sqlite (get-deps)
==> erlang-sqlite (compile)
Однако по какой-то причине запуск make test
всегда дает
[email protected]:~/workspace/gm-controller/lib/erlang-sqlite$ make test
make: `test' is up to date.
даже если файлы не скомпилированы. Вопрос в том, почему?
Работа с той же самой командой напрямую работает:
[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)
...
Ответы
Ответ 1
Возможно, у вас есть файл/каталог с именем test
в каталоге. Если этот каталог существует и не имеет более поздних зависимостей, эта цель не восстанавливается.
Чтобы принудительно восстановить эти типы не связанных с файлом целей, вы должны сделать их фальшивыми следующим образом:
.PHONY: all test clean
Обратите внимание, что вы можете объявить все свои фиктивные цели там.
Ответ 2
EDIT: это относится только к некоторым версиям make
- вы должны проверить свою страницу руководства.
Вы также можете передать флаг -B
на make
. В соответствии с man-страницей это делает:
-B, --always-make
Безусловно сделать все цели.
Итак, make -B test
решит вашу проблему, если вы оказались в ситуации, когда вы не хотите редактировать Makefile
или изменить имя тестовой папки.
Ответ 3
моя ошибка заключалась в создании целевого имени "filename.c:" вместо просто "filename:"