为什么认为目标是最新的?

这是我的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) ... 

也许你在目录中有一个名为test的文件/目录。 如果这个目录存在,并且没有更新的依赖关系,那么这个目标不是重build。

为了强制重build这些非文件相关的目标,你应该使它们伪造如下:

 .PHONY: all test clean 

请注意,您可以在那里声明您的所有假冒目标。

编辑:这只适用于一些版本的 – 你应该检查你的手册页。

你也可以通过-B标志来make 。 根据手册页,这是:

-B, --always-make无条件地制定所有目标。

因此,如果您在不想编辑Makefile或更改testing文件夹的名称的情况下, make -B test能够解决您的问题。