gpt4 book ai didi

Makefile定义: recursive expansion question

转载 作者:行者123 更新时间:2023-12-02 08:01:20 24 4
gpt4 key购买 nike

在 makefile 中,我使用 define 指令定义一个变量。该变量将保存我想要执行的可配置命令列表。

我希望此变量获取文件列表(例如 .foo 文件)。这些文件是在 makefile 执行期间创建的。例如makefile:

MY_VAR = $(wildcard *.foo)
define MY_VAR2
echo $(1) $(MY_VAR)
endef

foo: create_files
$(call MY_VAR2, ls)
rm -f *.foo

create_files:
touch foo.foo
touch bar.foo

我没有得到想要的结果。看来MY_VAR2是在声明时评估的。

有没有办法获得所需的行为?

<小时/>

编辑:

$(shell) 命令,如 sateesh正确指出,适用于上面的示例。但是,它不适用于下面的示例。此示例的主要区别在于新文件是在 MY_VAR2 内创建的。

MY_VAR = $(wildcard *.foo) 
TEST_VAR = $(shell ls *.foo)

define MY_VAR2
@touch foo.foo
@touch bar.foo
@echo "MY_VAR" $(1) $(MY_VAR)
@echo "TEST_VAR" $(1) $(TEST_VAR)
endef

foo:
$(call MY_VAR2, ls)
@rm -f *.foo

我可以通过添加规则来解决上述问题。有没有更简单的方法?

最佳答案

在我看来,您正在滥用 make,试图在 make 中编写 shell 脚本。

如果你写一个shell脚本,就写一个shell脚本。您按顺序执行命令,并且可以知道执行每一行时存在哪些文件。

touch foo.foo
touch bar.foo
your-command `ls *.foo`

另一方面,如果你想使用make,那么就有规则和依赖关系,如果你采用make的思维方式,你甚至不需要使用define。

foo: create_files
your-command $(wildcard *.foo)
rm -f *.foo

create_files:
touch foo.foo
touch bar.foo

关于Makefile定义: recursive expansion question,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1994339/

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