第三章: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. ContOS软件包安装【零】

      选择是“Minimal”安装  ,最小化.  越简单,越不容易出错. 1.听一些老鸟分析,选择安装包时应该按最小化原则,即不需要的或者不确定是否需要的就不安装,这样可以最大程度上确保系统安全.(安 ...

  2. 树莓派搭建 Hexo 博客(二)

    Hexo 一个开源的博客框架,本文记录了一下在树莓派上搭建 Hexo 博客的过程. 上一篇介绍了 Hexo 的配置,现在网站已经能在本地访问了,也能通过 hexo generate 命令生成静态界面 ...

  3. HDU 1698 Just a Hook(线段树区间覆盖)

    线段树基本操作练习,防手生 #include <cstdio> #include <cstring> #include <cstdlib> #define lson ...

  4. POJ 1703 Find them, Catch them(并查集拓展)

    Description The police office in Tadu City decides to say ends to the chaos, as launch actions to ro ...

  5. Week3 Teamework from Z.XML-团队分工及贡献分分配办法

    引言:团队项目即将开展,本文将就团队分工,以及分数分配办法进行阐述 一.团队分工 本周我们团队进行了初步的分工,结果如下: PM: 李孟 Dev:毛宇 薛亚杰 肖俊鹏 罗凡 Test:周敏轩 马辰 李 ...

  6. (转载)MYSQL千万级数据量的优化方法积累

    转载自:http://blog.sina.com.cn/s/blog_85ead02a0101csci.html MYSQL千万级数据量的优化方法积累 1.分库分表 很明显,一个主表(也就是很重要的表 ...

  7. SQL SERVER 查询语句学习:CHARINDEX

    场景介绍 项目A需要一个批量删除的功能,之前我一直用SqlTransaction去处理,今天同事告诉我可以用CHARINDEX函数去解决问题,因此我今天就研究了一下. SQL语句 ---定义要删除的数 ...

  8. 关于org.springframework.web.filter.CharacterEncodingFilter的学习

    介绍 org.springframework.web.filter.CharacterEncodingFilter 这是一个过滤器,是Spring在web请求中定义request和response的编 ...

  9. 【转】GOOGLE-PROTOBUF与FLATBUFFERS数据的序列化和反序列化

    转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/unity3d-game/1607.html  关于Protobuf 通过本文的转载和分享的相关链接,足够 ...

  10. Java中动态代理实现原理深究

    一.前言 笔者平时开发使用“动态代理”不多,最近在看设计模式的时候,“动态代理”又在面前晃了几次,所以这次想从源码的角度去分析动态代理的实现原理,以窥探其精妙~ 二.正文 2.1 静态代理  本文源码 ...