makefile for循环赋值
时间: 2023-10-17 13:19:54 浏览: 171
在 Makefile 中,可以使用 for 循环来赋值变量。下面是一个示例 Makefile:
```
# 定义一个空字串变量
EMPTY :=
# 定义一个列表变量
LIST := a b c d e
# 使用 for 循环给变量赋值
for-each = $(foreach var,$(1),$(2))
# 使用 for 循环将列表变量转换成以逗号分隔的字符串
LIST_STR := $(call for-each,$(LIST),$(var)$(if $(findstring $(var),$(EMPTY)),,$(comma)))
comma := ,
# 打印列表变量和字符串变量
all:
@echo "LIST: $(LIST)"
@echo "LIST_STR: $(LIST_STR)"
```
在上面的示例中,使用 for-each 函数来定义一个 for 循环,其参数列表为:要迭代的变量列表和要执行的命令。然后,将列表变量转换成以逗号分隔的字符串,使用 call 函数来调用 for-each 函数。在 for-each 函数中,$(var) 表示当前迭代的变量,$(if ...) 表示如果当前变量为空,则不添加逗号,否则添加逗号。
运行 `make` 命令后,将会输出:
```
LIST: a b c d e
LIST_STR: a,b,c,d,e
```
相关问题
makefile 循环赋值
Makefile 中可以使用循环语句来赋值,常用的循环语句有 for 和 foreach。其中,for 循环的形式为:
```makefile
$(foreach var, list, text)
```
其中,var 是变量名,list 是变量值列表,text 是要执行的命令或变量赋值语句。
具体来说,我们可以使用 for 循环来给变量赋值,例如:
```makefile
# 定义一个变量 DIRS,它的值为 a b c
DIRS := a b c
# 定义一个变量 OBJS,它的值为 a.o b.o c.o
OBJS := $(foreach dir, $(DIRS), $(dir).o)
# 输出变量 OBJS 的值
$(info OBJS: $(OBJS))
```
其中,$(dir).o 表示在变量 dir 后面添加 .o 后缀,因此 $(OBJS) 的值为 a.o b.o c.o。
除了 for 循环,还可以使用 foreach 循环,它的形式为:
```makefile
$(varname) := $(foreach var, list, text)
```
其中,varname 是变量名,list 是变量值列表,text 是要执行的命令或变量赋值语句。具体来说,我们可以使用 foreach 循环来给变量赋值,例如:
```makefile
# 定义一个变量 DIRS,它的值为 a b c
DIRS := a b c
# 定义一个变量 OBJS,它的值为 a.o b.o c.o
$(foreach dir, $(DIRS), $(eval OBJS += $(dir).o))
# 输出变量 OBJS 的值
$(info OBJS: $(OBJS))
```
其中,$(eval OBJS += $(dir).o) 表示将 $(dir).o 追加到 OBJS 变量的末尾。因此,$(OBJS) 的值为 a.o b.o c.o。
makefile 次数for循环
Makefile 并没有内置的循环语句。但是,我们可以使用递归的方式来实现循环。以下是一个例子,展示了如何使用递归来实现循环:
```
# 定义一个变量 N,表示循环次数
N := 10
# 定义一个递归函数 loop
define loop
$(if $(filter-out 0,$1),\
$(info Loop iteration $1) \
$(call loop,$(shell expr $1 - 1))\
)
endef
# 定义一个名为 run 的目标
.PHONY: run
run:
$(call loop,$(N))
```
在这个例子中,我们定义了一个变量 `N`,表示循环次数。然后,我们定义了一个递归函数 `loop`,它接受一个参数 `n`,并打印出当前循环的迭代次数。在函数中,我们使用 `if` 操作符来判断循环是否结束,如果没有结束,就打印出当前迭代次数,并调用自身来进行下一次迭代。
最后,我们定义了一个名为 `run` 的目标,当我们运行 `make run` 命令时,它将调用 `loop` 函数来进行循环。在这个例子中,我们将循环次数设为 10,因此 `loop` 函数将会打印出 10 次循环迭代的信息。
相关推荐
![application/pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![whl](https://img-home.csdnimg.cn/images/20210720083646.png)