【Makefile】5-Makefile变量的基础
前言
- 本笔记主要记录Makefile一些概念要点。
概念
Chapter 5:变量的基础
变量可以使用在 目标 、 依赖目标 、 命令 或是 Makefile的其它部分中。
变量的名字可以包含 字符、数字和下划线(可以以数字开头)。
- 但是不应该包含有 : # = 空格 回车 等特殊字符。
- 变量名具有大小写敏感特性。(推荐大小写搭配使用)
变量赋值时,会自动删除等号 = 两边的空格,但是,变量值后面的空格会保留,直至遇到 结束符或注释符 **
5.1 变量的基础 *
- 使用变量时需要在变量前面添加 $ 符号,表示去该变量的值。
- 推荐在取值时给变量添加上 () 或 {}
- 如果需要使用真实的 $ ,就用 $$ 即可。
- 取变量值其实就是相当于 C/C++ 中的宏展开一样,其实还是字符串替换。
- 注:推荐看例子。*
- 赋值时要注意后面的空格和注释符 #
- 注释符 # 可以表示终止一个变量的定义。
- 例子:
- /foo/bar 后面还跟了几个 空格,如果使用到
$(dir)/file,那 路径就错误了。
- /foo/bar 后面还跟了几个 空格,如果使用到
- 赋值时要注意后面的空格和注释符 #
dir := /foo/bar # directory to put the frobs indir := /foo/bar # directory to put the frobs in
空格的定义 **
- 先定义一个空变量
empty - 然后用 $ 符号取出 + 空格 + 注释符 #
- 因为 注释符 # 可以结束一个变量的赋值。
- 不用注释符 # 也可以,只是怕空格的数量不对才用 注释符 # 表示一下而已。
empty:=
a = $(empty) #
一些赋值
变量定义语法:
| 形式 | 说明 |
|---|---|
| A = xxx | 延时变量 |
| B ?= xxx | 延时变量,只有第一次定义时赋值才成功,若曾被定义过,则此赋值无效。 |
| C := xxx | 立即变量 |
| D += yyy | 如果D在前面是延时变量,那么现在它还是延时变量 如果D在前面是立即变量,那么它现在还是立即变量 |
一些特殊的符号
| 符号 | 说明 |
|---|---|
| $@ | 表示规则中的目标文件集 |
| $% | 当目标为函数库的时候,则表示规则中的目标成员名。反之为空。如一个目标为"foo.a(bar.o)",那么,"$%"就是"bar.o",以空格分隔开。 |
| $< | 依赖文件集合中的第一个文件,如果依赖文件以"%"形式出现,则表示符合模式的一系列文件集合 |
| $? | 所有比目标新的依赖集合,以空格分隔开。 |
| $^ | 所有依赖文件集合,以空格分隔开。如果依赖有相同,则取其一。 |
| $+ | 和 "$^"类同,但是不会把相同的删除掉。 |
| $* | 这个变量表示目标模式中 "%"及其之前的部分,如果目标是 test/a.test.c,目标模式为 a.%.c, 那么 "$* " 就是 test/a.test。 |
5.2 变量中的变量 *
- 在 = 号右侧可以是值,也可以是变量*
- 如果 = 右侧是 变量,那么该 变量 可以定义在文件的任何一处(就是 延时变量 =)。(但是不推荐使用该方法)
- 为了避免上面第二点的操作,一般使用 即时变量 := 来赋值,例子:
- y 的值是 foo bar
x := foo
y := $(x) bar
x := later
* y 的值是 **bar**
y := $(x) bar
x := food
5.3 变量高级用法
- 变量值替换
- 把变量的值再变成变量
变量值替换
- 替换变量中的共有的部分
- 格式
$(var:a=b)${var:a=b}
- 意思是把变量 var 中的所有以 a 字串结尾的 a 替换成 b 字串。
- 这里 结尾 的意思是 空格 或 结束符。
- 例子
- 格式
foo := a.o b.o c.o
bar := $(foo:.o=.c)
# 或
foo := a.o b.o c.o
bar := $(foo:%.o=%.c)
把变量的值再当成变量
- 直接上例子:
ifdef do_sort
func := sort
else
func := strip
endif
bar := a d b g q c
foo := $($(func) $(bar))
- 用在操作符左边:
dir = foo
$(dir)_sources := $(wildcard $(dir)/*.c)
define $(dir)_print
lpr $($(dir)_sources)
endef
5.5 override 指示符
- 通常在执行 make 时,如果通过命令行定义了一个变量,那么它将替代在 Makefile 中出现的同名变量的定义。
- 如果不希望命令行指定的变量值替代在 Makefile 中的变量定义,那么我们需要在 Makefile 中使用指示符 override 来对这个变量进行声明,如:
override <variable>; = <value>;
# 或
override <variable>; := <value>;
# 或
override <variable>; += <more text>;
# 或
override define foo
bar
endef
5.6 多行变量
- 相当于 C 中的函数
- 关键字 define。(使用该该关键字可以有 换行)
- 例子
define two-lines
echo foo
echo $(bar)
endef
5.7 环境变量
- make 运行时的系统环境变量可以在 make 开始运行时被载入到 Makefile 文件中,但是如果 Makefile中已定义了这个变量,或是这个变量由 make 命令行带入,那么系统的环境变量的值将被覆盖。(如果make 指定了“-e”参数,那么,系统环境变量将覆盖 Makefi le 中定义的变量)
5.8 目标变量
- 为某个目标设置局部变量,这种变量被称为Target-specifi c Variable。
- 范围只在这条规则以及连带规则中。
- 语法
- ; 可以是前面讲过的各种赋值表达式,如 = := += 或是 ?=
<target ...> : <variable-assignment>;
<target ...> : overide <variable-assignment>
- 例子
- 在这个示例中,不管全局的 $(CFLAGS) 的值是什么,在 prog 目标,以及其所引发的所有规则中(prog.o foo.o bar.o 的规则),$(CFLAGS) 的值都是 -g。
prog : CFLAGS = -g
prog : prog.o foo.o bar.o
$(CC) $(CFLAGS) prog.o foo.o bar.o
prog.o : prog.c
$(CC) $(CFLAGS) prog.c
foo.o : foo.c
$(CC) $(CFLAGS) foo.c
bar.o : bar.c
$(CC) $(CFLAGS) bar.c
5.9 模式变量
- 就是把上面 目标变量 中的具体目标改为一种模式(一条语句(表达一种模式))。
- 语法
<pattern ...>; : <variable-assignment>;
<pattern ...>; : override <variable-assignment>;
- 例子:就是把 prog 改为 %.o,%.o 就是一种模式,所有 .o 结尾的都符合该模式。
%.o : CFLAGS = -O
参考
- 《GUN Makefile》
- 《跟我一起写Makefile》
【Makefile】5-Makefile变量的基础的更多相关文章
- makefile中使用变量
makefile里的变量就像一个变量,变量的作用主要如下: (1)保存文件名列表. (2)保存编译器的参数. makefile中的变量是用一个字符串在makefile中定义的,这个文本串就是变量的值. ...
- Makefile中的变量和shell变量
我们在写makefile时 多多少少会用到shell脚本, 对于变量的在shell中的使用有一些要注意的细节.让我们从一个简单的makefile来看看. 注意makefile中一定要有一个目标,且一定 ...
- makefile中打印变量名字,方便调试
$(warning $(DVD_SERVICE)) // DVD_SerVICE是Makefile中的变量 $(warning ST40_IMPORTS is $(ST40_IMPORTS)) 变 ...
- Makefile内置变量,递归式变量,直接展开式变量,条件赋值,追加赋值
将shell命令的输出赋值给变量: VALUE = $(shell 命令) Makefile中给变量赋值: = 是递归展开式变量 value1 = 5 value2 = $(value1) ...
- Makefile第三讲:终端传值给Makefile、Makefile传值给C++代码
摘要 终端传值给Makefile,咋传?只需在终端输入以下命令,那么就可以在Makefile文件中放心大担的使用$(abcde)这个变量了,它的值为BBB Makefile fun.h #includ ...
- Configure,Makefile.am, Makefile.in, Makefile文件
一 软件安装关于 makefile文件问题 如果拿到的工程文件中,没有Makefile文件,而只有configure.in和Makefile.am文件,我们是不能够直接进行编译的,必须根据config ...
- make 查找的文件名顺序为:“GNUmakefile”、“makefile”、“Makefile”
默认的情况下,make会在工作目录(执行make的目录)下按照文件名顺序寻找makefile文件读取并执行,查找的文件名顺序为:“GNUmakefile”.“makefile”.“Makefile”. ...
- Makefile.am, Makefile.in 与 Makefile的关系(转)
文章出处:http://blog.mcuol.com/User/wangguangdong/Article/17384_1.htm Makefile.am, Makefile.in, Makefile ...
- Makefile笔记之一 ------ 变量的引用及赋值
1.变量的引用方式: "$(变量名)"或者"¥{变量名}" 例如: ${Objs}就是取变量Objs的值 注意: 当变量名为单字符是可以采用:"$a& ...
随机推荐
- BIO编程
在实际的工作开发中,传统的模型有client/service模型.client端和service端要进行通信的话,有一种套接字的方式.传统的socket编程,包含一个socket服务端和一到多个soc ...
- 利用transformer进行中文文本分类(数据集是复旦中文语料)
利用TfidfVectorizer进行中文文本分类(数据集是复旦中文语料) 利用RNN进行中文文本分类(数据集是复旦中文语料) 利用CNN进行中文文本分类(数据集是复旦中文语料) 和之前介绍的不同,重 ...
- Java学习的第十九天
1.今天学了接口只能有抽象的常量和方法,接口为interface 承接接口是implements 接口的使用 接口中的方法必须是抽象的,没有构造方法 2.今天没有问题 3.明天学习第六章综合实例 ...
- 微信小程序-游记分享(无后台)
游记分享 博客班级 https://edu.cnblogs.com/campus/zjcsxy/SE2020 作业要求 https://edu.cnblogs.com/campus/zjcsxy/SE ...
- P6064 [USACO05JAN]Naptime G
最近做了多少道 usaco 了,连 FJ 都认识我了呀 题意描述 传送门 给你 \(N\) 段时间其中 \(B\) 段时间你要用来睡眠,再给你每个时间睡眠可获得的效用值 \(U_i\). 可惜的是你每 ...
- Polyglot Translators: Let's do i18n easier! 一款国际化插件小助手!
在做国际化文本有关的工作时, 是否厌倦了在不同应用或者网页之间频繁地切换进行中文, 繁体, 英文甚至韩文日文的文本翻译工作? 好吧, 我就是受不了频繁在进行文本字符串的转换, 还得跑到百度翻译上面搜索 ...
- .netcore简单集成swagger
为什么要集成Swagger 在前后端分离比较普遍的当下,当后端开发完接口后,还需把接口的信息.参数说明.返回参数等信息编写好提供给调用者.对于对外开放接口需提供说明文档是必不可少的.但是对于内部开发, ...
- MarkdownPad 2中编辑
一级标题 二级标题 三级标题 四级标题 五级标题 六级标题 #######七级标题 ########八级标题 #!/bin/bash declare -i evenSum=0 declare -i i ...
- Cassandra数据模型和模式(Schema)的配置检查
免责声明 本文档提供了有关DataStax Enterprise(DSE)和Apache Cassandra的常规数据建模和架构配置建议.本文档需要DSE / Cassandra基本知识.它不能代替官 ...
- hive 下载和导入数据 hive -e
1. 从97导出dim_channel_terminal_flag表数据到txt(数据下载) hive -e 'select * from dim.dim_city' >> dim_cit ...