Makefile的补充学习2

Makefile中使用通配符
(1)* 若干个任意字符
(2)? 1个任意字符
(3)[] 将[]中的字符依次去和外面的结合匹配

还有个%,也是通配符,表示任意多个字符,和*很相似,但是%一般只用于规则描述中,又叫做规则通配符。

Makefile的自动变量
(1)为什么使用自动变量。在有些情况下文件集合中文件非常多,描述的时候很麻烦,所以我们Makefile就用一些特殊的符号来替代符合某种条件的文件集,这就形成了自动变量。
(2)自动变量的含义:预定义的特殊意义的符号。就类似于C语言编译器中预制的那些宏__FILE__一样。
(3)常见自动变量:
[email protected] 规则的目标文件名
$< 规则的依赖文件名
$^ 依赖的文件集合

[email protected]

规则的目标文件名。如果目标是一个档案成员,则变量‘[email protected]’ 档案文件的文件名。对于有多个目标的格式规则(参阅格式规则简介),变量‘[email protected]’是那个导致规则命令运行的目标文件名。

$%

当目标是档案成员时,该变量是目标成员名,参阅使用make更新档案文件。例如,如果目标是‘foo.a(bar.o)‘,则‘$%‘的值是‘bar.o‘,‘[email protected]‘的值是‘foo.a‘。如果目标不是档案成员,则‘$%‘是空值。

$<

第一个依赖的文件名。如果目标更新命令来源于隐含规则,该变量的值是隐含规则添加的第一个依赖。参阅使用隐含规则。

$?

所有比目标‘新’的依赖名,名字之间用空格隔开。对于为档案成员的依赖,只能使用已命名的成员。参阅使用make更新档案文件。

$^

所有依赖的名字,名字之间用空格隔开。对于为档案成员的依赖,只能使用已命名的成员。参阅使用make更新档案文件。对同一个目标来说,一个文件只能作为一个依赖,不管该文件的文件名在依赖列表中出现多少次。所以,如果在依赖列表中,同一个文件名出现多次,变量‘$^’的值仍然仅包含该文件名一次。

$+

该变量象‘$^‘,但是,超过一次列出的依赖将按照它们在makefile文件中出现的次序复制。这主要的用途是对于在按照特定顺序重复库文件名很有意义的地方使用连接命令。

$*

和隐含规则匹配的stem(径),参阅格式匹配。如果一个目标为‘dir/a.foo.b‘,目标格式规则为:‘a.%.b‘ ,则stem为‘dir/foo‘。在构建相关文件名时stem 十分有用。在静态格式规则中,stem是匹配目标格式中字符‘%’的文件名中那一部分。在一个没有stem具体规则中;变量‘$*‘ 不能以该方法设置。如果目标名以一种推荐的后缀结尾(参阅过时的后缀规则),变量‘$*‘设置为目标去掉该后缀后的部分。例如,如果目标名是‘foo.c‘,则变量‘$*‘ 设置为‘foo‘, 因为‘.c‘ 是一个后缀。GNU make 处理这样奇怪的事情是为了和其它版本的make兼容。在隐含规则和静态格式规则以外,您应该尽量避免使用变量‘$*‘。在具体规则中如果目标名不以推荐的后缀结尾,则变量‘$*’在该规则中设置为空值。

当您希望仅仅操作那些改变的依赖,变量‘$?‘ 即使在具体的规则中也很有用。例如,假设名为‘lib’的档案文件包含几个OBJ文件的拷贝,则下面的规则仅将发生变化的OBJ文件拷贝到档案文件:

lib: foo.o bar.o lose.o win.o
        ar r lib $?
在上面列举的变量中,有四个变量的值是单个文件名。三个变量的值是文件名列表。这七个变量都有仅仅存放文件的路径名或仅仅存放目录下文件名的变体。变量的变体名是由变量名追加字母‘D’或‘F’构成。这些变体在GNU make中处于半废状态,原因是使用函数T dir和notdir 能够得到相同的结果。参阅文件名函数。注意,‘F‘变体省略所有在dir函数中总是输出的结尾斜杠这里是这些变体的列表:

`$(@D)‘

目标文件名中的路径部分,结尾斜杠已经移走。如果变量`[email protected]‘的值是`dir/foo.o‘,变体 `$(@D)‘的值是`dir‘。如果变量`[email protected]‘的值不包含斜杠,则变体的值是`.‘。

`$(@F)‘

目标文件名中的真正文件名部分。如果变量`[email protected]‘的值是`dir/foo.o‘,变体  `$(@F)‘的值是` foo.o ‘。`$(@F)‘ 等同于 `$(notdir [email protected])‘。

`$(*D)‘

`$(*F)‘

stem(径)中的路径名和文件名;在这个例子中它们的值分别为:`dir‘ 和 `foo‘ 。

`$(%D)‘

`$(%F)‘

档案成员名中的路径名和文件名;这仅对采用‘archive(member)’形式的档案成员目标有意义,并且当成员包含路径名时才有用。参阅档案成员目标。

`$(<D)‘

`$(<F)‘

第一个依赖名中的路径名和文件名。

`$(^D)‘

`$(^F)‘

所有依赖名中的路径名和文件名列表。

`$(?D)‘

`$(?F)‘

所有比目标‘新’的依赖名中的路径名和文件名列表。

注意,在我们讨论自动变量时,我们使用了特殊格式的惯例;我们写"the value of‘$<‘", 而不是"the variable <" ;和我们写普通变量,例如变量 objects 和 CFLAGS一样。我们认为这种惯例在这种情况下看起来更加自然。这并没有其它意义,变量‘$<‘的变量名为 < 和变量‘$(CFLAGS)‘ 实际变量名为CFLAGS一样。您也可以使用‘$(<)‘代替‘$<‘。

时间: 2025-01-03 23:26:12

Makefile的补充学习2的相关文章

ArcGIS API for JavaScript 4.2学习笔记[31] (补充学习)Task类

Task这个东西很有用,是AJS中用于解决各种乱七八糟任务的一个类.它有很多子类,有用于空间分析的,有用于空间查询的,等等. 这篇作为补充学习的第一篇,也是进阶学习的第一篇,我就改个写法. 我将使用思维导图,更好呈现逻辑信息. Task类的继承关系 Task类继承自Accessor类,它又有17个子类.别担心,各取所需,很少能用上超过5个子类的AJS程序,除非是一个超大的AJS集成系统. 以上有我熟知的QueryTask.RouteTask.FindTask.Geoprocessor.Ident

Linux 我的第一个makefile(Linux指令学习笔记)

我的第一个makefile 最近学到了makefile的文件的编写.makefile是一个能达到方便编译链接生成目标程序的文件, make确实很方便,在写makefile的过程也能更好的理解gcc编译器执行生成可执行文件的全过程.这里是我 的第一个makefile的编写. makefile根据依赖,逐步解析生成目标文件. 首先指定all:ef  生成最终目标文件ef 生成ef的前提是依赖ef:total.o sum.o mul.o 依赖三个目标文件. 所以我们要另外指定gcc的执行 gcc -o

makefile自动生成学习

https://www.cnblogs.com/jrglinux/p/6964169.html 关键是如何写Makefile.am  其他的交给 自动工具完成 添加一个 很好的博客 学习下 https://www.cnblogs.com/lixinjie/p/a-answer-about-thread-safety-in-a-interview.html 原文地址:https://www.cnblogs.com/zhangkele/p/10836944.html

css布局补充学习及项目中的学习

一.css布局补充知识点 (一)块级元素 块级元素生成块级盒,块级盒分为块盒和块容器盒,常见块盒为<p><h1><div>, 表格和可替换元素不是块盒. (二)可替换元素 浏览器可根据其标签的元素与属性判断显示内容的.如<img>.<input>.<textarea>.<select>.<object>. (三)position:fixed Position:fixed 的包含块是视口. (四)Display的

oracle 11g SQL语句补充学习

添加列: alter table tablename add columnName datatype (not null);        -------需要注意一点的是在添加一列为非空的时候, 表必须是空表. 删除列: alter table tablename drop column columnName 改变列的数据类型: alter table tablename modify columnName datatype 改变列名: alter table tablename rename

密码学补充学习简记之古典密码

1 密码体制 2 代替密码 2.1 代替密码的定义和分类 2.2 代替密码的构造 1.构造单表代替密码的关键是构造一张明密代替表. 2.代替表构造方法:密码字法.洗牌法.仿射法.广义仿射法. 1.多表代替密码的构造可分为底表的构造和密钥序列的构造. 2.底表必须为拉丁方阵. 3.密钥的构造方法:主观密钥序列(一本书).客观密钥序列.伪随机密钥序列. 3 移位密码 3.1 移位密码的定义和分类 3.2 移位密码的构造 移位密码的构造可归结为n元置换的构造,置换的构造与代替表的构造类似. 4 乘积密

密码学补充学习简记之序列密码

移位寄存器 反馈移位寄存器 线性反馈移位寄存器 对偶移位寄存器 原文地址:https://www.cnblogs.com/20199321zjy/p/12670690.html

补基础shell和makefile

shell介绍:操作系统终端的命令行 shell可以理解为,软件系统提供给用户操作的命令行界面.人机交互的一种方式 我们可以使用shell对操作系统和uboot等软件系统进行交互. shell脚本的运行机制:解释运行的 shell用源代码编写好后,源代码可以直接运行,不像C要进行编译链接. shell脚本中的程序是解释运行的,意思就是我们的源码编写好后,在运行时,我们的shell解析器就会一行一行的对shell源码进行解释,并且逐行的运行,就是逐行解释运行. 也就是说shell脚本语言不像是我们

补基础之shell 和makefile

2.2.1.shell介绍 (1)shell可以理解为软件系统提供给用户操作的命令行界面,可以说他是人机交互的一种方式 (2)我们可以使用shell和操作系统.uboot等软件系统进行交互.具体来说就是我们通过shell给软件系统输入命令,然后回车执行,执行完后会回到shell命令行再次输入命令执行 (3)我们上述的操作方式一般情况下工作很好,但是有一个缺陷.譬如我们要在linux 下创建一个文件a.c,可以touch a.c,但是如果我现在要在linux下创建100个文件,分别是a1.c  a