Makefile学习总结文档之Makefile的介绍与总述

Makefile的介绍与总述

最近在学习Android系统工程师的知识,涉及到Makefile的学习,本文参考《GNU_make_zh_CN》的pdf版本来学习的。
参考博客链接:https://www.cnblogs.com/cj5785/p/9893162.html

  1. 当使用make工具进行编译时,工程中以下几种文件在执行make时将会编译(重新编译):
    a) 所有的源文件没有被编译过,则对各个C源文件进行编译并进行链接,生成最后的可执行程序;
    b) 每一个在上次执行make之后修改过的C源代码文件在本次执行make时将会被重新编译;
    c) 头文件在上一次执行make之后被修改。则所有包含此头文件的C源文件在本次执行make时将会被重新编译;

  2. 一个简单的Makefile描述规则组成:
    TARGET…:PREREQUISITES…
    COMMAND

  3. 一个规则可以有多个命令行,每一条命令占一行。每一个命令行必须以[Tab]字符开始,[Tab]字符告诉make此行是一个命令行,make按照命令完成相应的动作。

  4. 所有的命令行必须以[Tab]字符开始,但并不是所有以[Tab]键出现行都是命令行,但make程序会把第一条规则之后的所有以[Tab]字符开始的行都作为命令行来处理。

  5. “#”字符后的内容被作为是注释内容处理。注释行的结尾如果存在反斜线“\”,那么下一行也被作为注释行。

  6. 在一个Makefile中包含其他的makefile文件,使用“include”,和c语言对头文件的包含方式一致。
    include FILENAMES…
    FILENAMES 是shell所支持的文件名(可以使用通配符)
    “$(bar)”被扩展为“bish bash”

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

  8. 使用“-”的意思是告诉make,忽略此操作的错误,make继续执行。如“-include FILENAMES…”,make程序处理时,如果“FILENAMES”列表中的任何一个文件不能正常读取而且不存在一个创建此文件的规则时,make程序将会提示错误并退出。

  9. 为了和其他的make程序进行兼容。也可以使用“sinclude”来代替“-include”;

  10. 如果使用一个没有依赖只有命令行的双冒号规则去更新一个文件,那么每次执行make时,此规则的目标文件将会被无条件的更新。如果这样一个规则的目标是makefile文件,那么执行make时,这个makefile文件(双冒号规则的目标)就会被无条件更新,而使得make的执行陷入一个死循环(此makefile文件被不断的更新、重新读取、更新在重新读取的过程)。为了防止这种情况的发生,make在遇到一个目标时makefile文件的双冒号规则时,将忽略对这个规则的执行。

  11. 执行make时,如果没有使用“-f”选项指定一个文件,make程序将会读取缺省的文件。

  12. make的执行过程分为两个阶段
    a) 读取所有的makefile文件(包括“MAKIFILES”变量指定的、指定符“include”指定的、以及命令行选项“-f”指定的makefile文件),内建所有的变量、明确规则和隐含规则,并建立所有目标和依赖之间的依赖关系结构链表。
    b) 根据第一阶段已经建立的依赖关系结构链表决定哪些目标需要更新,并使用对应的规则来重建这些目标。

  13. 当变量使用追加符(+=)时,如果此前这个变量是一个简单变量(使用:=定义的),则认为它是立即展开的,其他情况都被认为是“延后”展开的变量。

  14. 所有使用到条件语句在产生分支的地方,make 程序会根据预设条件将正确地分支展开。就是说条件分支的展开是“立即”的。其中包括:“ifdef”、“ifeq”、“ifndef”和“ifneq”所确定的所有分支命令。

  15. make 的执行过程如下:
    a) 依次读取变量“MAKEFILES”定义的 makefile 文件列表
    b) 读取工作目录下的 makefile 文件(根据命名的查找顺序“GNUmakefile”,“makefile”,“Makefile”,首先找到那个就读取那个)
    c) 依次读取工作目录 makefile 文件中使用指示符“include”包含的文件
    d) 查找重建所有已读取的 makefile 文件的规则(如果存在一个目标是当前读取的某一个 makefile 文件,则执行此规则重建此 makefile 文件,完成以后从第一步开始重新执行)
    e) 初始化变量值并展开那些需要立即展开的变量和函数并根据预设条件确定执行分支
    f) 根据“终极目标”以及其他目标的依赖关系建立依赖关系链表
    g) 执行除“终极目标”以外的所有的目标的规则(规则中如果依赖文件中任一个文件的时间戳比目标文件新,则使用规则所定义的命令重建目标文件)
    h) 执行“终极目标”所在的规则

发布了39 篇原创文章 · 获赞 13 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43443900/article/details/103259883