Makefile变量
自定义变量
=
是最基本的赋值,会把整个makefile展开之后再决定是多少
x=foo
y=$(x)bar #y是asdbar,不是foobar
x=asd
:=
是覆盖之前的值,和=不同,和赋值的位置有关
x=foo
y:=$(x)bar #y是foobar
x=asd
?=
是如果没有被赋值过就赋予等号后面的值,赋过了就不管了
+=
是添加等号后面的值
变量的使用
和shell一样,makefile通过$(FLAGS)
来读取变量FLAGS
的值,对于$
本身,使用$$
读取
变量替换
注意这两种替换的方式都得使用变量名,不能使用变量的内容,即不能写成诸如$($(VAR):o=a)
的形式,其他返回内容的函数也不行,均会导致替换的失败
makefile中有两种变量替换,
- 形如
$(var:a=b)
或者${var:a=b}
,是把var中以a结尾的变量替换为b
OBJ=./obj/test.o
OBJ2=$(OBJ:o=a)
all:@echo "OBJ:$(OBJ)"@echo "OBJ2:$(OBJ2)"
#############################
$make all
OBJ:./obj/test.o
OBJ2:./obj/test.a
- 使用模式匹配的方式表示替换内容
OBJ=./obj/test.o
OBJ2=$(OBJ:%.o=%.a)
all:@echo "OBJ:$(OBJ)"@echo "OBJ2:$(OBJ2)"
############################
$make all
OBJ:./obj/test.o
OBJ2:./obj/test.a
自动化变量
?
所有比目标新的依赖的集合,以空格分隔,通常用他们的值,即$?
@
规则中的目标文件集,如果有多个目标,那么就是匹配于目标中模式定义的集合,通常用他们的值,即$@
%
仅当目标是函数库文件中,表示规则中的目标成员名,如果不是,为空,通常用他们的值,即$%
<
依赖目标中的第一个目标的名字,通常用他们的值,即$<
^
所有依赖目标的集合,以空格分隔,去除重复的依赖目标,通常用他们的值,即$^
+
所有依赖目标的集合,不去除重复的依赖目标,通常用他们的值,即$+
*
表示目标模式中 %之前的部分,通常用他们的值,即$*
@D
表示@
的目录部分(不以/结尾),通常用他们的值,即$(@D)
@F
表示@
的文件部分,通常用他们的值,即$(@F)
。。。另外6个同理
环境变量
makefile会自动读取系统中的环境变量,并复制一份一模一样的,如果用户在makefile中定义的同名的变量,那么原来的环境变量就会被覆盖
VPATH
虚路径,如果没有指明VPATH变量,make只会在当前目录中去寻找依赖文件和目标文件,如果定义了VPATH,则make会在当前目录找不到的情况下,到所制定的目录中去找文件,这个变
VPATH=src:../headers
vpath
vpath是一个指令,可以用来搜索文件,通常有三种用法:
VPATH <pattern> <directories>
为符合模式<pattern>
的文件指定搜索目录VPATH <pattern>
清除符合模式<pattern>
的文件的搜索目录VPATH
清除所有已被设置好了的文件搜索目录
这里,<pattern>
需要包含%
字符,eg:vpath %.h ../headers
如果多条vpath语句中出现了重复的<pattern>
,则会按照先后顺序搜索
print: *.c
#依赖关系的通配符会被自动展开,表示print目标依赖于所有的.c 文件
object=*.c
#变量中的通配符不会被展开object就是 “.c”需要使用wildcard来展开
例子
#Makefile文件
CC:=gcc
CFLAGS:= -O2 -I ./include
TARGET:=linkstack
OBJS:=linkstack.o linkstack_main.o
HDRS:=linkstack.h
SRC:=$(OBJS:%.o=%.c) #注意,这里不能用$(OBJS)
VPATH=./src:./include/
#vpath %.h ./include/
$(TARGET):$(OBJS)$(CC) $(CFLAGS) $^ -o $@
$(OBJS):$(SRC) $(HDRS)$(CC) -c $^ $(CFLAGS)
.PHONY:clean
clean:$(RM) $(OBJS) $(TARGET)
make执行前后的变化
$tree
.
├── include
│ └── linkstack.h
├── Makefile
└── src├── linkstack.c└── linkstack_main.c2 directories, 4 files
$make
gcc -c ./src/linkstack.c ./src/linkstack_main.c -O2 -I ./include
gcc -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
Makefile变量相关推荐
- Makefile_04:Makefile变量初了解
Makefile变量初了解 在上一篇文章<Makefile_03:Makefile介绍>我们可以看到[.o]文件的字符串被重复了两次,如果我们的工程需要加入一个新的[.o] 文件,如果 m ...
- makefile 学习笔记 二:makefile变量
一.变量定义语法 变量的名称 = 值列表 变量的名称可以由大小写字母.阿拉伯数字和下划线构成. 等号左右的空白符没有明确的要求,因为在执行 make 的时候多余的空白符会被自动的删除. 至于值列表,既 ...
- 【 Makefile 编程基础之三】详解 Makefile 变量的定义规则使用!
本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/gcc-makefile/770.html ☞ ...
- makefile变量赋值
在定义变量的值时,我们可以使用其它变量来构造变量的值,在Makefile中有两种方式来在用变量定义变量的值. 先看第一种方式,也就是简单的使用"="号,在"=" ...
- Makefile变量使用
1.变量使用概述 变量在声明时需要给予初值,而在使用时,需要给在变量名前加上"$"符号,但最好用小括号"()"或是大括号"{}"把变量给 ...
- Makefile中的变量和shell变量
我们在写makefile时 多多少少会用到shell脚本, 对于变量的在shell中的使用有一些要注意的细节.让我们从一个简单的makefile来看看. 注意makefile中一定要有一个目标,且一定 ...
- makefile中变量有哪些?
make一些参数选项: -p 选项,可以打印出make过程中的数据库, 下面研究一下内置的变量和规则. -n 选项, 只运行,不执行, -d 选项,相当于–debug=a,b(basic),v(ver ...
- GNU make 和 makefile
GNU make 和 makefile 1.9.1?GNU make 在大型的开发项目中,通常有几十到上百个的源文件,如果每次均手工键入 gcc 命令进行编译的话,则会 非常不方便.因此,人们通常利用 ...
- 从命令行传递其他变量来制作
我可以将变量作为命令行参数传递给GNU Makefile吗? 换句话说,我想传递一些最终会成为Makefile变量的参数. #1楼 如果你创建一个名为Makefile的文件并添加一个像$(unitte ...
最新文章
- android 入门-工序
- winform datagridview控件使用
- SQL Server 2005 和JBOSS 4 系统运行缓慢--高并发系统探讨(1)
- mysql两个表查询修改_MySQL:查询、修改(二)
- oracle预定义异常
- 2020年最好用的手机是哪一款_2020年入手5G手机最佳时期到了:5款最佳手机,您认可哪款...
- electron打包失败在下载nsis的地方
- bex5 php,Bex5开发技巧之如何在列表中显示主键字段
- 小米android手机怎么刷机,小米手机要刷机如何进入recovery模式
- 2021-06-11打开VMware虚拟机时提示“锁定文件失败 打不开磁盘或它所依赖的某个快照磁盘。
- linux系统运行程序设计,seL4的编译和运行
- 假设有一张纸可对折无限次,它的厚度为0.1毫米,珠穆朗玛峰的高度为8848.86米,求这张纸对折多少次后它的厚度会超过珠峰的高度。
- 微型投影仪第五篇——Metro UI
- Oracle Spatial中上载GIS空间数据方法研究
- 平头哥玄铁CPU调试系统介绍
- 应变片悬臂梁 电桥电路计算
- 健身耳机哪个好、最好的健身耳机推荐
- 计算机开机桌面黑屏怎么办,电脑启动后黑屏怎么解决
- 学术党必备:Zotero一键导出BibTex 参考文献
- Hive 正则提取英文名称和中文名称
热门文章
- “软”苹果水逆的一周:杂志服务崩溃,新机型遭泄露,芯片首架离职
- 开机显示erro:file'/boot/grub/i386-pc/normal.mod' not解决
- 安全漏洞问题6:SQL注入
- CloudStack 中关于注册ISO模版的问题解决
- 使用Doxygen + graphviz生成Unity 3d的UGUI类图
- skynet源码阅读4--定时器实现
- 定义和使用结构体变量
- httpd-2.4.9.tar.bz2的编译安装配置以及CGI、虚拟主机、https、mod_deflate、mod_status的实现。...
- BI工具那么多 该如何选择
- 大数据精准运营需要注意的点