首页 > 代码库 > Makefile总述②

Makefile总述②

Makefile的内容

  在一个完整的 Makefile 中,包含了 5 个东西:显式规则、隐含规则、变量定义、指示符和注释。

  • 显式规则:它描述了在何种情况下如何更新一个或者多个被称为目标的文件( Makefile 的目标文件)。书写 Makefile 时需要明确地给出目标文件、目标的依赖文件列表以及更新目标文件所需要的命令(有些规则没有命令,这样的规则只是纯粹的描述了文件之间的依赖关系)。
  • 隐含规则:它是make根据一类目标文件(典型的是根据文件名的后缀)而自动推导出来的规则。 make根据目标文件的名,自动产生目标的依赖文件并使用默认的命令来对目标进行更新(建立一个规则)。
  • 变量定义:使用一个字符或字符串代表一段文本串,当定义了一个变量以后,Makefile后续在需要使用此文本串的地方,通过引用这个变量来实现对文本串的使用。
  • Makefile 指示符:指示符指明在 make 程序读取 makefile 文件过程中所要执行的一个动作。其中包括:
    • 读取一个文件,读取给定文件名的文件,将其内容作为makefile文件的一部分。
    • 决定(通常是根据一个变量的得值)处理或者忽略Makefile中的某一特定部分。
    • 定义一个多行变量
  • 注释: Makefile 中“ #”字符后的内容被作为是注释内容(和 shell 脚本一样)处理。如果此行的第一个非空字符为“ #”,那么此行为注释行。注释行的结尾如果存在反斜线( \),那么下一行也被作为注释行。一般在书写 Makefile时推荐将注释作为一个独立的行,而不要和 Makefile 的有效行放在一行中书写。当在 Makefile 中需要使用字符“ #”时,可以使用反斜线加“ #”( \#)来实现(对特殊字符“ #”的转义),其表示将“ #”作为一字符而不是注释的开始标志。

  需要注意的地方:

    Makefile 中第一个规则之后的所有以[Tab]字符开始的的行, make 程序都会将其交给系统 shell 程序去解释执行。因此,以[Tab]字符开始的注释行也会被交给 shell 来处理,此命令行是否需要被执行( shell 执行或者忽略)是由系统 shell 程序来判决的。

 

Makefile文件的命名

  默认的情况下, make 会在工作目录(执行 make 的目录)下按照文件名顺序寻找makefile 文件读取并执行,查找的文件名顺序为:“ GNUmakefile”、“ makefile”、“ Makefile”。

  通常应该使用“ makefile”或者“ Makefile”作为一个 makefile 的文件名(我们推荐使用“ Makefile”,首字母大写而比较显著,一般在一个目录中和当前目录的一些重要 文 件 ( README,Chagelist 等 ) 靠 近 , 在 寻 找 时 会 比 较 容 易 的 发 现 它 ) 。 而“ GNUmakefile” 是我们不推荐使用的文件名, 因为以此命名的文件只有“ GNU make”才可以识别,而其他版本的 make 程序只会在工作目录下“ makefile”和“ Makefile”这两个文件。

  当 makefile 文件的命名不是这三个任何一个时,需要通过 make 的“ -f” 或者 “ --file” 选项来指定 make 读取的 makefile 文件。给 make 指定 makefile 文件的格式为:“ -fNAME” 或者 “ —file=NAME”, 它指定文件 “ NAME” 作为执行 make 时读取的 makefile文件。也可以通过多个“ -f”或者“ --file”选项来指定多个需要读取的 makefile 文件,多个 makefile 文件将会被按照指定的顺序进行链接并被 make 解析执行。当通过“ -f”或者“ --file”指定 make 读取 makefile 的文件时, make 就不再自动查找这三个标准命名的 makefile 文件。

 

包含其他Makefile文件

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

    include FILENAMES...

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

  不能以[tab]开头。

 

Makefile总述②