《GNU_makefile》第五章——为规则书写命令
1.
使用make的命令行参数-n或--just-print,make会只显示要执行的命令,不执行,这样方便调试makefile。
2.执行命令
每写一行命令,make会fork出一个shell进程来执行该命令,如果要让shell连续执行多条语句,使用 ; 链接命令。
SHELL环境变量指定make使用的shell程序.
3.并发执行
使用命令行选项-j指定make最多fork多少个shell进程去执行命令。
4.命令执行的错误
命令执行错误返回非0,make放弃对后续命令的执行。
使用 -,让make忽略命令执行错误。
如: -rm *.o
5.
6.递归执行命令
subsystem:
cd subdir && $(MAKE)
其等价于规则:
subsystem:
$(MAKE) -C subdir
make只将 命令定义变量(如 CFLAGS),环境变量(export xxx)传递给子make。
export 的一个变量或函数的引用,会被立即展开。
Y = Z
export X=$(Y)
不带任何参数的 export 指示符,会将所有变量传递给子make,但不但任何参数的unexport没有任何意义。
在多级make中,变量 MAKELEVEL 代表了调用深度,最上层为0,依次加1
Main 目录下的 Makefile 清单如下:
#maindir Makefile
………
………
.PHONY :test
test:
@echo “main makelevel = $(MAKELEVEL)”
@$(MAKE) –C subdir dislevel
#subdir Makefile
………..
………..
.PHONY : test
test :
@echo “subdir makelevel = $(MAKELEVEL)”
在 maindir 目录下执行“ make test”。将显式如下信息:
main makelevel = 0
make[1]: Entering directory `/…../ subdir '
subdir makelevel = 1
make[1]: Leaving directory `/…../ subdir '
这个变量主要用在条件测试指令中。例如:我们可以通过测试此变量的值来决定是
否执行递归方式的 make 调用或者其他方式的 make 调用。我们希望一个子目录必须被
上层 make 调用才可以执行此目录下的 Makefile,而不允许直接在此目录下执行 make。
我们可以这样实现:
.......
ifeq ($(MAKELEVEL),0)
all : msg
else
all : other
endif
……
…...
msg:
@echo ”Can not make in this directory!”
命令行参数之所以可以传递给子make,是因为命令行参数借助环境变量MAKEFLAGS传递。
“-C”、“ -f”、“ -o”和“ -W”。 这些命令行选项是不会被赋值给变量“ MAKEFLAGS”的
-j虽然会被传递,但子make和主控make会进行通信,保证整个进程数不超过-j设置的值。
当不希望MAKEFLAGS传递给子make,可以将其置空
subsystem:
cd subdir && $(MAKE) MAKEFLAGS=
7.定义命令包
命令包和C语言中的宏一样。
如
define run-yacc
yacc $(firstword $^)
mv y.tab.c $@
endef
命令包的使用,命令包在运行阶段被展开,和宏一样,是完全替换
foo.c : foo.y
$(run-yacc) --》
foo.c : foo.y
yacc $(firstword $^)
mv y.tab.c $@
在$(run-yacc)前一个tab,导致命令包每个命令前都加一个tab
《GNU_makefile》第五章——为规则书写命令的更多相关文章
- 很详细、很移动的Linux makefile教程:介绍,总述,书写规则,书写命令,使用变量,使用条件推断,使用函数,Make 的运行,隐含规则 使用make更新函数库文件 后序
很详细.很移动的Linux makefile 教程 内容如下: Makefile 介绍 Makefile 总述 书写规则 书写命令 使用变量 使用条件推断 使用函数 make 的运行 隐含规则 使用m ...
- GNU make规则的命令④书写命令
命令回显 通常, make 在执行命令行之前会把要执行的命令行输出到标准输出设备.我们称之为"回显",就好像我们在 shell 环境下输入命令执行时一样. 如果规则的命令行以字符& ...
- 《Linux命令行与shell脚本编程大全》 第十五章 学习笔记
第十五章:控制脚本 处理信号 重温Linux信号 信号 名称 描述 1 HUP 挂起 2 INT 中断 3 QUIT 结束运行 9 KILL 无条件终止 11 SEGV 段错误 15 TERM 尽可能 ...
- vim第五章 命令行模式
vim第五章命令行模式 技巧 27 结识vim的命令行模式 在命令行模式中执行的命令有被称作ex命令 在按/调出查找提示符或者<C-r>=访问表示寄存器时 命令行模式也被激活 ...
- 《GNU_Makefile》第4章——makefile规则
规则明确在什么情况下,使用什么方法,重构文件,该文件称为目标. make的唯一目的是重构终极目标.终极目标默认是第一个目标. 1. 2.规则语法 TARGETS : PREREQUISITES COM ...
- 《NodeJS开发指南》第五章微博实例开发总结
所有文章搬运自我的个人主页:sheilasun.me <NodeJS开发指南>这本书用来NodeJS入门真是太好了,而且书的附录部分还讲到了闭包.this等JavaScript常用特性.第 ...
- 精通Web Analytics 2.0 (7) 第五章:荣耀之钥:度量成功
精通Web Analytics 2.0 : 用户中心科学与在线统计艺术 第五章:荣耀之钥:度量成功 我们的分析师常常得不到我们应得的喜欢,尊重和资金,因为我们没有充分地衡量一个黄金概念:成果.因为我们 ...
- Linux makefile教程之书写命令四[转]
书写命令———— 每 条规则中的命令和操作系统Shell的命令行是一致的.make会一按顺序一条一条的执行命令,每条命令的开头必须以[Tab]键开头,除非,命令是紧跟 在依赖规则后面的分号后的.在命令 ...
- Java Persistence with MyBatis 3(中国版) 第五章 与Spring集成
MyBatis-Spring它是MyBatis子模块框.它用来提供流行的依赖注入框架Spring无缝集成. Spring框架是一个基于依赖注入(Dependency Injection)和面向切面编程 ...
随机推荐
- Chrome浏览器调试移动端网页,测试人员也可以轻松debug
现在的产品,移动端应用占据很大市场,在测试过程中,就会测试各种各样的移动端页面.测试过程,或多或少会发现些问题,无非就是前端.后端问题.后端接口问题,可以利用工具:Fiddler或charles抓包查 ...
- rs232转网络
rs232转网络 rs232转网络ZLAN5103可以实现RS232/485/422和TCP/IP之间进行透明数据转发.方便地使得串口设备连接到以太网和Internet,实现串口设备的网络化升级.支持 ...
- openstack 高可用环境部署(8节点)(一)
- 一入Java深似海
Java的基础语法 一个java程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来写协同工作.下面简要介绍下类.对象.方法和实例变量的概念. 对象: 对象是一个类的实例,有状态和行为.例如 ...
- Django的安装和项目的启动
一.安装(安装最新LTS版): 1.命令行安装 pip install django==1.11.18 -i 源 2.pycharm 安装 二.创建项目 1.命令行创建 下面的命令创建了一个名为 ...
- centos8上安装mysql8
一,下载并解压mysql8 1,mysql官网 https://www.mysql.com/ 2,下载到source目录 [root@yjweb source]# wget https://cdn.m ...
- C# Webservice中如何实现方法重载--(方法名同名时出现的问题)
本文摘抄自:http://blog.sina.com.cn/s/blog_53b720bb0100voh3.html 1.Webservice中的方法重载问题(1)在要重载的WebMethod上打个M ...
- 看完本文若不能让你学通“Python”,我将永远退出IT界
学Python,切忌今天这学一点,明天那里学一点,零零散散没有系统的学习.这样不仅耽搁大家时间,久而久之也会消磨大家学习的兴致!这里给大家总结了一张系统的Python学习路线图!希望大家共勉! Pyt ...
- list.add方法参数详解
- webpack4的安装使用
1.全局安装Webpack 安装到全局后你可以在任何地方共用一个 Webpack 可执行文件( 也就是说可以直接在终端使用webpack的命名 ,例如:webpack --config webpack ...