gpt4 book ai didi

Makefile:在配方中定义规则和先决条件

转载 作者:行者123 更新时间:2023-12-04 02:10:21 24 4
gpt4 key购买 nike

我有一个设置,我想用 make 处理的文件依赖于另一个程序的输出。构建程序及其所有先决条件 这也是一项复杂的任务,所以我也想为此使用 make 。现在我的问题是,似乎无法在 Makefile 配方中生成规则和先决条件。考虑以下代码:

bar:
echo target1 target2 target3 > bar

foo: bar
$(eval BAR := $(shell cat bar))

define FUN
$(1):
touch a$(1)
endef

ifdef BAR
$(foreach i,$BAR,$(eval $(call FUN,$(i))))
endif

blub: foo $(BAR)

我用 bar 配方替换了一大组复杂的配方,这些配方最终生成了我想要的文件列表。实际上,生成 bar 的内容非常复杂,应该通过一组 Makefile 配方来完成,而不能仅通过(如上所示):

BAR:=$(shell echo target1 target2 target3)

我想将 foreach 循环放入 foo 的配方中,但是由于 prerequisites cannot be defined in recipes 而失败,这是有道理的并且在 function define in makefile 中也有解释

但似乎当我做 make blub 时,当 foo eval 的 BAR 为不同的值时,blub 不会重新计算。

所以我认为最终我要寻找两件事:

  • 我如何在运行时根据(并依赖于)另一个配方(在本例中为 bar)输出的内容动态生成配方?

  • 我如何在运行时根据(并依赖于)另一个配方(bar)动态更新目标(在本例中为 blub)的先决条件> 在这种情况下)输出?

谢谢!

编辑:解决方案

在@user657267 的帮助下,以下似乎解决了我的问题:

.PHONY: all
all: blub

-include bar.make

.PHONY: blub
blub: $(BAR)
echo $^

bar.make: Makefile
printf 'BAR=target1 target2 target3\n' > $@
printf 'target1 target2 target3:\n' >>$@
printf '\ttouch $$@' >> $@

.PHONY: clean
clean:
rm -f target1 target2 target3 bar.make

最佳答案

听起来你应该使用 make 的 self 改造功能

-include bar.make

blub: $(BAR)
@echo $^

bar.make:
@echo BAR := target1 target2 target3 > $@
@echo target1 target2 target3: ; touch $$@ >> $@

显然 bar.make 的配方是人为设计的,在现实世界中,它们可能会调用某种输出有效 makefile 的脚本。

关于Makefile:在配方中定义规则和先决条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39188323/

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