依赖于递归make创建的文件

时间:2017-11-07 11:59:33

标签: makefile gnu-make

这是我尝试做的最简单的例子。

目录结构:

.
├── 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
    @:

1 个答案:

答案 0 :(得分:3)

因为您的规则subdir/a.copy: build_subdir没有配方,所以"知道"它实际上无法更改subdir/a.copy上的时间戳。

您需要添加一个虚拟配方,可能是这样的:

subdir/a.copy: build_subdir ;

(注意我现在无法对此进行测试,但我认为它会起作用)。