makefile 3.82 foreach
时间: 2024-12-30 09:32:03 浏览: 5
### Makefile 中 `foreach` 函数详解
在 Makefile 版本 3.82 及以上版本中,`foreach` 是一个强大的函数,用于遍历列表并对每个元素执行特定操作。其语法如下:
```makefile
$(foreach var,list,text)
```
其中:
- `var`: 定义的变量名,在每次迭代时会被赋予当前项。
- `list`: 被遍历的一系列值,通常是一个由空格分隔的字符串。
- `text`: 对于每一个 `list` 的成员要展开的内容。
对于每一次迭代,`var` 将被设置成 `list` 当前项,并且会计算一次 `text` 表达式的值;最终结果是由所有这些单独的结果组成的单一字符串[^1]。
下面给出几个具体的例子来展示如何使用这个功能:
#### 基础用法示例
假设有一个文件名为 `sources.mk` 文件,里面定义了一个源码路径列表:
```makefile
SOURCES := main.c utils.c helper.c
```
如果想要创建一个新的变量 `OBJECTS` 来保存对应的 `.o` 文件,则可以这样做:
```makefile
OBJECTS := $(foreach source,$(SOURCES),$(source:.c=.o))
```
这将会把所有的 `.c` 后缀替换为 `.o` 并存储到新的变量 `OBJECTS` 中。
#### 复杂表达式处理
当需要更复杂的逻辑时,可以在 `text` 部分加入更多的命令或条件判断。比如,这里有一段代码用来打印出给定目录下所有头文件的信息:
```makefile
HEADERS := $(wildcard *.h)
define print_header_info =
@echo "Processing header file: $1"
endef
$(foreach hfile,$(HEADERS),$(call print_header_info,$(hfile)))
```
这段脚本首先找到工作目录下的所有 `.h` 文件并存入 `HEADERS` 列表里,接着通过调用自定义宏 `print_header_info` 输出每一条记录的信息。
阅读全文