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》第五章——为规则书写命令的更多相关文章

  1. 很详细、很移动的Linux makefile教程:介绍,总述,书写规则,书写命令,使用变量,使用条件推断,使用函数,Make 的运行,隐含规则 使用make更新函数库文件 后序

    很详细.很移动的Linux makefile 教程 内容如下: Makefile 介绍 Makefile 总述 书写规则 书写命令 使用变量 使用条件推断 使用函数 make 的运行 隐含规则 使用m ...

  2. GNU make规则的命令④书写命令

    命令回显 通常, make 在执行命令行之前会把要执行的命令行输出到标准输出设备.我们称之为"回显",就好像我们在 shell 环境下输入命令执行时一样. 如果规则的命令行以字符& ...

  3. 《Linux命令行与shell脚本编程大全》 第十五章 学习笔记

    第十五章:控制脚本 处理信号 重温Linux信号 信号 名称 描述 1 HUP 挂起 2 INT 中断 3 QUIT 结束运行 9 KILL 无条件终止 11 SEGV 段错误 15 TERM 尽可能 ...

  4. vim第五章 命令行模式

    vim第五章命令行模式 技巧 27 结识vim的命令行模式 在命令行模式中执行的命令有被称作ex命令    在按/调出查找提示符或者<C-r>=访问表示寄存器时 命令行模式也被激活     ...

  5. 《GNU_Makefile》第4章——makefile规则

    规则明确在什么情况下,使用什么方法,重构文件,该文件称为目标. make的唯一目的是重构终极目标.终极目标默认是第一个目标. 1. 2.规则语法 TARGETS : PREREQUISITES COM ...

  6. 《NodeJS开发指南》第五章微博实例开发总结

    所有文章搬运自我的个人主页:sheilasun.me <NodeJS开发指南>这本书用来NodeJS入门真是太好了,而且书的附录部分还讲到了闭包.this等JavaScript常用特性.第 ...

  7. 精通Web Analytics 2.0 (7) 第五章:荣耀之钥:度量成功

    精通Web Analytics 2.0 : 用户中心科学与在线统计艺术 第五章:荣耀之钥:度量成功 我们的分析师常常得不到我们应得的喜欢,尊重和资金,因为我们没有充分地衡量一个黄金概念:成果.因为我们 ...

  8. Linux makefile教程之书写命令四[转]

    书写命令———— 每 条规则中的命令和操作系统Shell的命令行是一致的.make会一按顺序一条一条的执行命令,每条命令的开头必须以[Tab]键开头,除非,命令是紧跟 在依赖规则后面的分号后的.在命令 ...

  9. Java Persistence with MyBatis 3(中国版) 第五章 与Spring集成

    MyBatis-Spring它是MyBatis子模块框.它用来提供流行的依赖注入框架Spring无缝集成. Spring框架是一个基于依赖注入(Dependency Injection)和面向切面编程 ...

随机推荐

  1. Chrome浏览器调试移动端网页,测试人员也可以轻松debug

    现在的产品,移动端应用占据很大市场,在测试过程中,就会测试各种各样的移动端页面.测试过程,或多或少会发现些问题,无非就是前端.后端问题.后端接口问题,可以利用工具:Fiddler或charles抓包查 ...

  2. rs232转网络

    rs232转网络 rs232转网络ZLAN5103可以实现RS232/485/422和TCP/IP之间进行透明数据转发.方便地使得串口设备连接到以太网和Internet,实现串口设备的网络化升级.支持 ...

  3. openstack 高可用环境部署(8节点)(一)

  4. 一入Java深似海

    Java的基础语法 一个java程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来写协同工作.下面简要介绍下类.对象.方法和实例变量的概念. 对象: 对象是一个类的实例,有状态和行为.例如 ...

  5. Django的安装和项目的启动

    一.安装(安装最新LTS版): 1.命令行安装 pip install django==1.11.18 -i 源 2.pycharm 安装    二.创建项目 1.命令行创建 下面的命令创建了一个名为 ...

  6. centos8上安装mysql8

    一,下载并解压mysql8 1,mysql官网 https://www.mysql.com/ 2,下载到source目录 [root@yjweb source]# wget https://cdn.m ...

  7. C# Webservice中如何实现方法重载--(方法名同名时出现的问题)

    本文摘抄自:http://blog.sina.com.cn/s/blog_53b720bb0100voh3.html 1.Webservice中的方法重载问题(1)在要重载的WebMethod上打个M ...

  8. 看完本文若不能让你学通“Python”,我将永远退出IT界

    学Python,切忌今天这学一点,明天那里学一点,零零散散没有系统的学习.这样不仅耽搁大家时间,久而久之也会消磨大家学习的兴致!这里给大家总结了一张系统的Python学习路线图!希望大家共勉! Pyt ...

  9. list.add方法参数详解

  10. webpack4的安装使用

    1.全局安装Webpack 安装到全局后你可以在任何地方共用一个 Webpack 可执行文件( 也就是说可以直接在终端使用webpack的命名 ,例如:webpack --config webpack ...