我有一个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
我似乎遇到了两个问题:
variant_x86
分配任何内容,因此语法已关闭。如何解决这两个问题?
谢谢。
答案 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
是没有用的。