Makefile foreach函数

Makefile中如果想做一些循环或遍历操作时,可以使用foreach函数:

$(foreach VAR,LIST,TEXT)

foreach函数的工作过程是:把LIST中使用空格分割的单词依次取出并赋值给变量VAR,然后执行TEXT表达式。重复这个过程,直到遍历完LIST中的最后一个单词。函数的返回值是TEXT多次计算的结果。

使用示例:假设一个项目,MP3播放器,分别有lcd、keyboad、usb、media目录,分别存放不同的源文件:

# tree
.
├── keyboard
│   └── key.c
├── lcd
│   └── lcd.c
├── makefile
├── media
│   └── decode.c
└── usb
    └── usb.c

现在编写一个Makefile,自动搜索各个目录下的C源文件。Makefile的写法如下:

.PHONY: all

dirs = lcd usb media keyboard
srcs = $(foreach dir, $(dirs), $(wildcard $(dir)/*))
all:
    @echo "srcs = $(srcs)"

执行make命令,运行结果如下:

# make
srcs =  lcd/lcd.c  usb/usb.c  media/decode.c  keyboard/key.c

当然,我们也可以根据搜索到的这些C源文件名,生成对应的目标文件名,对应的Makefile如下:

.PHONY: all

dirs = lcd usb media keyboard
srcs = $(foreach dir, $(dirs), $(wildcard $(dir)/*.c))
objs = $(foreach src, $(srcs), $(subst .c,.o,$(src)))
all:
    @echo "srcs = $(srcs)"
    @echo "objs = $(objs)"

执行make命令,运行结果如下:

# make
srcs =  lcd/lcd.c  usb/usb.c  media/decode.c  keyboard/key.c
objs =  lcd/lcd.o  usb/usb.o  media/decode.o  keyboard/key.o
《Makefile工程实践》视频教程,一线开发工程师独家录制,网上首家讲解Makefile的实战课程。从零开始,教你一步一步编写一个工程项目的Makefile,支持使用第三方静态库、动态库,支持指定模块或目录编译生成静态库、动态库,赠送企业级的Makefile模板,学完即可拿来使用,投入项目开发实战,具备独立开展项目开发和管理的能力。详情请点击淘宝链接:Linux三剑客