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


223

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

Answers:


459

也许您在目录中有一个文件/ test目录。如果此目录存在,并且没有最新的依赖关系,则不会重建此目标。

要强制在这些与文件无关的目标上进行重建,应使它们成为伪造,如下所示:

.PHONY: all test clean

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


2
我有一个名为build的目录,另一个名为lib的目录。事后看来,这些并不是完美的目标名称。gh .... make。
MattD

9
*其中alltestclear是您的makefile目标名称
ThorSummoner 2015年

另一个解决方案是更改标签。在你的情况,改变testtest_rule什么不同。
auraham

@MattD我也可以吗?
gromit190 '16

@Birger如果您具有要调用的目标(例如“ make build”和“ make lib”)并且存在这些目录,则需要使用此策略或类似的策略。
MattD

34

编辑:这仅适用于的某些版本make-您应检查手册页。

您也可以将-B标志传递给make。根据手册页,这样做:

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

因此make -B test,如果您不想编辑Makefile或更改测试文件夹的名称,则可以解决您的问题。


-B对我来说是向后兼容的模式...(似乎没有指定FreeBSD,OS / GNU工具包)
Gert van den Berg

噢,有趣... --always-make对您有用吗?
jamesc

不。尽管.PHONY目标似乎是可移植的……(至少对于FreeBSD而言,不确定Solaris之类的东西)
Gert van den Berg

1
这违背了make的目的-更改后自动确定需要重新构建程序的哪些部分。如果您的makefile需要该--always-make选项才能工作,则您的makefile损坏。
osvein

1
@GertvandenBerg .PHONY将成为POSIX标准的第8期的一部分austingroupbugs.net/view.php?id=523
osvein


1

我的错误是使目标名称为“ filename.c:”,而不仅仅是“ filename:”

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.