Makefile目标依赖于生成的文件

时间:2016-06-10 00:50:15

标签: makefile gnu-make

我对运行依赖于生成文件的目标时Make的行为有疑问。

鉴于下面的源代码树和Makefile,当我运行它时,即使所有内容都是在第一次运行时生成的,也需要两次运行来完成“构建”。

$ ls -R
.:
bar  foo  Makefile

生成文件

all: foobar

work:
    mkdir -p work

work/foo: work foo
    cp foo work/foo

work/bar: work bar
    cp bar work/bar

foobar: work/foo work/bar

使

$ make
mkdir -p work
cp foo work/foo
cp bar work/bar
$ ls -R
.:
work/  bar  CMakeLists.txt  foo  Makefile

./work:
bar  foo
$ make
cp foo work/foo
$ make
make: Nothing to be done for 'all'.

为什么会这样?

1 个答案:

答案 0 :(得分:1)

您需要使目录成为order-only先决条件,否则每次目录更改时都会重新创建目标;在第二次调用期间workwork/foo更新,因为在work/bar之后创建了work/foo,因此work的时间戳比work/foo更新。

work/foo: foo | work
    cp foo work/foo

work/bar: bar | work
    cp bar work/bar

或者更简洁

work/foo work/bar: work/%: % | work
    cp $< $@