make使用总结(3)-Makefile语法
变量
Makefile中的变量主要是用来保存、处理字符串。变量名区分大小写.引用变量时使用$(variableName)
的格式,如$(BIN)
.由于$
有特殊含义,所以当遇到真实的$
时用$$
来表示。可以使用$$$$
打印当前进程id。
Makefile中变量的使用如下
BIN := main
SRCPATH = src1
SRCPATH += src2
OBJPATH ?= obj
SRCS := $(wildcard *.c);
变量赋值可以分为两种:
立即赋值
:赋值时使用:=
或::=
。如BIN := main
就是立即赋值。在变量赋值时就会展开。如SRCS := $(wildcard *.c)
,在赋值过程中就会展开wildcard()
函数,将函数的返回值赋值给SRCS变量。推荐使用此方式赋值。延时赋值
:赋值时使用=
。如SRCPATH = src1
为延时赋值。在变量被规则使用到时才进行展开。
为了方便Makefile文件编写,还可以使用如下赋值:
+=
:对变量进行追加.eg:SRCPATH += src2
.?=
:在变量未定义时进行赋值.eg:OBJPATH ?= obj
.
为了方便规则编写,make还定义了一些自动变量
。主要是为了方便获取规则
中的具体的目标
名和依赖项
.
$@
:当前规则的目标
名$<
:第一个依赖项
名$^
:所有的依赖项列表,重名依赖项被忽略$?
:所有比目标文件新的依赖项列表$+
:包括重名依赖项的所有依赖项列表$*
:模式规则或静态模式规则中的茎,也即%
所代表的部分- 上述七个自动化变量除了直接引用外,还可以在其后增加D或者F字符获取目录名和文件名,如: ( @ D ) 表 示 目 标 文 件 的 目 录 名 , (@D)表示目标文件的目录名, (@D)表示目标文件的目录名,(@F)表示目标文件的文件名
为了方便Makefile编写,make定义了一些有固定含义的变量,如下:
VPATH
:这个变量在编写makefile时经常遇到。主要用来指定依赖文件的搜索路径,使用空格或冒号将多个路径分开.当规则的依赖文件或目标文件不在当前目录时,make会在此变量指定的目录下去寻找依赖文件。vpath
:功能同VPATH
,但比VPATH更灵活,可以使用模式匹配来指定搜索路径,还可以清除搜索路径.用法如下- vpath PATTERN DIR:为匹配PATTERN模式的文件指定搜索目录。eg:
vpath %.c ../wild_code/
指定所有.c文件的搜索路径 - vpath PATTERN:清除匹配PATTERN模式的文件设置的搜索目录。
- vpath:清除全部搜索目录。
- vpath PATTERN DIR:为匹配PATTERN模式的文件指定搜索目录。eg:
CURDIR
:make会自动设置为当前目录的路径.MAKECMDGOALS
:make时命令行上指定的目标列表GPATH
:如果不希望在当前目录下生成目标文件,可以使用GPATH变量.MAKE
:指make命令。在Makefile文件中调用$(MAKE)
来执行一次make命令操作。在工程中存在多个Makefile时,会使用在根Makefile中使用$(MAKE)来执行其他子Makefile。此时一般需要-c
选项来指定目录。
在使用makefile的变量中我们需要注意,来在于不同地方的变量:
- 系统环境变量:就是Linux系统自带的环境变量,在Makefile中可以使用。
- make定义的全局变量:如
VPATH
等。 - 命令行变量:在执行make时指定的命令行变量会覆盖Makefile中同名的变量定义,如果希望变量不被覆盖则需要使用
override
关键字。 - 自定义变量:用户自定的变量。自定义变量优先级高于环境变量。make的
-e
选项可防止环境变量被同名变量覆盖。
替换引用
我们在编写Makefile文件时,经常会遇到将所有的所有xxx.c
文件名替换为xxx.o
文件名。除了使用函数可以实现这一目的,变量的替换引用也可以做到这一点。
语法:$(var:a=b) 或 ${var:a=b}
含义:把变量var中每一个字符串结尾的a用b替换掉。
如下面的例程OBJS变量的最终结果为OBJS := test1.o test2.o test3.o
SRCS := test1.c test2.c test3.c
OBJS := $(SRCS:.c=.o)
关于技术交流
此处后的文字已经和题目内容无关,可以不看。
qq群:825695030
微信公众号:嵌入式的日常
如果上面的文章对你有用,欢迎打赏、点赞、评论。