makefile功能
make工具最主要的功能就是通过编写makefile文件来描述源程序之间相互关系,并且自动维护编译工作
在UNIX系统中习惯使用Makefile作为makefile文件,如果要使用其他文件,例如libXXXX.mk就需要通过参数-f来指定我们的makefile文件
make -f libXXXX.mk
书写规则(依赖关系、生成目标方法)
targets:prerequistes
command
例如:
main:main.c
gcc main.c -o main
targets是我们最终想要得到的目标文件名
command是得到最终文件所需要执行的命令
prerequistes是获取目标文件的先决条件(源文件)
如果我们想定义一系列比较类似的文件就可以使用通配符例如:
clean:
rm -f *.o
clean:
cat main.c
rm -f *.o
wildcard和patsubst
如果使用通配符表示一系列文件并且赋值给变量例如
object = *.c
object的值将会是*.c,并不会是*.c文件的展开,如果需要表示.c文件基于需要使用wildcard函数这样就能使object表示为.c文件的名的集合
object = ${wildcard *.c}
而patsubst的名称为模式字符串替换函数
${patsubst <pattern>, <replacement>, <text>}
含义为在<text>中单词(以空格、换行、tab分隔)是否符合模式<pattern>如果模式匹配就使用<replacement>替换(可以包含通配符%)
src = ${wildcard *.c}
obj = ${patsubst %.c, %.o, ${src}}
伪目标
clean:
rm -f *.o
伪目标不是一个文件,只是一个标签,所以make无法生成它的依赖关系和是否执行,我们只有显示的指明这个目标才能让其生效,为了避免和文件重名我们可以使用一个特殊符号.PHONY来显式指明一个目标就是伪目标,向make说明不管是否有这个文件这个目标就是伪目标,只要有这个声明不管是否有这个文件要运行clean就可以make clean使用
.PHONY : clean
clean :
rm *.o temp
变量和自动变量
在makefile中变量用作$(obj)(常用)或${obj}, #表示注释
$@:在规则命令中,表示规则中的目标
$^:在规则命令中,表示所有依赖条件
$<:在规则命令中,第一个依赖条件(如果应用在模式规则中,可以将依赖条件列表中的依赖依次取出,套用模式规则)
main:main.c
gcc main.c -o main
main:main.c
gcc main.c -o $@
main:main.c
gcc $^ -o $@
main:main.c
gcc $< -o $@
ALL:main
WALL = -Wall
CC = gcc
src = $(wildcard *.c)
obj = $(patsubst %.c, %.o, $(src))
main:$(obj)
$(CC) $^ -o $@ $(WALL)
%.o:%.c
$(CC) -c $< -o $@
.PHONY:clean
clean:
rm -rf *.o main