在Linux中,最常用于管理工程的工具其中之一就是Makefile,Makefile与make指令相结合,可将项目的不同文件按照要求进行条件编译,最终编译出想要得到的程序或库。本文主要说明Makefile的常用语句以及编写方式。
首先是通配符“%”,这个符号在编译过程中十分常用,表示自推导。例如:
%.o 表示所有以.o结尾的文件
Makefile的变量定义如下:
var :=xxx
追加方式如下:
var +=xxxx
引用方式如下:
$(var)
Makefile中常用的就是伪目标,伪目标听着很陌生,但实则用了很多,如make clean指令,常常使用伪目标实现。此目标不代表文件,也不是为了得到文件,而是为了执行某个东西:
clean:
rm *.o *.elf *.bin *.dis mkx210 -f <=该语句在clean:后面没有依赖,其目的只是为了执行rm这条指令以及后面的要求。
.PHONY clean <=声明伪目标
clean:
xxxx
Makefile也可以去引用别的Makefile,使用include去导入其他的Makefile,同C语言include一样,在原地进行文件的展开。
Makefile中的赋值有两种,其1为=,其二为:=。其中,“=”赋值是一种取决于最后一次赋值的解析:
var=3
echo $(var) =>输出5
var=5
“:=”是一种就地的赋值解析:
var:=3
echo $(var) =>输出3
var=5
组合一下:
A=abc
B=$(A)def
A=ff
all:
echo $(b) =>ffdef
A=abc
B:=$(A)def
A=ff
all:
echo $(B) =>abcdef
可见对于“=”而言,解析谁就去看谁的前后。
“?=” 符号表示前面有无定义过这个变量,若有则不执行:
var ?=3
echo $(var) =>3
var =
var ?=3
echo $(var) =>空
“+=”符号表示为拼接:
var =abc
var +=def
echo $(var) =>abc def
导出环境变量使用export,可由外部的Makefile使用。
通配符,有如*和?的字符,*表示若干个任意字符,?表示一个任意的字符:
all:1.c 2.c 3.c 12.c 1.h test.c
echo ?.c =>1.c 2.c 3.c
ceho *.c =>12.c test.c
"[]"表示,将“[]”中字符依次与外结合匹配:
echo [12].c =>1.c 2.c
"%"也是通配符,但一般用于规则通配符:
%.o:%.S
自动变量的作用,文件太多,不好进行描述,用于替代一些满足要求的条件集合。
$@ 规则的目标文件名
$< 规则的依赖文件名
$^ 依赖的文件集合
all:1.c 2.c 12.c test.c 1.h
echo $@ =>all
echo $< =>1.c
echo $^ =>1.c 2.c 12.c test.c 1.h
若写为%.o:%c
echo $< 则会输出所有符合规则的名字
Makefile管道“|”,将已得到的变量向下传递。
一般OBJ中存放.o文件,SRC放源代码,TOPDIR为顶层目录,xxxtree代表某个文件的根目录,MKCONFIG是一个Makefile中的变量,指向一个mkconfig文件,是一个脚本,是一个在配置阶段的脚本。