【问题标题】:dependency on file created by recursive make对递归make创建的文件的依赖
【发布时间】: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 谢谢!我编辑了我的答案以包括无操作食谱。我更喜欢你原来的答案中的这个,因为它更清楚地看到发生了什么。

标签: makefile gnu-make


【解决方案1】:

由于您的规则 subdir/a.copy: build_subdir 没有配方,因此“知道”它实际上无法更改 subdir/a.copy 上的时间戳。

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

subdir/a.copy: build_subdir ;

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

【讨论】:

    猜你喜欢
    • 2011-03-20
    • 1970-01-01
    • 2011-01-13
    • 2017-06-13
    • 2020-08-22
    • 1970-01-01
    • 2011-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多