这是我的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)
...
答案 0 :(得分:363)
也许你在目录中有一个名为test
的文件/目录。如果此目录存在,并且没有更新的依赖项,则不会重建此目标。
要在这些与文件无关的目标上强制重建,你应该按照以下方式使它们变得虚假:
.PHONY: all test clean
请注意,您可以在那里声明所有虚假目标。
答案 1 :(得分:17)
编辑:这仅适用于某些版本的make
- 您应该查看您的手册页。
您也可以将-B
标记传递给make
。根据手册页,这样做:
-B, --always-make
无条件地制作所有目标。
如果您处于不想编辑make -B test
或更改测试文件夹名称的情况,Makefile
可以解决您的问题。
答案 2 :(得分:8)
答案 3 :(得分:0)
我的错误是使目标名称为“ filename.c:”,而不仅仅是“ filename:”