第三章: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. VC中结构体的内存布局

    看了 VC++中内存对齐 这篇文章,感觉说复杂了,根据我的总结,要算出结构体的内存大小和偏移量,只要清楚结构体各成员的内存布局就行了,下面介绍一下我总结的规则,有不对之处,欢迎回复. 1.实际PACK ...

  2. sql between and 边界问题

    1.不同的数据库对 BETWEEN...AND 操作符的处理方式是有差异的.需要自己测试 2.一般情况下.SQL Server中 between and是包括边界值的,not between不包括边界 ...

  3. Python中enumerate函数用法详解

    enumerate函数用于遍历序列中的元素以及它们的下标,多用于在for循环中得到计数,enumerate参数为可遍历的变量,如 字符串,列表等 一般情况下对一个列表或数组既要遍历索引又要遍历元素时, ...

  4. 【Python】- 如何使用Visual Studio 2013编写python?

    安装Visual Studio 2013 1.VS2013下载安装略 安装python2.7 1.从官网下载python2.7,下载地址:https://www.python.org/getit/  ...

  5. 【bzoj1391】[Ceoi2008]order 网络流最小割

    原文地址:http://www.cnblogs.com/GXZlegend/p/6796937.html 题目描述 有N个工作,M种机器,每种机器你可以租或者买过来. 每个工作包括若干道工序,每道工序 ...

  6. 2017南开ACM校赛(网络赛) 民间题解

    orz 首先说一下这个只是民间题解,可能会有很多错误 程序还没有评测,所以可能存在问题 C题比赛的时候没想到..后来发现是个模板题,所以没有代码 希望这份题解能对读者有所启发吧... A题 直接倒序枚 ...

  7. 洛谷 P2387 [NOI2014]魔法森林 解题报告

    P2387 [NOI2014]魔法森林 题目描述 为了得到书法大家的真传,小 E 同学下定决心去拜访住在魔法森林中的隐 士.魔法森林可以被看成一个包含 n 个节点 m 条边的无向图,节点标号为 1,2 ...

  8. 【NOIP 模拟赛】Evensgn 剪树枝 树形dp

    由于树规做的少所以即使我考试想出来正确的状态也不会转移. 一般dp的转移不那么繁杂(除了插头.....),即使多那也是清晰明了的,而且按照树规的一般思路,我们是从下到上的,所以我们要尽量简洁地从儿子那 ...

  9. 关于final局部变量引用的研究

    嵌套类(内部类)方法安全引用外部方法局部变量的原理 嵌套类方法引用外部局部变量,必需将声明为final,否则将出现 Cannot refer to a non-final variable * ins ...

  10. Educational Codeforces Round 55:B. Vova and Trophies

    B. Vova and Trophies 题目链接:https://codeforc.es/contest/1082/problem/B 题意: 给出一个“GS”串,有一次交换两个字母的机会,问最大的 ...