GNU make系列之写Makefile文件

一.欢迎来到我的酒馆

      在本章节介绍如何写Makefile文件。

目录

    • 一.欢迎来到我的酒馆
    • 二.Makefile包含了什么
    • 三.引入其它的Makefile文件

二.Makefile包含了什么

      2.1 Makefile包含了5种类型:显式的规则,隐式的规则,变量的定义,指令和注释。变量和指令会在之后的章节介绍。

  • 显式的规则。一个显式的规则表明了如何重新编译一个或多个文件。先决条件列出了target所有依赖的文件,而且同样会提供一个配方用来创建或更新target。

  • 隐式的规则。一个隐式的规则表明了如何重新编译一些文件,一个隐式的规则描述了一个target如何依赖一个文件,并且提供一个配方来创建或更新一个target。

  • 变量的定义。可以对一个变量指定文本字符串,并且在稍后的文本中替换这个文本字符串。

  • 指令。当make程序读取Makefile的时候,根据指令执行特定的操作,这些指令包括:

    • 读取另外一个Makefile文件。
    • 决定是否不执行一部分Makefile。
    • 从包含多行的逐字字符串定义变量。
  • “#” 表示注释所在行。注释行的剩余部分不会被执行。

#这是单行注释。
 
#这是 \
 多行 \
 注释 \

2.2 分割长的行
      Makefile使用基于行的语法,其中换行符是特殊的,用来标记语句的结尾。GNU make对于一行语句的长度没有限制,这取决于你电脑的内存大小。
但是,如果一行语句太长的话,这很难读懂。因此,你可以格式化Makefile,增强Makefile的可读性。可以在换行的末尾加一个 " \ " 反斜杠。
2.3 不添加空格来分割行
      如果你想要拆分一行但不希望添加空格,可以使用一个技巧:用$符号,反斜杠和换行符替换反斜杠。

var := one$\
		word

在make程序移出反斜杠重新组成一行,它和下面的是等效的:

var := one$ word

make程序会执行变量。变量引用 “$” 会引用一个空格符 " " 。给出最终版本,等效于:

var := oneword

2.4 Makefile可以取哪些名字
      默认的,当make程序寻找Makefile的时候,它会按照:GNUmakefile,makefile,Makefile的顺序来找。通常,你可以把Makefile文件叫成makefile或Makefile,但是推荐将使用Makefile这个名字,因为它在罗列的目录列表里更靠前。GNUmakefile这个名字不推荐使用,当一个makefile文件不能被其他版本的make程序执行的时候,你可以将一个makefile文件指定为GNU make。其它版本的make程序只会搜索名字为makefile,Makefile的文件,而不会使用名字为GNUmakefile。
      如果make程序没有找到名字为makefile,Makefile,GNUmakefile,那么make程序不会做任何操作。因此你必须通过使用命令行参数指定一个目标,之后make程序会尝试重新编译。
      如果你想要使用一个不好理解的名字作为Makefile的名字,你可以使用" -f " 或 “–file” 指定特定的Makefile文件。“-f name"或”–file=name" 会告诉make程序把一个文件当成Makefile文件来读取。如果你使用了一个或多个"-f" “–file” 选项,你可以指定多个Makefile文件。所有的Makefile都按指定的顺序有效链接。如果你使用了参数:“-f " 或” --file ",这个时候make程序不会自动检查默认的名字,如makefile,Makefile和GNUmakefile。

当一个Makefile的文件名字,不是makefile、Makefile、GNUmakefile的时候,在当前目录下执行make命令,会报:

make: *** No targets specified and no makefile found.  Stop.

这个时候,你可以使用参数选项:" -f “、” --file "

make -f file_name

make --file=file_name

三.引入其它的Makefile文件

      include指令告诉make程序暂停读取当前的Makefile文件,并读取一个或多个其它Makefile文件,然后再继续。这个include指令在Makefile文件中,如下:

	include filename ...

filename可以是一个shell文件,如果filename是空的,不会引入任何文件且不会打印错误。
      在include指令的开头不能敲tab键,因为如果一行的开头敲了一个tab键,make程序会把这一行当成是一个配方(recipe)。在include和filename之间需要敲一个空格,filename之间也需要敲一个空格,include所在的行的多余的空格不会被执行。"#"符号表示注释一行。
例如,假定你有3个.mk文件,a.mk,b.mk,和c.mk,下面的例子:

include *.mk

等效于:

include a.mk b.mk c.mk

当make程序执行include指令的时候,它会暂停读取Makefile文件,转而读取每个被引入的文件,当读取引入的文件完成后,make程序会继续在上次暂停的地方读取Makefile文件。
include指令的一个引用场景是当有多个不同的应用程序,在不同的目录有不同的Makefile文件。

你可能感兴趣的:(gnu,服务器)