第三章:makefile总述

3.1makefile的内容

  在一个完整的makefile中,包含显示规则、隐含规则、变量定义、指示符和注释。下面讨论一些基本概念:

  显示规则:它描述了在何种情况下如何更新一个或者多个被称为目标的文件。书写makefile时需要明确地给出目标文件、目标的依赖文件列表以及更新目标文件所需要的命令。

  隐含规则:它是make根据一类目标文件而自动退到出来的规则。make根据目标文件的名,自动产生目标的依赖文件并使用默认的命令来对目标进行更新。

  变量定义:使用一个字符或字符串代表一段文本串,当定义一个变量以后,makefile在后续需要使用次文本的地方,通过引用这个变量来实现对文本串的使用。

  makefile指示符:指示符指明在make程序读取makefile文件过程中所要执行的一个动作。其中包括:读取一个文件,读取给定文件名的文件,将其内容作为makefile文件的一部分;决定处理或者忽略makefile中的某一特定部分;定义一个多行变量。

  注释:使用#来注释内容,当需要使用字符#时,可以使用反斜杠加#的方式来实现"\#"。

  makefile所以以tab字符开始的行,make程序都会将其交给系统shell程序去解释执行。因此,以tab字符开始的注释行也会被交给shell来处理,此命令是否需要被执行是由系统shell程序来判定。

3.3:包含其它makefile文件

  makefile中包含其他文件所需要使用的关键字是“INCLUDE”,和c怨言对头文件的包含方式一致。

  include指示符高速make暂停读取当前的makefile,而转去读取include指定的一个或者多个文件,完成以后再继续当前makefile的读取,makefile中的指示符include书写在独立的一行,其形式如下:

  include  FILENEMES...

  FILENAMES是shell所支持的文件名。(可以使用通配符)

  例如上一篇中的makefile文件可以写成两个不同的makefile文件:

  makefile:

obj = main.o hello.o

main:$(obj)
cc -o main $(obj)
include makefile1
.PHONY:clean
clean:
rm -rf *.o main

  makefile1:

main.o hello.o : hello.h

再来看一个例子,存在三个.mk文件a.mk、b.mk、c.mk,“$(bar)”被扩展为“bish bash”。

include foo *.mk $(bar)

等价于:

include foo a.mk b.mk c.mk bish bash

  之前已经提到make程序在处理指示符include时,将暂停对当前使用指示符include的makefile文件的读取,而转去依次读取由include指示符指定的文件列表。直到完成所有这些文件以后再回过头继续读取指示符include所在的makefile文件。

通常指示符用在以下场合:

  1、有多个不同的程序,由不同目录下的几个独立的makefile来描述其重建规则。他们需要使用一组通用的变量定义或者模式规则。通用的做法是将这些共同使用的变量或者模式规则定义在一个文件中,在需要使用的makefile中使用指示符include来包含此文件。

  2、当根据源文件自动产生依赖文件时;我们可以将自动产生的依赖关系保存在另外一个文件中,主makefile使用指示符include包含这些文件。这样的做法比直接在主makefile中追加依赖文件的方法要明智得多。

3.10 总结

  make 的执行过程如下:

  1. 依次读取变量“MAKEFILES”定义的makefile 文件列表

  2. 读取工作目录下的makefile 文件(根据命名的查找顺序“GNUmakefile”,“makefile”,“Makefile”,首先找到那个就读取那个)

  3. 依次读取工作目录makefile 文件中使用指示符“include”包含的文件
  4. 查找重建所有已读取的makefile 文件的规则(如果存在一个目标是当前读取的某一个makefile 文件,则执行此规则重建此makefile 文件,完成以后从第一步开始重新执行)
  5. 初始化变量值并展开那些需要立即展开的变量和函数并根据预设条件确定执行分支
  6. 根据“终极目标”以及其他目标的依赖关系建立依赖关系链表
  7. 执行除“终极目标”以外的所有的目标的规则(规则中如果依赖文件中任一个文件的时间戳比目标文件新,则使用规则所定义的命令重建目标文件)
  8. 执行“终极目标”所在的规则

LINUX环境下的GUN MAKE学习笔记(二)的更多相关文章

  1. linux环境下的GUN make学习笔记(一)

    第一章:概述 1.1:make概述 在linux环境下使用make工具能够比较容易的构建一个属于自己的工程,整个工程的编译只需要一个命令就可以完成编译.连接以至于最后的执行.不过我们需要投入一些时间去 ...

  2. Linux环境下常用软件(个人笔记编辑更改中)

    近期使用CentOS,就在这里记录一下.首先,个人版本是CentOS6.5,属于centos系列,Fedora系列的理论上也可以用. 工欲善其事,必先利其器,这里介绍我的软件包配置: 1.vim(增强 ...

  3. Linux 环境下一些常用的命令(二)

    11. chown命令 "chown"命令就是改变文件拥有者和所在用户组.每个文件都属于一个用户组和一个用户.在你的目录下,使用"ls -l",你就会看到像这样 ...

  4. linux环境下写C++操作mysql(二)

    main.cpp #include<stdio.h> #include<stdlib.h> #include"mysqlInterface.h" int m ...

  5. Linux环境下用Weblogic发布项目【二】 -- 配置Domain域

    配置注意事项: 修改密码时密码长度最少8位:在"<下一步>"后面为空即表示敲回车: 具体配置步骤如下: [root@GPS-App ~]# [root@GPS-App ...

  6. Docker学习笔记二(linux下安装Docker)

    Docker学习笔记二(linux下安装Docker) 1.在线安装linux Docker 这种方式首先要保证linux 环境下可以上网,当然,小编是在自己的电脑上安装了虚拟机,在虚拟机上安装了,l ...

  7. linux环境下学习使用pro*c/c++工具

    1.proc是oracle用来预编译嵌入SQL语句的c程序. 2.如何使用proc工具 在Linux环境下,首先确保gcc编译器正常使用,安装oracle数据库或者客户端,一般就会默认安装pro*c/ ...

  8. 【云和恩墨】性能优化:Linux环境下合理配置大内存页(HugePage)

    原创 2016-09-12 熊军 [云和恩墨]性能优化:Linux环境下合理配置大内存页(HugePage)   熊军(老熊) 云和恩墨西区总经理 Oracle ACED,ACOUG核心会员 PC S ...

  9. 《Linux内核分析》第一周学习笔记

    <Linux内核分析>第一周学习笔记 计算机是如何工作的 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/c ...

随机推荐

  1. php+Mysql中网页出现乱码的解决办法详解

    $conn = mysql_connect("$host","$user","$password");mysql_query("S ...

  2. c# log

    public static void WriteMsg(string logName, string msg) { try { //string path = Path.Combine(". ...

  3. C++STL中的vector的简单实用

    [原创] 使用C++STL中的vector, #include <stdio.h> #include<stdlib.h> #include<vector> usin ...

  4. PAT 1090 危险品装箱

    https://pintia.cn/problem-sets/994805260223102976/problems/1038429484026175488 集装箱运输货物时,我们必须特别小心,不能把 ...

  5. Delphi 之 编辑框控件(TEdit)

    TEdit 组件主要用于数据的输入和显示和编辑等操作. AutoSelect 获取组件焦点.该属性只能在单行文本组件使用.值为True为选中.false则不选中. BorderStyle 设置编辑框控 ...

  6. mplab c30 注册方法

    http://blog.csdn.net/q553716434/article/details/7459036 关键文件是: C:\Program Files\Microchip\MPLAB C30\ ...

  7. 【题解】ZJOI2007报表统计

    洛谷传送门 主要思路大概也是差不多的,对于两种询问分别用线段树与平衡树来维护. 1.MIN_SORT_GAP:显然平衡树简单操作,来一发前驱.后继即可. 2.MIN_GAP:这一个我用的是线段树:可以 ...

  8. BZOJ3242 [Noi2013]快餐店 【环套树 + 单调队列dp】

    题目链接 BZOJ3242 题解 题意很清楚,找一点使得最远点最近 如果是一棵树,就是直径中点 现在套上了一个环,我们把环单独拿出来 先求出环上每个点外向树直径更新答案,并同时求出环上每个点外向的最远 ...

  9. clear:both其实是有瑕疵的

    在开发中,从美工MM给你Html代码中,肯定能经常看"<div style="clear:both;"></div>"这样的代码,但是你 ...

  10. 洛谷P1522 牛的旅行 Cow Tours

    ---恢复内容开始--- P1522 牛的旅行 Cow Tours189通过502提交题目提供者该用户不存在标签 图论 USACO难度 提高+/省选-提交该题 讨论 题解 记录 最新讨论 输出格式题目 ...