为什么认为目标是最新的?
这是我的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
能够解决您的问题。