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.c
2 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.c
2 directories, 7 files
$make clean
$tree
.
├── include
│ └── linkstack.h
├── Makefile
└── src
├── linkstack.c
└── linkstack_main.c
2 directories, 4 files
Makefile变量的更多相关文章
- makefile变量赋值
在定义变量的值时,我们可以使用其它变量来构造变量的值,在Makefile中有两种方式来在用变量定义变量的值. 先看第一种方式,也就是简单的使用“=”号,在“=”左侧是变量,右侧是变量的值,右侧变量的值 ...
- makefile笔记5 - makefile变量
在 Makefile 中的定义的变量,就像是 C/C++语言中的宏一样,他代表了一个文本字串,在 Makefile 中执行的时候其会自动原模原样地展开在所使用的地方.其与 C/C++所不同的是,你可以 ...
- makefile 变量展开
Makefile中给变量赋值: = 是递归展开式变量 value1 = 5 value2 = $(value1) value1 = 6 最终$(value2)就变成了6 := 是直接展开 ...
- 【 MAKEFILE 编程基础之三】详解 MAKEFILE 变量的定义规则使用!
本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/gcc-makefile/770.html ...
- 如何调试makefile变量
六.七年前写过一篇<跟我一起写Makefile>,直到今天,还有一些朋友问我一些Makefile的问题,老实说,我有一段时间没有用Makefile了,生疏了.回顾,这几年来大家问题我的问题 ...
- makefile变量定义应用到c语言
makefile是为组织程序工程的,其定义的宏怎样应用到c程序中呢? 我们知道Makefile中可定义变量或导出变量,make命令可定义变量:编译器(如gcc)可通过CFLAGS定义宏. 但如何才能使 ...
- 开始编写Makefile(二)Makefile变量的使用
Makefile可以使用变量代替 命令行:make -f Makefile2 说明开始make一个名为Makefile2的文件 ###############定义变量################# ...
- Makefile学习(一)变量
鉴于之前有一些了解,还有自己的学习习惯,我一上来就看Makefile的变量这一章.主要脉络是根据GNU make中文手册. 第六章:Makefile中的变量 6使用变量 定义:变量是一个名字,代表一个 ...
- Makefile中的变量和shell变量
我们在写makefile时 多多少少会用到shell脚本, 对于变量的在shell中的使用有一些要注意的细节.让我们从一个简单的makefile来看看. 注意makefile中一定要有一个目标,且一定 ...
随机推荐
- 2015-2016 ACM-ICPC Nordic Collegiate Programming Contest ---E题Entertainment Box(有点变化的贪心)
提交链接 http://codeforces.com/gym/100781/submit Description: Ada, Bertrand and Charles often argue over ...
- CnBlogs自定义博客样式
弄了半个晚上的时间,总算马马虎虎搞好了博客的样式. 整个博客是蓝色的基调,比较激情,我喜欢. 比较郁闷的是,rightmenu 和 main都是position:absolute 布局的.要添加一个f ...
- 【初窥javascript奥秘之事件机制】论“点透”与“鬼点击”
前言 最近好好的研究了一番移动设备的点击响应速度,期间不断的被自己坑,最后搞得焦头烂额,就是现在可能还有一些问题,但是过程中感觉自己成长不少, 最后居然感觉对javascript事件机制有了更好的认识 ...
- MediaWiki使用指南
MediaWiki使用指南 MediaWiki是著名的开源wiki引擎,全球最大的wiki项目维基百科(百科词条协作系统)是使用MediaWiki的成功范例,MediaWiki的最大作用在于对知识的归 ...
- SAP打印机配置
SAP打印机配置 一.SAP打印原理 SAP的打印过程分两个步骤: 1.创建假脱机请求: 2.创建输出请求: 在点击打印按钮后,系统会提示创建假脱机请求后,你可以选择直接生成输出请求,或者手动生成输出 ...
- 在Kali Linux下安装与配置OpenVas
以下是我的Kali版本号: 执行安装命令: apt-get install openvas 安装完成后可以在漏洞分析菜单下查看到OpenVas相关选项. 以下为安装完成后需要用到的几个命令: open ...
- SharePoint 2010: Export User Profile Properties to a Text File or Excel using PowerShell
导出到txt [void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.Office.Server") ...
- Windows 上的 Jetty 小工具
做项目经常遇到需要开发Java应用,我喜欢用Jetty进行开发.部署,主要是由于Jetty的轻量级. Jetty 项目主页:http://www.eclipse.org/jetty/, 最新版9.30 ...
- IOS常用第三方开源类库&组件
1.AFNetworking AFNetworking 采用 NSURLConnection + NSOperation, 主要方便与服务端 API 进行数据交换, 操作简单, 功能强大, 现在许多人 ...
- JavaScript学习01 语言简介、基本使用和变量声明
JavaScript语言简介.基本使用和变量声明 JavaScript是网景(Netscape)公司开发的一种基于客户端浏览器.面向对象.事件驱动式的网页脚本语言. JavaScript的前身叫Liv ...