在定义变量的值时,我们可以使用其它变量来构造变量的值,在Makefile中有两种方式来在用变量定义变量的值。

先看第一种方式,也就是简单的使用“=”号,在“=”左侧是变量,右侧是变量的值,右侧变量的值可以定义在文件的任何一处,也就是说,右侧中的变量不一定非要是已定义好的值,其也可以使用后面定义的值。如:

foo = $(bar)
bar = $(ugh)
ugh = Huh?

all:
echo $(foo)

我们执行“make all”将会打出变量$(foo)的值是“Huh?”( $(foo)的值是$(bar),$(bar)的值是$(ugh),$(ugh)的值是“Huh?”)可见,变量是可以使用后面的变量来定义的。

这个功能有好的地方,也有不好的地方,好的地方是,我们可以把变量的真实值推到后面来定义,如:

CFLAGS = $(include_dirs) -O
include_dirs = -Ifoo -Ibar

当“CFLAGS”在命令中被展开时,会是“-Ifoo -Ibar -O”。但这种形式也有不好的地方,那就是递归定义,如:

CFLAGS = $(CFLAGS) -O

或:

A = $(B)
B = $(A)

这会让make陷入无限的变量展开过程中去,当然,我们的make是有能力检测这样的定义,并会报错。还有就是如果在变量中使用函数,那么,这种方式会让我们的make运行时非常慢,更糟糕的是,他会使用得两个make的函数“wildcard”和“shell”发生不可预知的错误。因为你不会知道这两个函数会被调用多少次。http://hovertree.com/menu/linux/

为了避免上面的这种方法,我们可以使用make中的另一种用变量来定义变量的方法。这种方法使用的是“:=”操作符,如:

x := foo
y := $(x) bar
x := later

其等价于:

y := foo bar
x := later

值得一提的是,这种方法,前面的变量不能使用后面的变量,只能使用前面已定义好了的变量。如果是这样:

y := $(x) bar
x := foo

那么,y的值是“bar”,而不是“foo bar”。

上面都是一些比较简单的变量使用了,让我们来看一个复杂的例子,其中包括了make的函数、条件表达式和一个系统变量“MAKELEVEL”的使用:

ifeq (0,${MAKELEVEL})
cur-dir := $(shell pwd)
whoami := $(shell whoami)
host-type := $(shell arch)
MAKE := ${MAKE} host-type=${host-type} whoami=${whoami}
endif

关于条件表达式和函数,我们在后面再说,对于系统变量“MAKELEVEL”,其意思是,如果我们的make有一个嵌套执行的动作(参见前面的“嵌套使用make”),那么,这个变量会记录了我们的当前Makefile的调用层数。

下面再介绍两个定义变量时我们需要知道的,请先看一个例子,如果我们要定义一个变量,其值是一个空格,那么我们可以这样来:

nullstring :=
space := $(nullstring) # end of the line

nullstring 是一个Empty变量,其中什么也没有,而我们的space的值是一个空格。因为在操作符的右边是很难描述一个空格的,这里采用的技术很管用,先用一个 Empty变量来标明变量的值开始了,而后面采用“#”注释符来表示变量定义的终止,这样,我们可以定义出其值是一个空格的变量。请注意这里关于“#”的使用,注释符“#”的这种特性值得我们注意,如果我们这样定义一个变量:

dir := /foo/bar # directory to put the frobs in

dir这个变量的值是“/foo/bar”,后面还跟了4个空格,如果我们这样使用这样变量来指定别的目录——“$(dir)/file”那么就完蛋了。

还有一个比较有用的操作符是“?=”,先看示例:

FOO ?= bar

其含义是,如果FOO没有被定义过,那么变量FOO的值就是“bar”,如果FOO先前被定义过,那么这条语将什么也不做,其等价于:

ifeq ($(origin FOO), undefined)
FOO = bar
endif

推荐:http://www.cnblogs.com/roucheng/p/3470287.html

转载于:https://www.cnblogs.com/roucheng/p/makefile.html

makefile变量赋值相关推荐

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

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

  2. 存储过程中SELECT与SET对变量赋值

    Create proc insert_book @param1char(10),@param2varchar(20),@param3money,@param4moneyoutput with encr ...

  3. 把变量赋值给寄存器_用C语言对DSP的寄存器进行操作?

    欢迎FPGA工程师加入官方微信技术群 在嵌入式软件的开发过程中,我们常用的语言主要是:汇编语言和C语言.相比较于汇编语言,C语言对我们来说,更贴近我们的一些语言习惯.在DSP的开发过程中,我们主要还是 ...

  4. mysql declare 赋值_sql server和mysql变量赋值的区别 以及 MySql Declare(转)

    sql server和mysql都是我们经常用到的数据库系统,下面就为您介绍sql server和mysql变量赋值的区别,希望对您能有所启迪. sql server中变量要先申明后赋值: 局部变量用 ...

  5. sql server存储过程中SELECT 与 SET 对变量赋值的区别

    SQL Server 中对已经定义的变量赋值的方式用两种,分别是 SET 和 SELECT. 对于这两种方式的区别,SQL Server 联机丛书中已经有详细的说明,但很多时候我们 并没有注意,其实这 ...

  6. 零基础学python-3.2 变量赋值

    这一节我们来具体展开变量赋值 1.以下我们举各种赋值的样例 anInt=12 anFloat=2.2 anStr='string' aList=['a','a','a'] anArray=(1,2,3 ...

  7. python变量类型之间转换_Python变量赋值类型转换

    原博文 2018-01-22 22:05 − 1.Python定义变量 1 name = cross10 2 print('name=',name) 打印结果: name=cross10 2.Pyth ...

  8. python 同时给多个变量赋值

    python中可以同时给多个变量赋值,下面列举了三种方法 # Assign values directly a, b = 0, 1 assert a == 0 assert b == 1# Assig ...

  9. 动态sql拼接单引号与 变量赋值

    if (lower(s_table)='gl_detail') then ms := 'select max(ts) from ' || t_table; --给变量赋值 execute immedi ...

最新文章

  1. 删除空文件夹 linux,Linux中find批量删除空文件及空文件夹脚本
  2. 复制类中的属性值到另一个类的相同属性中
  3. LeetCode 581. 最短无序连续子数组(Shortest Unsorted Continuous Subarray)
  4. 2020计算机网络基础与应用,2020年国防科技大学硕士研究生考试F1107计算机网络基础考试大纲...
  5. php如果能编译就完美了,centos7 完美编译PHP7 php-7.2.10.tar.gz
  6. 微信看一下!搜狐张朝阳官宣狐友APP重新上架
  7. HightCharts与后台交互
  8. http://blog.51cto.com/forsk/1531568
  9. oracle删除列的限制,深入理解Oracle索引(10):索引列字符类型统计信息的32位限制...
  10. centos 卸载 jdk
  11. redis 8种淘汰策略
  12. 怎么选择论文查重软件?
  13. tabbar图标大小更改
  14. 公共数据 | CnOpenData中国90座城市建筑物屋顶矢量数据集
  15. 朋友说:能不能用python,帮我写一个“制作工资条”的自动化程序?
  16. 服务网格——后 Kubernetes 时代的微服务(前言)
  17. 字节跳动-后端开发岗最新春招面经分享,四面拿下,有惊无险
  18. 【理论知识学习32】归纳偏差与选择性偏差(概念作用以及举例说明)
  19. Map使用对象作key
  20. 利用matlab快速实现连续系统转变为离散系统(z变换)

热门文章

  1. Windows 上连接本地 Linux虚拟机上的 mysql 数据库
  2. 俄罗斯网络安全治理及其启示
  3. mysql 二进制日志
  4. 水印第三版 ~ 变态水印(这次用Magick.NET来实现,附需求分析和源码)
  5. 1.7-bzip2和bunzip2
  6. Android 轮询最佳实践 Service + AlarmManager+Thread
  7. HBase文件索引分析
  8. Hyper-V 3 虚拟机快照之四 导入/导出快照
  9. Silverlight C# 游戏开发:未写代码先设计
  10. 关于 Twing Hot Link 的一些事