《GNU_makefile》第六章——变量
makefile中的变量特征和C语言中的宏一样。
变量使用 =,:=,?= 和 define 定义
一些特殊的自动化变量:$< $@ $^ $*
1.变量的引用
通过 $(VAR) 或 ${VAR} 使用变量
变量的展开是严格的文本替换,所以
foo = c
prog.o : prog.$(foo)
$(foo) $(foo) -$(foo) prog.$(foo)
被展开后就是:
prog.c : prog.c
cc -c prog.c
2.变量的赋值
变量有两种赋值方式。
(1)= 递归展开
使用 = 赋值的变量,如果赋值里存在对其他变量的展开,那么其他变量的展开也会执行,也就说,使用 = 赋值时,若字符串包含对其他变量的展开,则这时其他变量不会展开,而是在该变量被展开时,其他变量才被展开
foo = $(bar)
bar = $(ugh)
ugh = Huh?
all:;echo $(foo)
foo = $(bar),这时 $(bar)不会被展开,foo的值就是 $(bar)
bar = $(ugh), 同样,bar的值就是$(ugh)
ugh = Hub?
all:;echo $(foo),这里foo被展开,首先得到$(bar),由于foo是递归展开变量,所以bar同样会被展开,得到$(ugh),同样ugh也会被展开,得到Hub?
递归展开的好处是,同上,foo=$(bar),bar可以在后面被赋值。
如:
CFLAGS = $(include_dirs) -O
include_dirs = -Ifoo -Ibar
(2):= 直接展开变量
赋值直接展开变量,若赋值的字符串 中有对其他变量的展开,则其他变量会立即展开。
x := foo
y := $(x) bar
x := later
就等价于:
y := foo bar
x := later
推荐使用直接展开,因为变量的表现更好预测。
(3)?= 操作符
做变量没有赋值,则被赋值,否则忽略
3.变量的高级用法
$(VAR:A=B),将变量VAR中以A结尾的字符,替换成以B结尾
foo := a.o b.o c.o
bar := $(foo:.o=.c)
也可以这样,这样更通用
oo := a.o b.o c.o
bar := $(foo:%.o=%.c)
4.变量的取值
一个变量可以通过以下几种方式来获得值:
在运行make时通过命令行选项来取代一个已定义的变量值。参考 6.7
override指示符 一节
在makefile文件中通过赋值的方式(参考 6.5 如何设置变量 一节)或者使
用“ define”来为一个变量赋值(参考 6.8 多行定义 一节)。
将变量设置为系统环境变量。 所有系统环境变量都可以被make使用。参考
6.9 系统环境变量 一节
自动化变量,在不同的规则中自动化变量会被赋予不同的值。它们每一个都
有单一的习惯性用法。参考 10.5.3 自动化变量 一小节
一些变量具有固定的值。参考 10.3 隐含变量 一节
5.
6.
7.override指示符
如果make的命令行参数定义给一变量赋值,则会替换makefile文件中对该变量的赋值(使用 := = define),
如果不希望替换则使用override
override VARIABLE = VALUE
或者:
override VARIABLE := VALUE
也可以对变量使用追加方式:
override VARIABLE += MORE TEXT
变量在定义时使用了“ override”,则后续对它值进行追
加时,也需要使用带有“ override”指示符的追加方式。否则对此变量值的追加不会生
效。
8.多行定义
使用define实现多行定义
9.系统环境变量
系统环境变量既然是环境变量,自然会传递给子进程make
10.目标指定变量
使用目标指定变量,类似于设置局部变量,该变量的赋值只会用于该目标的规则
设置一个目标指定变量的语法为:
TARGET ... : VARIABLE-ASSIGNMENT
或者:
TARGET ... : override VARIABLE-ASSIGNMENT
# sample Makefile
CUR_DIR = $(shell pwd)
INCS := $(CUR_DIR)/include
CFLAGS := -Wall –I$(INCS)
EXEF := foo bar
.PHONY : all clean
all : $(EXEF)
foo : foo.c
foo : CFLAGS+=-O2
bar : bar.c
bar : CFLAGS+=-g
………..
………..
$(EXEF) : debug.h
$(CC) $(CFLAGS) $(addsuffix .c,$@) –o $@
clean :
$(RM) *.o *.d $(EXES)
11.模式指定变量
就是目标指定变量的合并
如
%.o : CFLAGS += -O
《GNU_makefile》第六章——变量的更多相关文章
- OpenGL ES着色器语言之语句和结构体(官方文档第六章)内建变量(官方文档第七、八章)
OpenGL ES着色器语言之语句和结构体(官方文档第六章) OpenGL ES着色器语言的程序块基本构成如下: 语句和声明 函数定义 选择(if-else) 迭代(for, while, do-wh ...
- Java语言程序设计(基础篇) 第六章 方法
第六章 方法 6.2 定义方法 1.方法的定义由方法名称.参数.返回值类型以及方法体组成. 2.定义在方法头中的变量称为形式参数(formal parameter)或者简称为形参(parameter) ...
- 读《编写可维护的JavaScript》第六章总结
第六章 避免使用全局变量 JavaScript执行环境在很多方面都有其独特之处,全局变量就是其中之一.“全局变量”是一个神秘的对象,它表示了脚本的最外层上下文. 在浏览器中,windows对象往往重载 ...
- apue第六章学习总结
apue第六章学习总结 1.关于阴影文件与口令 在口令文件当中,常见的字段有(以root为例): root(用户名):x(加密口令):0(uid):0(gid):root(注释字段):/root(用户 ...
- [Effective Java]第六章 枚举和注解
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- 【windows核心编程】 第六章 线程基础
Windows核心编程 第六章 线程基础 欢迎转载 转载请注明出处:http://www.cnblogs.com/cuish/p/3145214.html 1. 线程的组成 ① 一个是线程的内核 ...
- 第六章SignalR的服务器广播
第六章SignalR的服务器广播 1.概述: VS可以通过 Microsoft.AspNet.SignalR.Sample NuGet包来安装一个简单的模拟股票行情应用.在本教程的第一部分,您将从头开 ...
- perl5 第六章 模式匹配
第六章 模式匹配 by flamephoenix 一.简介二.匹配操作符三.模式中的特殊字符 1.字符+ 2.字符 []和[^] 3.字符 *和? 4.转义字符 5.匹配任意字母或数字 6 ...
- 《Linux命令行与shell脚本编程大全》 第十六章 学习笔记
第十六章:创建函数 基本的脚本函数 创建函数 1.用function关键字,后面跟函数名 function name { commands } 2.函数名后面跟空圆括号,标明正在定义一个函数 name ...
随机推荐
- 多测师讲解python _函数return_高级讲师肖sir
# 函数中的返回的作用: 注意点:(1)调用函数===没有加print 调用函数为空,加了print调用函数打印输出none (2)在函数中碰到return语句赋值直接返回r ...
- Jenkins环境搭建(7)-集成钉钉消息推送
在去年的时候,搭建了一套Jenkins环境,基本功能已实现,可以通过如下地址查阅. Jenkins环境搭建(1)-下载与安装 Jenkins环境搭建(2)-搭建jmeter+ant+jenkins自动 ...
- CentOS 7操作系统目录结构介绍
CentOS 7操作系统目录结构介绍 操作系统存在着大量的数据文件信息,相应文件信息会存在于系统相应目录中,为了更好的管理数据信息,会将系统进行一些目录规划,不同目录存放不同的资源. 根下目录结构说明 ...
- STM32时钟和定时器
时钟源 STM32包含了5个时钟源,分别为HSI.HSE.LSI.LSE.PLL. HSI是高速内部时钟.RC振荡器,频率为8MHz: HSE是高速外部时钟,即晶振,可接石英/陶瓷谐振器或接外部时钟源 ...
- js 判断客户端 和 asp.net/C#判断客户端类型
1.js 判断客户端 <script language="JavaScript"> <!-- onload = function browserRedirect( ...
- 第四章 Bash Shell 的简单应用
一.Bash Shell 的简单介绍 1.什么是bash shell? 是一个命令解释器 它在操作系统的最外面 负责用户与内核进行交互的一种接口 将用户输入的命令翻译给操作系统,并将处理后的结果输出到 ...
- jumpserver部署使用
一.简介 前面我们聊到了openvpn的部署和使用,它能够实现从互联网通过openvpn连接到公司内网服务器,从而进行远程管理:但openvpn有一个缺点它不能记录哪些用户在内网服务器上操作了什么,拥 ...
- ams1117资料汇总
AMS1117系列稳压器有可调版与多种固定电压版,设计用于提供1A输出电流且工作压差可低至1V.在最大输出电流时,AMS1117器件的最小压差保证不超过1.3V,并随负载电流的减小而逐渐降低. AMS ...
- css-设置背景透明度
实现透明的css方法通常有以下3种方式,以下是不透明度都为80%的写法: css3的opacity:x,x 的取值从 0 到 1,如opacity: 0.8 兼容性:IE6.7.8不支持,IE9及以上 ...
- 使用Azure静态Web应用部署Blazor Webassembly应用
上一次演示了如何使用Azure静态web应用部署VUE前端项目(使用 Azure静态web应用+Github全自动部署VUE站点).我们知道静态web应用支持VUE,react,angular等项目的 ...