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

Ale*_*nov 197 makefile

这是我的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
Run Code Online (Sandbox Code Playgroud)

我可以make compile多次运行并获得

aromanov@alexey-desktop:~/workspace/gm-controller/lib/erlang-sqlite$ make compile
./rebar get-deps compile
==> erlang-sqlite (get-deps)
==> erlang-sqlite (compile)
Run Code Online (Sandbox Code Playgroud)

但是,出于某种原因,跑步make test总是给出

aromanov@alexey-desktop:~/workspace/gm-controller/lib/erlang-sqlite$ make test
make: `test' is up to date.
Run Code Online (Sandbox Code Playgroud)

即使文件没有编译.问题是,为什么?

直接运行相同的命令:

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)
...
Run Code Online (Sandbox Code Playgroud)

Did*_*set 409

也许你有一个test在目录中命名的文件/ 目录.如果此目录存在,并且没有更新的依赖项,则不会重建此目标.

要强制在这些与文件无关的目标上进行重建,您应该按照以下方式使它们变为虚假:

.PHONY: all test clean
Run Code Online (Sandbox Code Playgroud)

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

  • *其中`all`,`test`和`clear`是你的makefile目标名称 (8认同)
  • 我有一个名为build的目录,另一个名为lib的目录。事后看来,这些并不是完美的目标名称。gh .... make。 (2认同)

Piy*_*gra 39

当 Makefile 所在的目录中有一个与 Makefile 目标名称同名的文件时,就会发生这种情况。

在此处输入图片说明


jam*_*esc 26

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

你也可以将-B旗帜传递给make.根据手册页,这样做:

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

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

  • 这违背了 make 的目的——自动确定程序的哪些部分需要在更改后重建。如果你的 makefile 需要 `--always-make` 选项才能工作,那么你的 makefile 就被破坏了。 (2认同)
  • @GertvandenBerg .PHONY 将成为 POSIX 标准第 8 期的一部分 http://austingroupbugs.net/view.php?id=523 (2认同)

Tho*_*ner 6

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