Makefile和计算变量名

时间:2014-09-12 19:52:22

标签: makefile cross-compiling gnu-make

我用几个编译器得到了以下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

出于某种原因,我无法让它发挥作用。我错过了什么?

3 个答案:

答案 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 $@