这是我尝试做的最简单的例子。
目录结构:
.
├── Makefile
└── subdir
├── a
└── Makefile
./子目录/生成文件:
a.copy: a
cp a a.copy
./生成文件:
.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
@:
答案 0 :(得分:3)
因为您的规则subdir/a.copy: build_subdir
没有配方,所以"知道"它实际上无法更改subdir/a.copy
上的时间戳。
您需要添加一个虚拟配方,可能是这样的:
subdir/a.copy: build_subdir ;
(注意我现在无法对此进行测试,但我认为它会起作用)。