【Linux系统编程】9.Makefile
目录
1个规则
ALL
2个函数
wildcard
patsubst
clean
3个自动变量
模式规则
静态模式规则
伪目标
附加变量
-n
-f
命名:makefile或者Makefile,方便于make命令直接执行。
1个规则
-
目标的时间必须晚于依赖条件的时间,否则,更新目标。
-
依赖条件如果不存在,找寻新的规则去产生依赖条件。
目标:依赖条件命令
main.out:main.cgcc main.c -o main.out
ALL
指定makefile的终极目标。
ALL:终极目标
ALL:main.out
不指定,在某些情况下,Makefile不会全部执行完。
例如:
ALL:main.outa1.o:a1.cgcc -c a1.c -o a1.oa2.o:a2.cgcc -c a2.c -o a2.oa3.o:a3.cgcc -c a3.c -o a3.omain.o:main.cgcc -c main.c -o main.omain.out:main.o a1.o a2.o a3.ogcc main.o a1.o a2.o a3.o -o main.out
2个函数
wildcard
src=$(wildcard ./*.c)
src=a1.c a2.c a3.c
匹配当前工作目录下的所有.c文件,将文件名组成列表,赋值给变量src。
patsubst
obj=$(patsubst %.c,%.o,$(src))
obj=a1.o a2.o a3.o
将第3个参数中,包含第1个参数的部分,替换为第2个参数。
clean
没有依赖。第一个“-”:删除不存在的文件时,不报错,继续执行。
clean:-rm -rf $(obj) xxx.out
3个自动变量
$@
在规则的命令中,表示规则的目标。
$^
在规则的命令中,表示所有的依赖条件。
$<
在规则的命令中,表示第一个依赖条件。如果将该变量应用在模式规则中,它可以将依赖条件列表中的依赖依次取出,套用模式规则。
src=$(wildcard ./*.c) #a1.c a2.c a3.c main.c
obj=$(patsubst %.c,%.o,$(src)) #a1.o a2.o a3.o main.oALL:main.outmain.out:$(obj)gcc $^ -o $@a1.o:a1.cgcc -c $< -o $@a2.o:a2.cgcc -c $< -o $@a3.o:a3.cgcc -c $< -o $@main.o:main.cgcc -c $< -o $@clean:-rm -rf $(obj) main.out
模式规则
%.o:%.cgcc -c $< -o $@
src=$(wildcard ./*.c) #a1.c a2.c a3.c main.c
obj=$(patsubst %.c,%.o,$(src)) #a1.o a2.o a3.o main.oALL:main.outmain.out:$(obj)gcc $^ -o $@%.o:%.cgcc -c $< -o $@clean:-rm -rf $(obj) main.out
静态模式规则
多个目标存在时,优先执行。
$(obj):%.o:%.cgcc -c $< -o $@
src=$(wildcard ./*.c) #a1.c a2.c a3.c main.c
obj=$(patsubst %.c,%.o,$(src)) #a1.o a2.o a3.o main.oALL:main.outmain.out:$(obj)gcc $^ -o $@$(obj):%.o:%.cgcc -c $< -o $@%.o:%.sgcc -S $< -o $@clean:-rm -rf $(obj) main.out
伪目标
存在同名clean文件和目标时,makefile可继续执行。
.PHONY:clean ALL
src=$(wildcard ./*.c) #a1.c a2.c a3.c main.c
obj=$(patsubst %.c,%.o,$(src)) #a1.o a2.o a3.o main.oALL:main.outmain.out:$(obj)gcc $^ -o $@$(obj):%.o:%.cgcc -c $< -o $@%.o:%.sgcc -S $< -o $@clean:-rm -rf $(obj) main.out.PHONY:clean ALL
附加变量
src=$(wildcard ./*.c) #a1.c a2.c a3.c main.c
obj=$(patsubst %.c,%.o,$(src)) #a1.o a2.o a3.o main.omyArgs=-Wall -gALL:main.outmain.out:$(obj)gcc $^ -o $@ $(myArgs)$(obj):%.o:%.cgcc -c $< -o $@ $(myArgs)%.o:%.sgcc -S $< -o $@clean:-rm -rf $(obj) main.out.PHONY:clean ALL
-n
模拟执行,防止出错,尤其是make clean命令。
make clean -n
-f
指定文件执行make命令。
make -f 文件名
make -f xxx.mk