我有一个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
我好像有两个问题:
我的字符串扩展似乎是makefile在扩展后尝试执行的东西
我似乎没有任何分配variant_x86
,所以语法是关闭的.
我该如何解决这两个问题?
谢谢.
这与make无关.正如你所写的那样,你想要做的事情在shell中是不合法的.您无法在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
在此配方的末尾添加a 是没有用的.