第三章: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. 维特比算法(Viterbi)及python实现样例

    维特比算法(Viterbi) 维特比算法 维特比算法shiyizhong 动态规划算法用于最可能产生观测时间序列的-维特比路径-隐含状态序列,特别是在马尔可夫信息源上下文和隐马尔科夫模型中.术语“维特 ...

  2. 关于iframe的使用 以及自适应页面高度

    1. <a href="port" target="frame_view">港口资料</a> <iframe id="e ...

  3. MySQL初识2

    用python调用mysql的一些方法总结: 1.编码声明: # encoding: UTF-8#!/usr/bin/python 在开头处进行声明,避免出现输入中文时,提示声明错误(当然输入中文出现 ...

  4. PTA实验报告 数组

    (第二张代码均为英红的代码) 题目1:题目名称:数组元素循环右移问题 1. 本题PTA提交列表 2. 设计思路(包括流程图) 将数组内每个位置移动,第2个放第一个,第三个放第二个,以此类推.使用两个循 ...

  5. PTA实验报告(循环 数组 函数)

    一.循环PTA实验作业 题目一.7-2 求平方根序列前N项和 1.本题PTA提交列表 2.设计思路 本题调用了sqrt数学函数计算平方根,其次只用了一层循环,计算平方根之后使用循环累加计算总和sum. ...

  6. 【Linux】——实用命令

    [前言] Linux的命令可以分为文件存取.目录操作.进程管理.权限管理.磁盘操作等内容,大量的命令方便了用户进行更快捷更高效的工作.但有一点需要说明的是,如果不采用linux的命令,也可以完成相应的 ...

  7. clone项目到本地

    clone项目到本地 1.然后在本地建立接受代码的文件夹,然后cd 到这个目录 (克隆版本库的时候,所使用的远程主机自动被git命名为origin.如果想用其他的主机名,需要用git clone命令的 ...

  8. 【历史】- Unix英雄传:图文细数十五位计算机先驱

    Unix,一款多任务多用户操作系统,最早由AT&T公司员工及合作伙伴在贝尔实验室于1969年开发完成.Unix的衍生及克隆版本包括Berkeley Unix.Minix.Linux.AIX.A ...

  9. BZOJ4446 SCOI2015小凸玩密室(树形dp)

    设f[i][j]为由根进入遍历完i子树,最后一个到达的点是j时的最小代价,g[i][j]为由子树内任意一点开始遍历完i子树,最后一个到达的点是j时的最小代价,因为是一棵完全二叉树,状态数量是nlogn ...

  10. hihocoder 1457(后缀自动机+拓扑排序)

    题意 给定若干组由数字构成的字符串,求所有不重复子串的和(把他们看成十进制),答案mod(1e9+7) 题解: 类似后缀数组的做法,把字符串之间用':'连接,这里用':'是因为':'的ascii码恰好 ...