Makefile文件
语法规则
目标:依赖文件集合
命令1
命令2
命令列表中的每条命令必须以TAB键开始,不能使用空格
第一条规则的目标成为默认目标 例如main
main: main.o input.o calcu.o
gcc -o main main.o input.o calcu.o
main.o:main.c
gcc -c main.c
input.o:input.c
gcc -c input.c
calcu.o:calcu.c
gcc -c calcu.c
clean:
rm *.o
rm main
Makefile变量
引用变量:$(变量名)
@:命令前加@符号控制台将隐藏这句命令的输出
objects = main.o input.o calcu.o
main: $(objects)
gcc -o main $(objects)
等号
name = czw
currentname = $(name)
name = aaron
print:
@echo $(currentname)
make print 将输出aaron
赋值符:"=" 借助另一个变量,可以将变量的真实值推到后面去定义。也就是变量的真实值取决于它所引用的变量的最后一次有效值
赋值符:":=“将当前变量的值进行赋值,上述改为:=结果为czw
赋值符:”?=“如果变量前面没有被赋值,那么此变量就是赋值符右边的值,如果前面已经赋值过了,那么就使用前面赋的值
变量追加:”+=“makefile中变量是字符串,有时候我们需要给前面已经定义好的变量添加一些字符串进去,此时就要使用到”+=",比如如下所示代码:
objects = main.o input.o
objects += calcu.o
objects变量的值从“main.o input.o”变为“main.o input.o calcu.o”
Makefile模式规则与自动化变量
模式规则:类似于通配符所有的.c文件可以表示为%.c
自动化变量:所谓自动化变量就是这个变量会把模式中所定义的一系列的文件自动的挨个取出,直至所有的符合模式的文件都取完,自动化变量只应该出现在规则的命令中。
常用的自动化变量如下:
$@:规则中的目标集合,在模式规则中,如果有多个目标的话,“$@”表示匹配模式中定义的目标集合
$%:当目标是函数库的时候表示规则中目标成员名,如果目标不上函数库文件,那么其值为空
$<:依赖文件集合中的第一个文件,如果依赖文件是以模式(即以“%”)定义的,那么“$<”就是符合模式的一系列文件模式
$?:所有比目标新的依赖目标集合,以空格分开
$^:所有依赖文件的集合,使用空格分开,如果在依赖文件中有多个重复文件,“$^”会去除重复的依赖文件,值保留一份
$+:和“$^”类似,但是当依赖文件存在重复的话不会去除重复的依赖文件
$*: 这个变量表示目标模式中“%”及其之前的部分,如果目标是test/a.test.c,目标模式为a.%.c,那么“$*”就是test/a.test
所有跟着模式规则和自动化变量可以对上面的makefile文件写成如下:
objects = main.o input.o calcu.o
main: $(objects)
gcc -o main $(objects)
%.o:%.c
gcc -c $<
clean:
rm *.o
rm main
伪目标
防止出现与目标相同的文件,从而达不到我们想要的效果,比如makefile文件下有一个clean文件,执行make clean将起不到清理工程的作用,伪目标可以解决这个问题
声明方式:
.PHONY:clean
objects = main.o input.o calcu.o
main: $(objects)
gcc -o main $(objects)
%.o:%.c
gcc -c $<
.PHONY:clean
clean:
rm *.o
rm main
Makefile条件判断
语法如下:
<条件关键字>
<条件为真时执行的语句>
endif
以及:
<条件关键字>
<条件为真时执行的语句>
else
<条件为假时执行的语句>
endif
其中条件关键字4个:ifeq、ifneq、ifdef和ifndef,这四个关键字其实分为两对、ifeq与ifneq、ifdef与ifndef。ifeq用来判断是否相等,ifneq就是判断是否不相等
ifeq用法如下:
ifeq (<参数1>,<参数2>)
ifeq ‘<参数1>’,‘<参数2>’
ifeq “<参数1>”,"<参数2>"
ifeq ‘<参数1>’,"<参数2>"
ifeq “<参数1>”,’<参数2>’
相同返回真
ifdef和ifndef的用法如下:
ifndef<变量名>
Makefile函数
。。。。。。看跟我一起写Makefile