GNU Make -动态创建变量名
GNU Make - Dynamically created variable names
我有一个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中创建"动态变量名":
$ 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
是没有用的。
相关文章:
- 你能重载对象变量名本身返回的内容吗
- 在C/C++中将变量名定义为__00000001有什么好处吗
- C++变量名(可以将 main 声明为变量,但对于其他函数名称则不然)
- 为什么在堆栈和堆上创建变量会产生相同的程序集代码?
- C++ - 声明中变量名后面的括号
- 如何使替换 c 函数的变量名成为错误?
- 如何在循环中动态创建变量(c++)
- 是否可以创建没有变量名的变量
- fstream库,试图创建一个变量名为(c++)的文件
- 创建变量之间的运算符排列
- 一个数组C++中的消息和变量名
- 在变量名后声明带有 () 的非内部类型与不使用变量名的行为不同。即 std::map<int,char>x(); - 这是怎么回事?
- 是否有一种方法可以调用一个函数,而不会创建变量,而不会创建变量
- 数组的变量名和该数组的地址有什么区别?
- 在使用该名称创建变量后调用本机 C 函数
- C++ 仅当模板参数为 true 时才创建变量
- 如何创建末尾附加整数的变量名
- 创建变量名别名的方法
- GNU Make -动态创建变量名
- 从参数中创建变量名