编写Makefile

参考资料:GNU make

告诉make如何重新编译系统的信息来自于读取一个名为makefile的数据库。

Makefile包含的内容

makefile包含五种内容:显式规则、隐式规则、变量定义、指令和注释

  • 一个显式规则说明何时以及如何重新创建一个或多个文件,这些文件称为规则的目标。它列出了目标所依赖的其他文件,称为目标的先决条件,还可能给出用于创建或更新目标的recipe。
  • 一个隐式规则说明了何时以及如何根据文件名重新创建类文件。它描述了目标如何依赖名称与目标相似的文件,并给出了创建或更新这样一个目标的recipe。
  • A variable definition is a line that specifies a text string value for a variable that can be substituted into the text later.
  • 指令是让make在读取makefile时执行一些特殊操作的指令,包括:
    • 阅读另一个makefile
    • (基于变量的值)决定是使用还是忽略makefile的一部分
    • 从包含多行的逐字字符串(verbatim string)定义变量
  • 在makefile的一行中使用“#”开始注释。如果想要表示字面上的#,用反斜杠转义它(\#)。

分割较长的行

Makefiles使用“基于行”的语法,其中换行符是特殊的,标志着语句的结束。GNU make对语句行长度没有限制,最大的限制是计算机中的内存数量。然而,如果不换行或滚动,就很难读取太长而无法显示的行。因此,可以通过在语句中间添加换行符来格式化makefile文件以提高可读性:通过使用反斜杠(\)字符来转义内部换行符。

反斜杠/换行符组合的处理方式取决于语句是recipe行还是非recipe行。在recipe行之外,反斜杠/换行符被转换为一个空格字符,且反斜杠/换行符周围所有的空白都会被压缩成一个空格。而在recipe行中,反斜杠/换行符会被保留并传递给shell,如何解释反斜杠/换行符取决于使用的shell;如果下一行开头是制表符,则制表符被去掉,recipe行不会添加空白

Makefile的名字

默认情况下,当make查找makefile时,它会按顺序尝试以下名称:GNUmakefile,makefile和Makefile。

如果你想使用非标准的makefile名称,你可以使用-f--file选项指定makefile名称。参数-f name--file=name告诉make读取文件name作为makefile。如果使用了多个-f--file选项,则可以指定几个makefile。所有makefile都按照指定的顺序有效地连接起来。如果你指定了-f--file选项,make不会使用默认的makefile名称GNUmakefile, makefile和Makefile

引用其他的Makefile文件

include指令告诉make暂停读取当前makefile,并在继续之前先读取一个或多个其他makefile:

include filenames...

文件名可以包含shell文件名模式,如果文件名为空,则不包含任何内容,也不会打印错误。行首允许有额外的空格,并且可以忽略,但是第一个字符不能是制表符(或者. RECIPEPREFIX的值)——如果行以制表符开头,它将被认为是一个recipe行。

include和文件名之间以及各文件名之间需要空格。例如,如果有三个.mk文件,a.mk、b.mk和c.mk,并且$(bar)扩展为bish bash,那么include foo *.mk $(bar)等效于include foo a.mk b.mk c.mk bish bash

如果指定的名称不以斜杠(/)开头,并且在当前目录中找不到该文件,则会搜索一些其他目录。首先,搜索任何用-I--include-dir选项指定的目录,然后会搜索如下目录(若存在):prefix/include (通常是/usr/local/include), /usr/gnu/include, /usr/local/include, /usr/include。

如果在这些目录中找不到包含的makefile,则会生成一条警告消息,但这不是一个立即致命的错误(fatal error);make将继续处理包含include的makefile。一旦它完成了读取makefile,make将尝试重新创建任何过期或不存在的文件。只有当它试图找到重新创建makefile的方法并失败后,才会将诊断丢失的makefile视为致命错误。

如果想让make忽略一个不存在或不能被重新创建的makefile,并且没有错误消息,使用-include指令:

-include filenames...

MAKEFILES变量

如果定义了环境变量MAKEFILES,则make将其值视为要在其他makefile之前读取的makefile名称列表(由空格分隔)。它的工作方式很像include指令:make会在各种目录中搜索这些文件。此外,make不从这些 makefile(或它们包含的任何makefile)中获取默认目标(default goal),如果未找到MAKEFILES中列出的文件也不会报错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值