GNU Make -动态创建变量名

GNU Make - Dynamically created variable names

本文关键字:创建 变量名 动态 Make GNU      更新时间:2023-10-16

我有一个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. 后试图执行的东西
  3. 我似乎没有分配任何variant_x86,所以语法是关闭的。

如何解决这两个问题?

谢谢。

这与make无关。你想做的是不合法的,就像你写的那样。你不能像这样在shell中创建"动态变量名":

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

如果你想在shell中这样做,你必须使用eval:

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

重写make规则:

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是没有用的。