Makefile变量
发布日期:2021-08-31 22:55:30 浏览次数:1 分类:技术文章

本文共 2541 字,大约阅读时间需要 8 分钟。

自定义变量

= 是最基本的赋值,会把整个makefile展开之后再决定是多少

x=fooy=$(x)bar   #y是asdbar,不是foobarx=asd

:= 是覆盖之前的值,和=不同,和赋值的位置有关

x=fooy:=$(x)bar  #y是foobarx=asd

?= 是如果没有被赋值过就赋予等号后面的值,赋过了就不管了

+= 是添加等号后面的值

变量的使用

和shell一样,makefile通过$(FLAGS)来读取变量FLAGS的值,对于$本身,使用$$读取

变量替换

注意这两种替换的方式都得使用变量名,不能使用变量的内容,即不能写成诸如$($(VAR):o=a)的形式,其他返回内容的函数也不行,均会导致替换的失败

makefile中有两种变量替换,

  1. 形如$(var:a=b)或者${var:a=b},是把var中以a结尾的变量替换为b
OBJ=./obj/test.oOBJ2=$(OBJ:o=a)all:    @echo "OBJ:$(OBJ)"    @echo "OBJ2:$(OBJ2)"#############################$make allOBJ:./obj/test.oOBJ2:./obj/test.a
  1. 使用模式匹配的方式表示替换内容
OBJ=./obj/test.oOBJ2=$(OBJ:%.o=%.a)all:    @echo "OBJ:$(OBJ)"    @echo "OBJ2:$(OBJ2)"############################$make allOBJ:./obj/test.oOBJ2:./obj/test.a

自动化变量

? 所有比目标新的依赖的集合,以空格分隔,通常用他们的值,即$?

@ 规则中的目标文件集,如果有多个目标,那么就是匹配于目标中模式定义的集合,通常用他们的值,即$@
% 仅当目标是函数库文件中,表示规则中的目标成员名,如果不是,为空,通常用他们的值,即$%
< 依赖目标中的第一个目标的名字,通常用他们的值,即$<
^ 所有依赖目标的集合,以空格分隔,去除重复的依赖目标,通常用他们的值,即$^
+ 所有依赖目标的集合,不去除重复的依赖目标,通常用他们的值,即$+
* 表示目标模式中 %之前的部分,通常用他们的值,即$*
@D 表示@的目录部分(不以/结尾),通常用他们的值,即$(@D)
@F 表示@的文件部分,通常用他们的值,即$(@F)
。。。另外6个同理

环境变量

makefile会自动读取系统中的环境变量,并复制一份一模一样的,如果用户在makefile中定义的同名的变量,那么原来的环境变量就会被覆盖

VPATH

虚路径,如果没有指明VPATH变量,make只会在当前目录中去寻找依赖文件和目标文件,如果定义了VPATH,则make会在当前目录找不到的情况下,到所制定的目录中去找文件,这个变

VPATH=src:../headers

vpath

vpath是一个指令,可以用来搜索文件,通常有三种用法:

  1. VPATH <pattern> <directories>为符合模式<pattern>的文件指定搜索目录
  2. VPATH <pattern> 清除符合模式<pattern>的文件的搜索目录
  3. VPATH 清除所有已被设置好了的文件搜索目录
    这里,<pattern>需要包含 %字符,eg: vpath %.h ../headers
    如果多条vpath语句中出现了重复的<pattern>,则会按照先后顺序搜索
    print: *.c #依赖关系的通配符会被自动展开,表示print目标依赖于所有的.c 文件
    object=*.c #变量中的通配符不会被展开object就是 “
    .c”需要使用wildcard来展开

例子

#Makefile文件CC:=gccCFLAGS:= -O2 -I ./includeTARGET:=linkstackOBJS:=linkstack.o linkstack_main.oHDRS:=linkstack.hSRC:=$(OBJS:%.o=%.c)                #注意,这里不能用$(OBJS)VPATH=./src:./include/#vpath %.h ./include/$(TARGET):$(OBJS)    $(CC) $(CFLAGS) $^ -o $@$(OBJS):$(SRC) $(HDRS)    $(CC) -c $^ $(CFLAGS).PHONY:cleanclean:    $(RM) $(OBJS) $(TARGET)

make执行前后的变化

$tree.├── include│   └── linkstack.h├── Makefile└── src    ├── linkstack.c    └── linkstack_main.c2 directories, 4 files$makegcc -c ./src/linkstack.c ./src/linkstack_main.c -O2 -I ./includegcc -O2 -I ./include linkstack.o linkstack_main.o -o linkstack$tree.├── include│   └── linkstack.h├── linkstack├── linkstack_main.o├── linkstack.o├── Makefile└── src    ├── linkstack.c    └── linkstack_main.c2 directories, 7 files$make clean$tree.├── include│   └── linkstack.h├── Makefile└── src    ├── linkstack.c    └── linkstack_main.c2 directories, 4 files

转载于:https://www.cnblogs.com/xiaojiang1025/p/5955083.html

转载地址:https://blog.csdn.net/weixin_34092455/article/details/94234715 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:solidity-library
下一篇:Linux IPC BSD socket编程基础

发表评论

最新留言

不错!
[***.144.177.141]2024年03月23日 05时18分07秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

php+跑buth,php 中函数获取可变参数的方法, 这个语法有点像 golang 语言中的 2019-04-21
cms 单点登录 php,Yii2 中实现单点登录的方法 2019-04-21
oracle自己运行,创建Oracle自动执行Job 2019-04-21
oracle报错00020,oracle启动 ORA-00020: maximum number of processes (%s) exceeded错误 2019-04-21
chmod 赋权所有_chmod 权限 命令详细用法 2019-04-21
html代码翻译_[译]您知道 HTML 的键盘标签吗? 2019-04-21
html抽奖代码_JavaScript高手之路:封装抽奖效果 2019-04-21
hadoop 3.3 一直停留在running wordcount_蛋价持续下跌,今日跌破3.3元大关!深秋季节价格还能反弹吗?... 2019-04-21
的流程图做完后如何保存_2019超火的半永久眉是哪款?做完后我们如何护理?... 2019-04-21
去除logo 高德地图api_深圳品牌logo升级如何保持原型的同时更具创新? 2019-04-21
二重积分转换成极坐标_二重积分转换极坐标r的范围如何确定? 2019-04-21
python中倒背如流_八字基础知识--倒背如流篇 2019-04-21
以太坊地址和公钥_以太坊地址是什么 2019-04-21
linux查看wifi信号命令_linux – 获取WIFI信号强度 – 寻求最佳方式(IOCTL,iwlist(iw)等)... 2019-04-21
npm 不重启 全局安装后_解决修复npm安装全局模块权限的问题 2019-04-21
vs格式化json 不生效_vs code 格式化 json 配置 2019-04-21
go 字符串反序列化成对象数组_Fastjson 1.2.24反序列化漏洞深度分析 2019-04-21
onmessage websocket 收不到信息_WebSocket断开重连解决方案,心跳重连实践 2019-04-21
hibernate mysql 缓存_hibernate和mysql的缓存问题,没辙了! 2019-04-21
abp框架 mysql_ABP框架使用Mysql数据库 2019-04-21