&2; cat ta-6ren">
gpt4 book ai didi

makefile - 将先决条件扩展推迟到(不同的)目标创建之后

转载 作者:行者123 更新时间:2023-12-05 04:06:56 25 4
gpt4 key购买 nike

我希望能够在 GNU make 的另一个规则的先决条件中使用在一个规则中创建的目标的结果。例如:

PREREQ = $(shell echo "reading target1" >&2; cat target1)

target1:
echo "prereq" > $@

target2: target1 $(PREREQ)
echo foo > $@

target2 应该依赖于从 target1 文件中读取的 prereq,但直到 target1 配方被执行。

当然,这是一个非常人为的示例,我确信有很多关于如何重构这个特定示例的建议,但我不打算重构这个示例。这只是我的更复杂问题的一个简化示例,我需要从一个文件的内容中获取先决条件,该文件直到执行 Makefile 中的配方才被创建。

问题是,[如何]扩展 $(PREREQ)(因此 $(shell cat target1) 的执行推迟到target1 规则实际执行了吗?

更新:我尝试了 .SECONDARYEXPANSION: 但这似乎无法完成工作:

$ make -d target2
...
reading target1
cat: target1: No such file or directory
...
Updating goal targets....
Considering target file 'target2'.
File 'target2' does not exist.
Considering target file 'target1'.
File 'target1' does not exist.
Finished prerequisites of target file 'target1'.
Must remake target 'target1'.
echo "prereq" > target1
[ child management ]
Successfully remade target file 'target1'.
Finished prerequisites of target file 'target2'.
Must remake target 'target2'.
echo foo > target2
[ child management ]
Successfully remade target file 'target2'.

如您所见,“reading target”在一开始只打印了一次,表明 PREREQ 由于 .SECONDEXPANSION: 和列表而没有再次展开考虑target2 的目标不包括prereq

最佳答案

延迟扩展先决条件$(PREREQ)可以通过有条件地创建target2并依赖递归来实现:

ifndef expand-prereq
target2: target1
$(MAKE) --no-print-directory -f $(lastword $(MAKEFILE_LIST)) $@ expand-prereq=y
else
target2: target1 $(PREREQ)
echo foo > $@
endif

make 第一次为此 makefile 运行时,变量 expand-prereq 未定义,因此生成第一个 targe2 规则作为条件的结果。这种虚拟规则可以在不扩展 $(PREREQ) 的情况下更新 target1。匹配此规则会导致更新 target1(因为 target1 是此规则的先决条件)并且 递归调用 make 对于相同的 makefile 并使用 target2 作为目标。

第二次 make 被(递归地)调用,变量 expand-prereq 是通过命令行参数 expand-prereq=y 定义的,所以第二条target2规则是这次else分支的结果。此规则是实际生成目标 target2 的规则。请注意,在匹配此规则之前,target1 已作为第一个虚拟规则的副作用创建,因此 $(PREREQ) 的扩展发生在 target1 已创建(您正在寻找的内容)。

关于makefile - 将先决条件扩展推迟到(不同的)目标创建之后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49286398/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com