0%

写 Makefile 文件

内容摘自《GNU Make》第三章。

Makefile 内容

  • 明确规则。明确的规则表明何时和怎样去 remake 一个或多个文件,这些文件称为规则的 targets。规则会列举 target 依赖的其他文件,这些文件称为 target 的 prerequistes。有些时候还会给出 recipe 用来创建或更新 target。

  • 隐含规则。隐含规则表明基于 target 的名字就可以知道何时和怎样去 remake 一个或多个文件。

  • 变量声明。将文本字符串指定给某一个变量,使得后续可以使用变量替代对应的文本字符串。

  • 指令。指令是让 make 去做一些特殊的事情:

    • 读取其他 makefile 文件
    • 决定是使用还是放弃 makefile 的部分内容。
    • 定义一个多行的变量。
  • 注释。“#”。不能在变量声明或函数调用中使用注释,在变量声明和函数调用中,“#” 会被当作字面值,而不是注释的开始。

长行切割

Makefile 使用基于行的语法,每个换行符都是特殊的,标志着声明的结束。虽然GNU对于一行的长度没有限制,但是为了可读性,需要将较长的行分割成多行。这可以使用 ’\‘ 。对于 “\“ + “\n” 的处理要看声明是否是recipe。如果不是,”\“ + “\n” 会被当做空格处理。另外,所有 “\“ + “\n” 附近的空格都会被压缩为一个空格,这包括 “\“ + “\n” 之前的空格,”\“ + “\n” 之后的行开头的空格和连续的 “\“ + “\n” 组合。

如果不想要空格,可以使用 ”$\“ + “\n”。

1
2
var := one$\
word

等价于:

1
var := oneword

Makefile 文件名

默认会依次找以下文件名:GNUmakefile,makefile,Makefile。

建议使用 Makefile,因为与 README 这些文件靠的近。除非特殊指定 GNU make,要不然不要使用GNUmakefile。因为其他 make 版本不支持。

如果没有找到以上的文件, make 就不会使用任何 makefile。你必须通过命令行指定 goal,然后 make 会使用隐藏规则 remake。

如果你想给你的 makefile 换一个名字,则要加 -f 或 –file 选项。