【发布时间】:2018-04-19 19:49:17
【问题描述】:
这是我正在尝试做的一个最小示例。
目录结构:
.
├── Makefile
└── subdir
├── a
└── Makefile
./subdir/Makefile:
a.copy: a
cp a a.copy
./Makefile:
.PHONY: build_subdir
a.copy: subdir/a.copy
cp subdir/a.copy a.copy
build_subdir:
$(MAKE) -C subdir
subdir/a.copy: build_subdir
第一次运行make,一切正常:
$ make
make -C subdir
make[1]: Entering directory `/home/kkourt/src/tests/make/subdir'
cp a a.copy
make[1]: Leaving directory `/home/kkourt/src/tests/make/subdir'
cp subdir/a.copy a.copy
重新运行 make 也可以(没有任何反应):
$ make
make -C subdir
make[1]: Entering directory `/home/kkourt/src/tests/make/subdir'
make[1]: `a.copy' is up to date.
make[1]: Leaving directory `/home/kkourt/src/tests/make/subdir'
如果我更新subdir/a,但是./a 不会更新:
$ touch subdir/a
$ make
make -C subdir
make[1]: Entering directory `/home/kkourt/src/tests/make/subdir'
cp a a.copy
make[1]: Leaving directory `/home/kkourt/src/tests/make/subdir'
如果我第二次运行make,./a 得到更新
$ make
make -C subdir
make[1]: Entering directory `/home/kkourt/src/tests/make/subdir'
make[1]: `a.copy' is up to date.
make[1]: Leaving director
为什么会这样?不应该检查subdir/a.copy 是否早于a.copy 发生在 build_subdir 目标完成后,因为它是它的依赖项?有没有办法解决这个问题?
编辑:
正如 MadScientist 建议的那样,我添加了一个虚拟食谱,它可以工作:
subdir/a.copy: build_subdir
@:
【问题讨论】:
-
这可能无关紧要,因为这是一次构建目标,但请注意,这个“虚拟”配方仍然会导致 make 调用子 shell。请注意,该评论不被视为做出评论,因此子shell 将发送文本
true # dummy recipe。如果您担心目标的性能,您应该选择一个空配方,或者像@:这样的配方,它知道是一个无操作并且不会启动一个shell(但仍然会明白它需要重新检查时间戳)。 -
@MadScientist 谢谢!我编辑了我的答案以包括无操作食谱。我更喜欢你原来的答案中的这个,因为它更清楚地看到发生了什么。