gpt4 book ai didi

linux - makefile 配方中的 Foreach 模板

转载 作者:行者123 更新时间:2023-12-05 00:50:13 24 4
gpt4 key购买 nike

鉴于以下 Makefile 片段:

TOOLS=foo bar

define TOOL_install
install -c $(1) $$(prefix)/bin/$(1)
endef

.PHONY: install
install: all
$(foreach tool,$(TOOLS),$(eval $(call TOOL_install,$(tool))))

为什么 make install 会打印“Nothing to be done for `install'”。而不是执行 foreach 指定的命令? (foreach 之前有一个选项卡,我尝试在 TOOL_install 定义中放置一个选项卡;它没有帮助。)

根据make -p,安装目标没有命令,这显然不是预期的。

在同一个 makefile 的其他地方,我成功地使用了相同的技术来创建包括命令配方在内的整个规则;如何在现有规则内完成这项工作?

(如果我将 eval 替换为 info 那么它会打印出我期望它运行的命令。)

在这个简单的例子中,我可以通过内联命令来让它工作:

install: all
@$(foreach tool,$(TOOLS),install -c $(tool) $(prefix)/bin/$(tool) ; )

但我想知道如何让第一个表单按预期工作,以防我将来需要更复杂的东西。

最佳答案

你不应该在这里使用 eval,因为你不想创建 dynamic constructs常量规则。所以只需删除 eval 并在 TOOL_install 定义的末尾添加一个 ; :

TOOLS := foo bar

define TOOL_install
echo $(1);
endef

.PHONY: install
install:
$(foreach tool,$(TOOLS),$(call TOOL_install,$(tool)))

扩展之后,您的 Makefile 将如下所示:

.PHONY: install
install:
echo foo; echo bar;

另一个答案:

我们正在使用一些临时目标 install_fooinstall_bar。这两个目标被添加到 install 依赖项中并在之后声明。此外,在每个临时目标中,我们添加有关要安装的文件的依赖项(foobar)。这样您就可以根据需要添加规则,而且它是“并行兼容的”。

prefix := foobar
TOOLS := foo bar

install: $(addprefix install_,$(TOOLS))

$(addprefix install_,$(TOOLS)): install_%: %
install -c $< $(prefix)/bin/$<

.PHONY: install $(addprefix install_,$(TOOLS))

编辑:

对于 uninstal 目标(没有依赖项),您可以使用 patsubst函数如下:

prefix := foobar
TOOLS := foo bar

uninstall: $(addprefix uninstall_,$(TOOLS))

$(addprefix uninstall_,$(TOOLS)):
install -c $(patsubst uninstall_%,%,$@) $(prefix)/bin/$(patsubst uninstall_%,%,$@)

.PHONY: uninstall $(addprefix uninstall_,$(TOOLS))

关于linux - makefile 配方中的 Foreach 模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24239051/

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