我用几个编译器得到了以下Makefile,我想通过变量cc循环调用它们:
cc_x64=x86_64-linux-gnu-gcc
cc_mips=mips-linux-gnu-gcc
all:
for arch in "x64" "mips" ; do\
cc="cc_$$arch";\
$($(cc)) some_file -o some_bin
通过$($(cc)),我试图用cc_xxx替换$(cc),然后用我试图执行的实际命令替换它。这在GNU Make的文档中称为计算变量名:https://www.gnu.org/software/make/manual/html_node/Computed-Names.html
出于某种原因,我无法让它发挥作用。我错过了什么?
答案 0 :(得分:1)
如果我觉得有必要使用循环,我会这样做:
COMPS = x86_64-linux-gnu-gcc mips-linux-gnu-gcc
all:
for comp in $(COMPS); do\
$$comp some_file -o some_bin; \
done
答案 1 :(得分:0)
你不能像这样跨越shell / make bound。您正在尝试在shell上下文中即时创建和评估make变量。那不行。
您需要在make或shell中完成所有工作。将那些make变量导出到shell中,然后这样的东西应该起作用:
all:
for arch in x64 mips; do\
cc=cc_$$arch;\
${!cc} some_file -o some_bin.$$arch;\
done
但是,以更加惯用的方式做这件事可能会更好。
看起来更像是这样(未经测试):
all: $(addprefix some_file.,x86 mips)
some_file.%: some_file
$(cc_$(*)) $^ -o $@
答案 2 :(得分:0)
你的问题是"我错过了什么?"答案是,您没有意识到,Makefile的工作方式与shell脚本不同。您正在尝试将一个shell脚本放在Makefile上。这就像你试图把马鞍放在一头牛身上。你和奶牛都会对结果不满意。
你尝试这样做的方式,你不需要Make。只需使用你所拥有的shell脚本" all:"并忘记Make。为什么要试着把马鞍放在牛身上?
如果你想学习如何使用Make,那么请仔细阅读Make手册,特别是研究那里给出的例子。然后你将了解shell脚本和Makefile之间的区别,一切都会更清晰。
我将以Makefiles设计正常工作的正确方式向您展示如何做您想做的事。但是,请更仔细地学习本手册。
RESULTS := $(addprefix some_bin., x86_64 mips)
.PHONY: all
all: $(RESULTS)
$(RESULTS): some_file Makefile
$(patsubst .%,%-linux-gnu-gcc,$(suffix $@)) $< -o $@