前言

  • 本笔记主要记录Makefile一些概念要点。

概念

Chapter 5:变量的基础

  • 变量可以使用在 目标依赖目标命令 或是 Makefile的其它部分中

  • 变量的名字可以包含 字符、数字和下划线(可以以数字开头)

    • 但是不应该包含有 : # = 空格 回车 等特殊字符。
    • 变量名具有大小写敏感特性。(推荐大小写搭配使用)
  • 变量赋值时,会自动删除等号 = 两边的空格,但是,变量值后面的空格会保留,直至遇到 结束符或注释符 **

5.1 变量的基础 *

  • 使用变量时需要在变量前面添加 $ 符号,表示去该变量的值。

    • 推荐在取值时给变量添加上 (){}
    • 如果需要使用真实的 $ ,就用 $$ 即可。
  • 取变量值其实就是相当于 C/C++ 中的宏展开一样,其实还是字符串替换。
  • 注:推荐看例子。*
    • 赋值时要注意后面的空格和注释符 #

      • 注释符 # 可以表示终止一个变量的定义。
      • 例子:
        • /foo/bar 后面还跟了几个 空格,如果使用到 $(dir)/file ,那 路径就错误了。
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变量的基础的更多相关文章

  1. makefile中使用变量

    makefile里的变量就像一个变量,变量的作用主要如下: (1)保存文件名列表. (2)保存编译器的参数. makefile中的变量是用一个字符串在makefile中定义的,这个文本串就是变量的值. ...

  2. Makefile中的变量和shell变量

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

  3. makefile中打印变量名字,方便调试

    $(warning $(DVD_SERVICE)) // DVD_SerVICE是Makefile中的变量 $(warning   ST40_IMPORTS is $(ST40_IMPORTS)) 变 ...

  4. Makefile内置变量,递归式变量,直接展开式变量,条件赋值,追加赋值

    将shell命令的输出赋值给变量: VALUE = $(shell   命令) Makefile中给变量赋值: =     是递归展开式变量 value1 = 5 value2 = $(value1) ...

  5. Makefile第三讲:终端传值给Makefile、Makefile传值给C++代码

    摘要 终端传值给Makefile,咋传?只需在终端输入以下命令,那么就可以在Makefile文件中放心大担的使用$(abcde)这个变量了,它的值为BBB Makefile fun.h #includ ...

  6. Configure,Makefile.am, Makefile.in, Makefile文件

    一 软件安装关于 makefile文件问题 如果拿到的工程文件中,没有Makefile文件,而只有configure.in和Makefile.am文件,我们是不能够直接进行编译的,必须根据config ...

  7. make 查找的文件名顺序为:“GNUmakefile”、“makefile”、“Makefile”

    默认的情况下,make会在工作目录(执行make的目录)下按照文件名顺序寻找makefile文件读取并执行,查找的文件名顺序为:“GNUmakefile”.“makefile”.“Makefile”. ...

  8. Makefile.am, Makefile.in 与 Makefile的关系(转)

    文章出处:http://blog.mcuol.com/User/wangguangdong/Article/17384_1.htm Makefile.am, Makefile.in, Makefile ...

  9. Makefile笔记之一 ------ 变量的引用及赋值

    1.变量的引用方式: "$(变量名)"或者"¥{变量名}" 例如: ${Objs}就是取变量Objs的值 注意: 当变量名为单字符是可以采用:"$a& ...

随机推荐

  1. Kubernetes 配置私有镜像仓库时,没有权限访问的问题

    使用 K8S 部署服务时,如果指定的镜像地址是内部镜像仓库,那么在下载镜像的时候可能会报权限错误.这是由于在 K8S 中部署服务时,K8S 需要到 Harbor 中进行一次验证,这个验证与节点中使用 ...

  2. Luogu P6280 [USACO20OPEN]Exercise G

    题意 定义一个长度为 \(n\) 的置换的步数为将 \(P=(1,2,\cdots,n)\) 在该置换操作下变回原样的最小次数. 求所有 \(K\) 的和,使得存在一个长度为 \(n\) 的置换使得其 ...

  3. LORA串口无线数据透明传输终端ZSL311

    ZSL311是由成都众山科技生产销售的一款LORA串口无线数据透明传输终端,采用的是LoRa扩频技术来进行无线数据传输,同时提供RS485和RS232串口,为用户提供全透明数据传输模式.支持星形.Me ...

  4. 机器学习之K均值算法(K-means)聚类

    K均值算法(K-means)聚类 [关键词]K个种子,均值 一.K-means算法原理 聚类的概念:一种无监督的学习,事先不知道类别,自动将相似的对象归到同一个簇中. K-Means算法是一种聚类分析 ...

  5. python网络编程(TCP/IP、发邮件)

    TCP/IP 关注公众号"轻松学编程"了解更多. 计算机为了联网,就必须规定通讯协议,早期的计算机网络是由各个厂商规定的一些协议,他们之间互不兼容. 为了把全世界的电脑能够连接到一 ...

  6. Python之使用pip安装三方库Error:Could not find a version that satisfies the requirement <package>(from versions: none),No matching distribution found for <package>

    出现多次使用pip安装包时提示以下报错: ERROR: Could not find a version that satisfies the requirement <package> ...

  7. 【SpringCloud】07.应用间的通信

    应用间通信 HTTP vs RPC Spring Cloud (HTTP) Dubbo (RPC) 1.SpringCloud中服务间两种restful调用方式 RestTemplate Feign ...

  8. win10,安装 vmware 后没有虚拟网卡,导致虚拟机没有 ip

    1.确认关闭windows firewall 服务,最保险的关闭时先把服务改为手动再关闭防止塔自动启动! 2.确认开启Device  Install Service .Device Setup Ser ...

  9. jdk+tomcat 文件下载

    1.下载jdk+tomcat 链接:https://pan.baidu.com/s/1DQ-l2S4th9BoucWqAymmLg :密码: zdd3 备:tomcat是解压包,直接解压就能用,但需配 ...

  10. (2)ElasticSearch在linux环境中集成IK分词器

    1.简介 ElasticSearch默认自带的分词器,是标准分词器,对英文分词比较友好,但是对中文,只能把汉字一个个拆分.而elasticsearch-analysis-ik分词器能针对中文词项颗粒度 ...