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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (39)

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

用户回答回答于

可以通过-B旗子make...。根据手册页:

-B, --always-makeUnconditionally make all targets.

如果您处于不想编辑Makefile或者更改测试文件夹的名称,可以:

make -B test

扫码关注云+社区