这是我的 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
的文件/目录。如果此目录存在,并且没有更新的依赖项,则不会重建此目标。
要在这些与文件无关的目标上强制重建,您应该使它们变得虚假,如下所示:
.PHONY: all test clean
请注意,您可以在此处声明所有虚假目标。
虚假目标是不是真正的文件名的目标。相反,它只是您提出明确请求时要执行的配方的名称。
当您在 Makefile 所在的目录中有一个与 Makefile 目标名称相同的文件时,就会发生这种情况。
https://i.stack.imgur.com/VlsBA.png
编辑:这只适用于某些版本的 make
- 你应该检查你的手册页。
您还可以将 -B
标志传递给 make
。根据手册页,这样做:
-B, --always-make 无条件地生成所有目标。
因此,如果您不想编辑 Makefile
或更改测试文件夹的名称,make -B test
将解决您的问题。
-B
对我来说是向后兼容的模式...(似乎没有指定 FreeBSD、OS / GNU 工具包)
--always-make
对您有用吗?
.PHONY
目标似乎有点可移植......(至少对于 FreeBSD,不确定 Solaris 之类的东西)
--always-make
选项才能工作,则您的 makefile 已损坏。
我的错误是将目标名称设为“filename.c:”而不仅仅是“filename:”
all
、test
和clear
是您的 makefile 目标名称test
更改为test_rule
或其他内容。