Makefile-4-书写命令
前言
- 本笔记主要记录Makefile一些概念要点。
概念
Chapter 4:书写命令
- 每条规则中的命令和操作系统 Shell 的命令行是一致的。
- 每条命令必须以 Tab 键开头,除非,命令是紧跟在依赖规则后面的分号后的。
- make 一般是使用环境变量 SHELL 中所定义的系统 Shell 来执行命令,默认情况下是 /bin/sh —— UNIX 的标准 Shell 解释执行的。
4.1 显示命令
- 是否显示命令
- 在命令行前使用 @ 字符,那么该命令将不被make显示出来。
- 只显示,不执行
- make 执行时,带入 make 参数 -n 或 --just-print。
- 作用:一般用于调试,查看make执行的顺序。
- 全面禁止,命令的显示:
- make 参数 -s 或 --silent 或 --quiet 则是全面禁止命令的显示。
4.2 命令执行 *
- 当依赖目标新于目标时,make 会一条一条的执行其后的命令。
- 如果要让上一条命令的结果应用在下一条命令时,你应该使用分号分隔这两条命令。
- 例子1:输出为:【当前目录路径】
exec:
cd /home/lss
pwd
* 例子2:输出为:/home/lss
exec:
cd /home/lss; pwd
- 命令解析器寻找顺序
- 首先,在 SHELL 所指定的路径中找寻 --> 在当前盘符中的当前目录中寻找 --> 在 PATH 环境变量中所定义的所有路径中寻找。
- MS-DOS 中,如果定义的命令解释器没有找到,其会给你的命令解释器加上诸如 .exe 、.com 、.bat 、.sh 等后缀。
4.3 命令出错
- 每当命令运行完后,make 会检测每个命令的返回码,码为零则成功。
- 忽略命令失败
- 方法一:减号
- 在命令前( Tab 键后)加上一个减号 - 即可。
- 方法二:全局(分两种)
- 给 make 加上 -i 或是 --ignore-errors 参数
- 果一个规则是以 .IGNORE 作为目标的,该规则中的所有命令将会忽略错误。
- 方法一:减号
- 命令失败,但只终止当前规则
- make 的参数的是 -k 或是 --keep-going
- 意思是:某规则中的命令出错了,就终止该规则的执行,但继续执行其它规则。
- make 的参数的是 -k 或是 --keep-going
4.4 嵌套执行 make
- 总控 Makefile + 各个子目录 Makefile。
- 父级 Makefile
- -C 切换到其它目录
subsystem:
make -C subdir # 或者:cd subdir && make
传递变量到下级,声明方法:
export <variable ...>;- 注:注意 等号:(意思是 export 后,就不是 延时变量)
export variable = value等价于export variable := value- 传递时默认不覆盖,加上 -e 即可覆盖下级重新赋值的变量
不想让该变量传递到下级,声明方法:
unexport <variable ...>;
注意两个变量 *
- SHELL 和 MAKEFLAGS 这两个变量不管你是否 export,其总是要传递到下层 Makefile 中。
- MAKEFLAGS
- 包含了 make 的参数信息。
- 不想让 MAKEFLAGS 往下传递的做法
subsystem:
cd subdir && $(MAKE) MAKEFLAGS=
不往下传递的 参数
- make 命令中 -C , -f , -h, -o 和 -W 参数是不往下传递的。
信息打印 *
- -w 或是 --print-directory 会在 make 的过程中输出目前的工作目录。如:执行
make -w时
- -w 或是 --print-directory 会在 make 的过程中输出目前的工作目录。如:执行
# 进入该目录时会答应如下信息
make: Entering directory `/home/hchen/gnu/make'.
# 在完成下层 make 后离开目录时:
make: Leaving directory `/home/hchen/gnu/make'
* 当你使用 **-C** 参数来指定 **make** 下层 **Makefile** 时,**-w** 会被自动打开的。如果参数中有 **-s(--slient)**或是 **--no-print-directory** ,那么,**-w** 总是失效的。
4.5 定义命令包
- 相当于 C 中的函数。
- 语法以 define 开始,以 endef 结束。
- 例子:
- run-yacc
- 命令包名字
- 中间两句就是 命令包内容
- run-yacc
define run-yacc
yacc $(firstword $^)
mv y.tab.c $@
endef
- 调用方法
- 采用 $
foo.c:foo.y
$(run-yacc)
参考
- 《GUN Makefile》
- 《跟我一起写Makefile》
Makefile-4-书写命令的更多相关文章
- Linux makefile教程之书写命令四[转]
书写命令———— 每 条规则中的命令和操作系统Shell的命令行是一致的.make会一按顺序一条一条的执行命令,每条命令的开头必须以[Tab]键开头,除非,命令是紧跟 在依赖规则后面的分号后的.在命令 ...
- 很详细、很移动的Linux makefile教程:介绍,总述,书写规则,书写命令,使用变量,使用条件推断,使用函数,Make 的运行,隐含规则 使用make更新函数库文件 后序
很详细.很移动的Linux makefile 教程 内容如下: Makefile 介绍 Makefile 总述 书写规则 书写命令 使用变量 使用条件推断 使用函数 make 的运行 隐含规则 使用m ...
- [转] Makefile 基础 (4) —— Makefile 书写命令
该篇文章为转载,是对原作者系列文章的总汇加上标注. 支持原创,请移步陈浩大神博客:(最原始版本) http://blog.csdn.net/haoel/article/details/2886 我转自 ...
- GNU make规则的命令④书写命令
命令回显 通常, make 在执行命令行之前会把要执行的命令行输出到标准输出设备.我们称之为"回显",就好像我们在 shell 环境下输入命令执行时一样. 如果规则的命令行以字符& ...
- Makefile 书写规则
1.1 Makefile的规则 在讲述这个Makefile之前,还是让我们先来粗略地看一看Makefile的规则. target ... : prerequisites ... command ...
- make命令回显Makefile执行脚本命令
/********************************************************************** * make命令回显Makefile执行脚本命令 * 说 ...
- makefile的书写
工作中会遇到makefile的书写,有必要做一些笔记.尽管网上有”万能模板“可以使用,但我觉得还是有必要从最基础的写起. 平常在windows下开发,不知道自己用过makefile,其实大部分IDE里 ...
- Makefile: (实验) 目标命令的结束标志
实验表示测试出来的结论,没有代码理论依据 Makefile中,目标对应的命令结束标记是什么呢?换句话说,Make中怎么判断目标的最后一条命令? 例如常见的目标编写如下: test1: echo &qu ...
- 《GNU_makefile》第五章——为规则书写命令
1. 使用make的命令行参数-n或--just-print,make会只显示要执行的命令,不执行,这样方便调试makefile. 2.执行命令 每写一行命令,make会fork出一个shell进程来 ...
- Linux makefile教程之书写规则三[转]
书写规则———— 规则包含两个部分,一个是依赖关系,一个是生成目标的方法.在 Makefile中,规则的顺序是很重要的,因为,Makefile中只应该有一个最终目标,其它的目标都是被这个目标所连带出来 ...
随机推荐
- Activiti7 学习总结
什么是工作流? 就是通过计算机对业务流程进行自动化处理,实现多个参与者按照预定义的流程去自动执行业务流程 什么是Activiti? Activiti是一个工作流引擎,开源的架构,基于BPMN2.0标准 ...
- Hint usenl usage /*+ leading(emp,dept) usenl(emp) */
SQL> select /*+ leading(emp,dept) usenl(emp) */ emp.*,dept.* from tb_emp03 emp,tb_dept03 dept whe ...
- C#的TextBox的四种禁止编辑方法
前言 一般而言,Textbox中有两个属性可以对其进行防止编辑的设定,这是最基础的知识,也是我要提出的前两种方法.而后两种方法实际为一种,但可以应用于不同环境中. 一.ReadOnly属性 这样设置, ...
- Java使用ArrayList实现“群主发红包”功能
群主发普通红包,某群有多名成员,群主给成员发普通红包,普通红包的规则: 群主的一笔金额,从群主余额中扣除,平均分成n等份,让成员领取: 成员领取红包后,保存到成员余额中. 请根据描述,完成案例中所有类 ...
- HTML常用实体字符参考手册
最常用的字符实体 显示结果 描述 实体名称 实体编号 空格 < 小于号 < < > 大于号 > > & 和号 & & " ...
- Composer 包版本的范围指定(版本约束)
1. 包版本范围指定(自动下载版本约束范围中的最新版) 名称 实例 说明 不指定版本 根据当前Path环境变量中的php版本下载最合适的最新版 确切的版本 6.0.1 指定下载的具体版本号 范围 &g ...
- C#开发PACS医学影像处理系统(十五):Dicom影像交叉定位线算法
1.定位线概念:某个方位的影像在另一个方向的影像上的投影相交线,例如横断面(从头到脚的方向)在矢状面(从左手到右手)上的影像投影面交线. 举个例子:右边的是MR(核磁共振)的某一帧切片,这是从头开始扫 ...
- python库的基本情况
主要三个库 time()函数获取浮点数 ctime()函数可以获取时间,还可以以一种可读的方式表示时间 gmtime()函数
- spring framework源码之AnnotationConfigApplicationContext
AnnotationConfigApplicationContext 内部使用了AnnotatedBeanDefinitionReader:ClassPathBeanDefinitionScanner ...
- JVM学习(八)指令重排序
一.数据依赖性 在学习JVM的指令重排序之前,我们先了解一下什么是数据依赖性: 编译器和处理器在处理具体的指令时,可能会对操作进行重排序来提高执行性能[多条指令并行执行,所以提升性能的同时也可能会导致 ...