C++ GNU Make-动态创建的变量名
我有一个makefile设置,它接受一个命令行参数,该参数在构建时被解析以确定要使用哪个编译器,C++ GNU Make-动态创建的变量名,c++,c,makefile,gnu-make,C++,C,Makefile,Gnu Make,我有一个makefile设置,它接受一个命令行参数,该参数在构建时被解析以确定要使用哪个编译器,CPULIST 因此,我计划通过以下命令进行构建:makeallcpulist=“armx86”。然后,我创建了一些虚假规则,以便进行所有的循环,并有效地执行以下操作: make all CPULIST=x86 make all CPULIST=arm 规则: .PHONY: all all: @echo "Detected CPULIST:${CPULIST_DETECTED}"
CPULIST
因此,我计划通过以下命令进行构建:makeallcpulist=“armx86”
。然后,我创建了一些虚假规则,以便进行所有的循环,并有效地执行以下操作:
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\u 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
因此,请重写您的生成规则:
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
也没有用。这与制作无关。你试图做的事情是不合法的,正如你在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
也没有用。我忘了一件事。如何将echo“variant\u${cpu}:$${variant\ux86}”
更新为类似echo“variant\u${cpu}:$$${variant\u${cpu}”
?您必须再次使用eval
:在shell提示下,它将是:eval echo variant\u${cpu}:${variant\u${cpu}
,因此在makefile中,您必须将美元符号加倍,例如:eval echo variant\u\$${cpu}:\$${variant\u$$${cpu}}
。基本上,编写makefile配方的方法是:首先让命令在shell提示符下工作,然后将其放入makefile配方中,并将美元符号加倍。谢谢。最后一件事:我如何知道何时使用$$
而不是\$$
?您可以使用$$
来转义shell中通常是$
的内容。\$
构造用于引用变量展开,因此eval不会在第一个过程中展开它,而shell会在第二个过程中展开它。如果您感兴趣,我这里有一个相关但独立的makefile问题:我忘了一件事。如何将echo“variant\u${cpu}:$${variant\ux86}”
更新为类似echo“variant\u${cpu}:$$${variant\u${cpu}”
?您必须再次使用eval
:在shell提示下,它将是:eval echo variant\u${cpu}:${variant\u${cpu}
,因此在makefile中,您必须将美元符号加倍,例如:eval echo variant\u\$${cpu}:\$${variant\u$$${cpu}}
。基本上,编写makefile配方的方法是:首先让命令在shell提示符下工作,然后将其放入makefile配方中,并将美元符号加倍。谢谢。最后一件事:我如何知道何时使用$$
而不是\$$
?您可以使用$$
来转义shell中通常是$
的内容。\$
构造用于引用变量展开,因此eval不会在第一个过程中展开它,而shell会在第二个过程中展开它。如果您感兴趣,我这里有一个相关但独立的makefile问题: