GNU Make - 动态创建的变量名称

时间:2014-06-19 21:33:26

标签: c++ c makefile gnu-make

我有一个makefile设置,它接受一个命令行参数,该参数在构建时被解析以确定使用哪个编译器CPULIST

所以,我打算通过以下命令构建:make all CPULIST="arm x86"。然后我创建了一些虚假的规则,以便make all循环并有效地执行:

make all CPULIST=x86
make all CPULIST=arm

规则:

.PHONY: all
all:
    @echo "Detected CPULIST:${CPULIST_DETECTED}"
    @echo "CPULIST:${CPULIST}"
    @for cpu in $(CPULIST_DETECTED); do         \
        echo "CPU:$${cpu}";                      \
        variant_$${cpu}=abc;                        \
        echo "variant_$${cpu}: $${variant_x86}"; \
        $(MAKE) build CPULIST=$$cpu;             \
    done
    @true

.PHONY: build
build: sanity_check $(TARGET)
    @true

如果这是一个bash脚本,我会使用variant_${cpu}来让它动态创建变量名称和赋值,如:

variant_x86=abc;
variant_arm=abc;

似乎我没有使转义序列正确,至少在GNU make语法中是这样。

为list_algorithms.o构建依赖项文件

Detected CPULIST:x86 arm
CPULIST:test arm x86
CPU:x86
/bin/sh: 3: variant_x86=abc: not found
variant_x86:
make[1]: Entering directory `/home/svn/public/lib/libMYLib'
CPULIST:x86

我似乎遇到了两个问题:

  1. 我的字符串扩展似乎是makefile在扩展后尝试执行的内容
  2. 我似乎没有为variant_x86分配任何内容,因此语法已关闭。
  3. 如何解决这两个问题?

    谢谢。

1 个答案:

答案 0 :(得分:6)

这与make无关。正如你所写的那样,你想要做的事情在shell中是不合法的。您不能在shell中创建“动态变量名称”,如下所示:

$ a=foo
$ xxx$a=baz
xxxfoo=baz: command not found

如果你想在shell中执行此操作,则必须使用eval:

$ a=foo
$ eval xxx$a=baz
$ echo $xxxfoo
baz

重写你的制作规则:

all:
        @echo "Detected CPULIST:${CPULIST_DETECTED}"
        @echo "CPULIST:${CPULIST}"
        @for cpu in $(CPULIST_DETECTED); do          \
            echo "CPU:$${cpu}";                      \
            eval variant_$${cpu}=abc;                \
            echo "variant_$${cpu}: $${variant_x86}"; \
            $(MAKE) build CPULIST=$$cpu;             \
        done

此外,在此配方末尾添加@true是没有用的。