自定义变量

= 是最基本的赋值,会把整个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中有两种变量替换,

  1. 形如$(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
  1. 使用模式匹配的方式表示替换内容
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是一个指令,可以用来搜索文件,通常有三种用法:

  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:=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变量相关推荐

  1. Makefile_04:Makefile变量初了解

    Makefile变量初了解 在上一篇文章<Makefile_03:Makefile介绍>我们可以看到[.o]文件的字符串被重复了两次,如果我们的工程需要加入一个新的[.o] 文件,如果 m ...

  2. makefile 学习笔记 二:makefile变量

    一.变量定义语法 变量的名称 = 值列表 变量的名称可以由大小写字母.阿拉伯数字和下划线构成. 等号左右的空白符没有明确的要求,因为在执行 make 的时候多余的空白符会被自动的删除. 至于值列表,既 ...

  3. 【 Makefile 编程基础之三】详解 Makefile 变量的定义规则使用!

    本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/gcc-makefile/770.html ☞ ...

  4. makefile变量赋值

    在定义变量的值时,我们可以使用其它变量来构造变量的值,在Makefile中有两种方式来在用变量定义变量的值. 先看第一种方式,也就是简单的使用"="号,在"=" ...

  5. Makefile变量使用

    1.变量使用概述   变量在声明时需要给予初值,而在使用时,需要给在变量名前加上"$"符号,但最好用小括号"()"或是大括号"{}"把变量给 ...

  6. Makefile中的变量和shell变量

    我们在写makefile时 多多少少会用到shell脚本, 对于变量的在shell中的使用有一些要注意的细节.让我们从一个简单的makefile来看看. 注意makefile中一定要有一个目标,且一定 ...

  7. makefile中变量有哪些?

    make一些参数选项: -p 选项,可以打印出make过程中的数据库, 下面研究一下内置的变量和规则. -n 选项, 只运行,不执行, -d 选项,相当于–debug=a,b(basic),v(ver ...

  8. GNU make 和 makefile

    GNU make 和 makefile 1.9.1?GNU make 在大型的开发项目中,通常有几十到上百个的源文件,如果每次均手工键入 gcc 命令进行编译的话,则会 非常不方便.因此,人们通常利用 ...

  9. 从命令行传递其他变量来制作

    我可以将变量作为命令行参数传递给GNU Makefile吗? 换句话说,我想传递一些最终会成为Makefile变量的参数. #1楼 如果你创建一个名为Makefile的文件并添加一个像$(unitte ...

最新文章

  1. android 入门-工序
  2. winform datagridview控件使用
  3. SQL Server 2005 和JBOSS 4 系统运行缓慢--高并发系统探讨(1)
  4. mysql两个表查询修改_MySQL:查询、修改(二)
  5. oracle预定义异常
  6. 2020年最好用的手机是哪一款_2020年入手5G手机最佳时期到了:5款最佳手机,您认可哪款...
  7. electron打包失败在下载nsis的地方
  8. bex5 php,Bex5开发技巧之如何在列表中显示主键字段
  9. 小米android手机怎么刷机,小米手机要刷机如何进入recovery模式
  10. 2021-06-11打开VMware虚拟机时提示“锁定文件失败 打不开磁盘或它所依赖的某个快照磁盘。
  11. linux系统运行程序设计,seL4的编译和运行
  12. 假设有一张纸可对折无限次,它的厚度为0.1毫米,珠穆朗玛峰的高度为8848.86米,求这张纸对折多少次后它的厚度会超过珠峰的高度。
  13. 微型投影仪第五篇——Metro UI
  14. Oracle Spatial中上载GIS空间数据方法研究
  15. 平头哥玄铁CPU调试系统介绍
  16. 应变片悬臂梁 电桥电路计算
  17. 健身耳机哪个好、最好的健身耳机推荐
  18. 计算机开机桌面黑屏怎么办,电脑启动后黑屏怎么解决
  19. 学术党必备:Zotero一键导出BibTex 参考文献
  20. Hive 正则提取英文名称和中文名称

热门文章

  1. “软”苹果水逆的一周:杂志服务崩溃,新机型遭泄露,芯片首架离职
  2. 开机显示erro:file'/boot/grub/i386-pc/normal.mod' not解决
  3. 安全漏洞问题6:SQL注入
  4. CloudStack 中关于注册ISO模版的问题解决
  5. 使用Doxygen + graphviz生成Unity 3d的UGUI类图
  6. skynet源码阅读4--定时器实现
  7. 定义和使用结构体变量
  8. httpd-2.4.9.tar.bz2的编译安装配置以及CGI、虚拟主机、https、mod_deflate、mod_status的实现。...
  9. BI工具那么多 该如何选择
  10. 大数据精准运营需要注意的点