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. pytest文档59-运行未提交git的用例(pytest-picked)

    前言 我们每天写完自动化用例后都会提交到 git 仓库,随着用例的增多,为了保证仓库代码的干净,当有用例新增的时候,我们希望只运行新增的未提交 git 仓库的用例. pytest-picked 插件可 ...

  2. jmeter_04_常用取样器

    目录 常用取样器详解 http取样器 1.1 基本配置 1.2 高级配置 jdbc取样器 2.1 JDBC Connection Configuration 2.1.1 **Variable Name ...

  3. Spring Boot使用Mybatis实现增删改查

    java.com.wms.model.Admin.java 1 package com.wms.model; 2 3 import java.sql.Timestamp; 4 5 public cla ...

  4. mysql锁 转

    参考文章:https://blog.csdn.net/puhaiyang/article/details/72284702 一.mysql锁的结构图 如上图所示,针对mysql的innodb存储引擎, ...

  5. mysql You can't specify target table 'sys_right_menu' for update in FROM clause (不能从Objor子句中指定目标表“SysRyType菜单)

    错误语句: DELETE from sys_right_menu where right_id  in (SELECT m.right_id from sys_right_menu  mLEFT JO ...

  6. django—模型相关

    配置数据库信息 1.settings配置 DATABASES = {     "default": {         "ENGINE": "djan ...

  7. eclipse配置打开选中文件存储的目录快捷配置

    方便同时复制多个包的文件 https://jingyan.baidu.com/article/adc8151353a896f723bf73cd.html

  8. 使用Socket通信(二)

    这个socket有梗,主要是服务器端有梗,可能大家会碰到同样的问题,网上查了好久,这里分享一下解决办法.首先在第一个module建一个类SimpleServer,这个类就是服务端,建好之后在代码左边有 ...

  9. linux中nginx中配置端口转发

    域名指向主机IP地址,通过域名:8080才能访问网站,去掉后面的8080:或者其他的端口号,直接使用域名访问网站 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处 ...

  10. C2. Pokémon Army (hard version) 解析(思維)

    Codeforce 1420 C2. Pokémon Army (hard version) 解析(思維) 今天我們來看看CF1420C2 題目連結 題目 略,請直接看原題. 前言 根本想不到這個等價 ...