Makefiles简介¶
原文链接:第2章 Makefiles简介
通常,makefile文件告诉make怎么编译和链接一个程序。
在本章中,我们将讨论一个简单的makefile,它描述了怎么编译和链接一个包含8个C文件和3个头文件的文本编辑器的程序。
make重新编译程序(program)时,每一个改动的C源文件都必须被重新编译。 如果某个文件被改动,每个包含该头文件的C源文件都必须被重新编译。 编译以C源文件为单位,每个C源文件都会相应地产生一个目标文件(object file)。 如果任何一个C源文件被重新编译了,所有的目标文件,不论是新编译的还是上一次编译后保存好的,都会必须被重新链接,以产生新的可执行程序(executable)。
Makefile规则¶
一个简单的makefile包含以下形式的“规则(rules)”:
target : prerequisites
recipe
...
...
target通常是一个程序生成的文件名,比如可执行或目标文件(executable or object files)。
target也可以是要执行的动作(action)的名称,比如clean (见伪目标)。
prerequisites是用来作为输入以生成target的文件。一个target通常包含数个文件,也可以不包含任何prerequisites。
recipe是一个make将要执行的动作(action)。一个recipe可能包好不止一个命令(command),不论是写在同一行还是各自一行。 请注意: 你需要在每一个recipe行的开头放置一个tab符!如果你更喜欢其他符号而不是tab,你可以设置.RECIPEPREFIX变量为一个替代字符 (见其他特殊字符)。
译者注: 每个recipe行会新建一个bash来执行命令,这意味着上一行recipe设置的环境变量在其他recipe行是无效的。测试代码如下:
all:
echo PID:$$$$
echo PID:$$$$
语法解释:Makefile中$$
表示转义$
符号,所以$$$$
前两个$
表示一个$
符,后两个$
表示另外一个$
符,最终转递给shell的命令是:
echo PID:$$
而bash语法中$$
表示当前进程的PID。
测试结果:
echo PID:$$
PID:85280
echo PID:$$
PID:85281
可以看到,两行recipe打印的PID是不同的。