makefile入门

0. 前言

makefile工程管理文件,与make命令结合,在linux上用于管理大规模工程。

以下记录简单使用make的学习笔记。

1. makefile文件编写规则

makefile文件也可命名为Makefile文件。

makefile文件一般格式为:

1
2
目标文件名: <依赖文件列表>
用于生成目标文件的命令序列 # 注意开头的tab, 而不是空格

如:

1
2
hello1: hello1.c
gcc -o hello1 -g hello1.c

hello1是要生成的文件,即目标文件。hello1.c是生成目标文件的依赖文件,依赖文件可以有任意个。gcc -o hello1 -g hello1.c 是生成该文件要运行的shell命令。可以有多条运行命令,若要换行,在上一条命令后加上换行符\

2. makefile运行规则

在命令行中输入:$ make,运行makefile文件:

  • make命令先会找到makefile第一行的目标文件。如果目标文件已存在,或者依赖文件更新,那么就会执行该项中的命令。
  • 如果依赖文件不存在,那make会做相应提示。
  • 但是,如果依赖文件是另一项的目标文件,那make会找到该项,并重复上述步骤。

3. 示例

有一个完整的Makefile文件,内容如下:

1
2
3
4
5
6
7
8
9
10
11
init.py: hello1 hello2
python init.py

hello1: hello1.c
gcc -o hello1 -g hello1.c

hello2: hello2.c
gcc -o hello2 -g hello2.c

clean:
rm hello1 hello2

init.py 目标文件的依赖文件是 hello1hello2。同时,hello1是另一项的目标文件,该项的依赖文件是hello1.chello2也是另一项的目标文件,依赖文件是hello2.c

命令行执行make命令后:

1
2
3
4
$ make
gcc -o hello1 -g hello1.c
gcc -o hello2 -g hello2.c
python init.py

显示执行了相应项的shell命令。由于,hello1和hello2文件不存在,得先执行以这些文件为目标文件的,对应项的命令。等第一项的依赖文件都生成了,才会执行第一项的命令。

4. 执行特定指令

在该示例中,还有一项的目标文件为clean。这并不是一个要生成的目标文件,而是一个清除hello1hello2执行文件的指令,这是一个伪目标

我们想执行这条指令时,命令行输入:$ make clean即可。

其实,我们也可以通过 $ make hello1 来单独make这一项。