make使用总结(3)-Makefile语法

make使用总结(3)-Makefile语法

变量

Makefile中的变量主要是用来保存、处理字符串。变量名区分大小写.引用变量时使用$(variableName)的格式,如$(BIN).由于$有特殊含义,所以当遇到真实的$时用$$来表示。可以使用$$$$打印当前进程id。

Makefile中变量的使用如下

BIN := main
SRCPATH = src1
SRCPATH += src2
OBJPATH ?= obj

SRCS :=  $(wildcard *.c);

变量赋值可以分为两种:

  1. 立即赋值:赋值时使用:=::=。如BIN := main就是立即赋值。在变量赋值时就会展开。如SRCS := $(wildcard *.c),在赋值过程中就会展开wildcard()函数,将函数的返回值赋值给SRCS变量。推荐使用此方式赋值。
  2. 延时赋值:赋值时使用=。如SRCPATH = src1为延时赋值。在变量被规则使用到时才进行展开。

为了方便Makefile文件编写,还可以使用如下赋值:

  1. +=:对变量进行追加.eg:SRCPATH += src2.
  2. ?=:在变量未定义时进行赋值.eg:OBJPATH ?= obj.

为了方便规则编写,make还定义了一些自动变量。主要是为了方便获取规则中的具体的目标名和依赖项.

  1. $@:当前规则的目标
  2. $<:第一个依赖项
  3. $^:所有的依赖项列表,重名依赖项被忽略
  4. $?:所有比目标文件新的依赖项列表
  5. $+:包括重名依赖项的所有依赖项列表
  6. $*:模式规则或静态模式规则中的茎,也即%所代表的部分
  7. 上述七个自动化变量除了直接引用外,还可以在其后增加D或者F字符获取目录名和文件名,如: ( @ D ) 表 示 目 标 文 件 的 目 录 名 , (@D)表示目标文件的目录名, (@D)(@F)表示目标文件的文件名

为了方便Makefile编写,make定义了一些有固定含义的变量,如下:

  1. VPATH:这个变量在编写makefile时经常遇到。主要用来指定依赖文件的搜索路径,使用空格或冒号将多个路径分开.当规则的依赖文件或目标文件不在当前目录时,make会在此变量指定的目录下去寻找依赖文件。
  2. vpath:功能同VPATH,但比VPATH更灵活,可以使用模式匹配来指定搜索路径,还可以清除搜索路径.用法如下
    1. vpath PATTERN DIR:为匹配PATTERN模式的文件指定搜索目录。eg:vpath %.c ../wild_code/指定所有.c文件的搜索路径
    2. vpath PATTERN:清除匹配PATTERN模式的文件设置的搜索目录。
    3. vpath:清除全部搜索目录。
  3. CURDIR:make会自动设置为当前目录的路径.
  4. MAKECMDGOALS:make时命令行上指定的目标列表
  5. GPATH:如果不希望在当前目录下生成目标文件,可以使用GPATH变量.
  6. MAKE:指make命令。在Makefile文件中调用$(MAKE)来执行一次make命令操作。在工程中存在多个Makefile时,会使用在根Makefile中使用$(MAKE)来执行其他子Makefile。此时一般需要-c选项来指定目录。

在使用makefile的变量中我们需要注意,来在于不同地方的变量:

  1. 系统环境变量:就是Linux系统自带的环境变量,在Makefile中可以使用。
  2. make定义的全局变量:如VPATH等。
  3. 命令行变量:在执行make时指定的命令行变量会覆盖Makefile中同名的变量定义,如果希望变量不被覆盖则需要使用override关键字。
  4. 自定义变量:用户自定的变量。自定义变量优先级高于环境变量。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
微信公众号:嵌入式的日常
如果上面的文章对你有用,欢迎打赏、点赞、评论。二维码

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

theboynoName

感谢鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值