前言

  • 本笔记主要记录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

      • 意思是:某规则中的命令出错了,就终止该规则的执行,但继续执行其它规则。

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 ...>;
  • 注意两个变量 *

    • SHELLMAKEFLAGS 这两个变量不管你是否 export,其总是要传递到下层 Makefile 中。
    • MAKEFLAGS
      • 包含了 make 的参数信息。
    • 不想让 MAKEFLAGS 往下传递的做法
subsystem:
   cd subdir && $(MAKE) MAKEFLAGS=
  • 不往下传递的 参数

    • make 命令中 -C , -f , -h, -o-W 参数是不往下传递的。
  • 信息打印 *

    • -w 或是 --print-directory 会在 make 的过程中输出目前的工作目录。如:执行 make -w
# 进入该目录时会答应如下信息
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

      • 命令包名字
    • 中间两句就是 命令包内容
define run-yacc
yacc $(firstword $^)
mv y.tab.c $@
endef
  • 调用方法

    • 采用 $
foo.c:foo.y
$(run-yacc)

参考

  • 《GUN Makefile》
  • 《跟我一起写Makefile》

Makefile-4-书写命令的更多相关文章

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

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

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

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

  3. [转] Makefile 基础 (4) —— Makefile 书写命令

    该篇文章为转载,是对原作者系列文章的总汇加上标注. 支持原创,请移步陈浩大神博客:(最原始版本) http://blog.csdn.net/haoel/article/details/2886 我转自 ...

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

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

  5. Makefile 书写规则

    1.1 Makefile的规则 在讲述这个Makefile之前,还是让我们先来粗略地看一看Makefile的规则. target ... : prerequisites ...   command   ...

  6. make命令回显Makefile执行脚本命令

    /********************************************************************** * make命令回显Makefile执行脚本命令 * 说 ...

  7. makefile的书写

    工作中会遇到makefile的书写,有必要做一些笔记.尽管网上有”万能模板“可以使用,但我觉得还是有必要从最基础的写起. 平常在windows下开发,不知道自己用过makefile,其实大部分IDE里 ...

  8. Makefile: (实验) 目标命令的结束标志

    实验表示测试出来的结论,没有代码理论依据 Makefile中,目标对应的命令结束标记是什么呢?换句话说,Make中怎么判断目标的最后一条命令? 例如常见的目标编写如下: test1: echo &qu ...

  9. 《GNU_makefile》第五章——为规则书写命令

    1. 使用make的命令行参数-n或--just-print,make会只显示要执行的命令,不执行,这样方便调试makefile. 2.执行命令 每写一行命令,make会fork出一个shell进程来 ...

  10. Linux makefile教程之书写规则三[转]

    书写规则———— 规则包含两个部分,一个是依赖关系,一个是生成目标的方法.在 Makefile中,规则的顺序是很重要的,因为,Makefile中只应该有一个最终目标,其它的目标都是被这个目标所连带出来 ...

随机推荐

  1. Java审计之SQL注入篇

    Java审计之SQL注入篇 0x00 前言 本篇文章作为Java Web 审计的一个入门文,也是我的第一篇审计文,后面打算更新一个小系列,来记录一下我的审计学习的成长. 0x01 JDBC 注入分析 ...

  2. Linux curl携带cookie测试接口

    问题: 休息在家,被告知要启动测试环境的一个定时任务,但是服务器在内网,连上vpn只能访问内网的开发环境,无法访问测试环境,于是进开发环境服务器,ping测试环境的ip,发现是通的,于是想到通过开发环 ...

  3. VMware参数disk.EnableUUID生效扫描不出来UUID

    问题描述:搭建RAC中的共享磁盘,在一个节点上部署磁盘,另一个节点加入共享磁盘,使用扫描UUID的方法,但是莫名其妙一直扫描不出来UUID,使用了各种各样的方法,一个星期时间接近崩溃,又搞了一下午的测 ...

  4. C enum(枚举)

    C enum(枚举) 枚举是 C 语言中的一种基本数据类型,它可以让数据更简洁,更易读. 枚举语法定义格式为: enum 枚举名 {枚举元素1,枚举元素2,……}; 接下来我们举个例子,比如:一星期有 ...

  5. C/C++ 实现PE文件特征码识别

    PE文件就是我们常说的EXE可执行文件,针对文件特征的识别可以清晰的知道该程序是使用何种编程语言实现的,前提是要有特征库,PE特征识别有多种形式,第一种是静态识别,此方法就是只针对磁盘中文件的特征码字 ...

  6. oracle之分层查询

    ORACLE分层查询start with&connect by 分层查询是select 语句的扩展,目的是迅速找出表中列-列的隶属关系. 19.1 树的遍历 ORACLE是一个关系数据库管理系 ...

  7. ajax之---上传文件

    “伪”ajax向后台提交文件        <iframe style="display: none" id="iframe1" name="i ...

  8. 如何把自己开发的项目上传到GitHub仓库或者码云仓库?

    首先你需要用你的邮箱去注册一个自己的GitHub仓库 or 码云仓库.然后确保你的电脑安装了git. 码云仓库:https://gitee.com/ GitHub:https://github.com ...

  9. Docker学习笔记,从原理到实践

    什么是docker Docker是使用go语言基于LINUX内核的cgroup,namespace以及AUFS 类的 Union FS 等技术,对进程进行封装隔离的一种操作系统层面的虚拟化技术,由于隔 ...

  10. python链表从尾到头的顺序返回一个ArrayList

    思路:获取链表的值,添加入列表中,反转列表即可获得ArrayList # -*- coding:utf-8 -*- # class ListNode: # def __init__(self, x): ...