GNU制作 - 动态创建变量名(GNU Make - Dynamically created var

2019-10-20 07:27发布

我有一个生成文件的设置,其中它接受被在构建时解析,以确定要使用的编译器,命令行参数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做语法。

大厦的依赖文件为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 ,所以语法是关闭的。

如何解决这两个问题?

谢谢。

Answer 1:

这有没有关系作。 你正在试图做的是不合法的,因为你写它,在shell。 您不能创建在这样的壳“动态变量名”:

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

如果你想这样做的外壳,你必须使用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在这个配方结束已经没有用了。



文章来源: GNU Make - Dynamically created variable names