makefile中的自动变量:
变量 | 含义 |
---|---|
$* | 表示目标文件的名称,不包含目标文件的扩展名 |
$+ | 表示所有的依赖文件,这些依赖文件之间用空格分开,按照出现的先后为顺序,其中可能包含重复的依赖文件 |
$< | 表示依赖项中第一个依赖文件的名称 |
$? | 依赖项中,所有目标文件时间戳晚的依赖文件,依赖文件之间以空格分开 |
$@ | 目标项中目标文件的名称 |
$^ | 依赖项中,所有不重复的依赖文件,这些文件之间以空格分开 |
Makefile的函数:
1、获取匹配模式的文件名wildcard
例:$(wildcard *.c) 返回当前目录下所有扩展名为.c的文件列表
2、模式替换函数patsubst
例: $(patsubst %.c, %.o, $(wildcard *.c)) 将wildcard获取的文件列表中所有的.c文件名替换成.o的文件列表。
3、循环函数foreach
$(foreach VAR, LIST, TEXT) 将LIST字符串中的一个空格分隔的单词,先传给临时变量VAR, 然后执行TEXT表达式,TEXT表达式处理结束后输出,其返回值是空格分隔表达式TEXT的计算结果。
一个简单的makefile例子
CC = gcc
CFLAGS = -Iinclude -O2
TARGET = test
RM = rm -f
OBJS = xx1.o xx2.o dir/xx3.o
$(TARGET): $(OBJS)
$(CC) $@ -o $^ $(CFLAGS)
$(OBJS): %.o:%.c
$(CC) $< -c $(CFLAGS) -o $@
clean:
-$(RM) $(TARGET) $(OBJS)
注:- 号表示当操作失败时不报错,命令继续执行
Makefile嵌套使用:
1、 总控Makefile
CC = gcc
CFLAGS = -O2
RM = rm -f
TARGET = test
export OBJSDIR = $(shell pwd)/.ojbs (传递变量给下层Makefile)
$(TARGET): $(OBJSDIR) main.o
$(MAKE) -C dir1 (在目录dir1中调用make)
$(MAKE) -C dir2 (在目录dir2中调用make)
$(CC) -o $(TARGET) $(OBJSDIR)/*.o
main.o: %.o:%.c
$(CC) -c $< -o $(OBJSDIR)/$@ $(CFLAGS) -Iinclude
$(OBJSDIR):
mkdir -p $(OBJSDIR)
clean:
-$(RM) $(TARGET)
-$(RM) $(OBJSDIR)/*.o
2、 子目录Makefile
all: $(OBJS)
$(OBJS):%.c:%.o
$(CC) -c $< -o $(OBJSDIR)/$@ $(CFLAGS) (CC和OBJSDIR在总控Makefile中声明)
clean:
$(RM) $(OBJS)