Makefile变量
Makefile 变量分为:用户自定义变量、预定义变量、自动变量、环境变量。
在上一篇博客中Makefile中的内容如下:
OBJ =world
OBJS = world.o robot.o human.o animal.o
CC = gcc
CFLAGS = -c -o
$(OBJ): $(OBJS)
$(CC)$(OBJS) -o $(OBJ)
animal.o: animal.c
$(CC)animal.c $(CFLAGS) animal.o
human.o: human.c
$(CC)human.c $(CFLAGS) human.o
robot.o: robot.c
$(CC)robot.c $(CFLAGS) robot.o
world.o: world.c
$(CC)world.c $(CFLAGS) world.o
clean:
rm$(OBJ) $(OBJS)
我们观察Makefile中的内容,发现目标文件与依赖文件总是重复出现,比如:
animal.o: animal.c
$(CC)animal.c $(CFLAGS) animal.o
animal.c 与animal.o
human.o: human.c
$(CC)human.c $(CFLAGS) human.o
human.o与 human.c
……
这时Makefile中的变量又引入了自动变量规则。
自动变量通常可以替代Makefile中重复出现的目标文件与依赖文件。
Makefile中自动变量有:
$*:不包含扩展名的目标文件名称
$+: 所有的依赖文件,以空格分开,并以出现的先后次序
$?: 所有时间戳比目标文件晚的依赖文件,并以空格分开
$@:表示一个规则中的目标
$^:表示规则的所有依赖的文件名。注意一般情况下$^只会在makefile内出现一次
$<:表示规则的第一个依赖的文件名。若为自动推导,则为该规则添加第一个依赖文件名
通过自动变量,上面的Makefile可以继续简化为:
OBJ =world
OBJS = world.o robot.o human.o animal.o
CC = gcc
CFLAGS = -c -o
$(OBJ): $(OBJS)
$(CC)$(OBJS) -o $(OBJ)
animal.o: animal.c
$(CC)$^ $(CFLAGS) $@
human.o: human.c
$(CC)$^ $(CFLAGS) $@
robot.o: robot.c
$(CC)$^ $(CFLAGS) $@
world.o: world.c
$(CC)$^ $(CFLAGS) $@
clean:
rm$(OBJ) $(OBJS)
我们观察Makefile中的内容,发现以下几个编译命令都非常形似:
animal.o: animal.c
$(CC)$^ $(CFLAGS) $@
human.o: human.c
$(CC)$^ $(CFLAGS) $@
robot.o: robot.c
$(CC)$^ $(CFLAGS) $@
world.o: world.c
$(CC)$^ $(CFLAGS) $@
是否可以将这几个编译命令写成一个编译命令?这就需要用到Makefile中的通配符:%
利用 % ,Makefilei可以简化如下:
OBJ =world
OBJS = world.o robot.o human.o animal.o
CC = gcc
CFLAGS = -c -o
$(OBJ): $(OBJS)
$(CC)$(OBJS) -o $(OBJ)
%.o: %.c
$(CC)$^ $(CFLAGS) $@
clean:
rm$(OBJ) $(OBJS)