我对运行依赖于生成文件的目标时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'.
为什么会这样?
答案 0 :(得分:1)
您需要使目录成为order-only先决条件,否则每次目录更改时都会重新创建目标;在第二次调用期间work
比work/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 $< $@