2.2 一个简单的 Makefile

这是一个简单的makefile,它描述了名为edit的可执行文件如何依赖于八个目标文件,而这些目标文件又反过来依赖于八个C源文件和三个头文件。

在这个示例中,所有的C文件都包含defs.h,但只有那些定义编辑命令的文件包含command.h,而只有更改编辑器缓冲区的底层文件才包含buffer.h。

edit : main.o kbd.o command.o display.o \
       insert.o search.o files.o utils.o
        cc -o edit main.o kbd.o command.o display.o \
                   insert.o search.o files.o utils.o

main.o : main.c defs.h
        cc -c main.c
kbd.o : kbd.c defs.h command.h
        cc -c kbd.c
command.o : command.c defs.h command.h
        cc -c command.c
display.o : display.c defs.h buffer.h
        cc -c display.c
insert.o : insert.c defs.h buffer.h
        cc -c insert.c
search.o : search.c defs.h buffer.h
        cc -c search.c
files.o : files.c defs.h buffer.h command.h
        cc -c files.c
utils.o : utils.c defs.h
        cc -c utils.c
clean :
        rm edit main.o kbd.o command.o display.o \
           insert.o search.o files.o utils.o

我们使用反斜杠/换行符将每个长行分成两行;这就像使用一个长行,但更易于阅读。参见拆分长行

要使用这个makefile来创建名为edit的可执行文件,请输入:

make

要使用此Makefile从目录中删除可执行文件和所有目标文件,请输入:

make clean

在这个示例的makefile中,目标包括可执行文件edit,以及目标文件main.okbd.o。依赖项是诸如main.cdefs.h之类的文件。实际上,每个.o文件既是目标也是依赖项。规则包括cc -c main.ccc -c kbd.c

当目标是一个文件时,如果其任何先决条件发生变化,就需要对该文件进行重新编译或重新链接。此外,任何本身是自动生成的先决条件都应首先更新。在这个例子中,edit依赖于八个目标文件中的每一个;目标文件main.o依赖于源文件main.c和头文件defs.h

每个包含目标和先决条件的行后面都可以跟一个配方(recipe)。这些配方说明了如何更新目标文件。配方的每一行开头都必须有一个制表符(或者由.RECIPEPREFIX变量指定的任何字符,参见其他特殊变量),以将配方与Makefile中的其他行区分开来。(请记住,make并不了解这些配方的工作原理。提供能正确更新目标文件的配方是你的责任。当目标文件需要更新时,make所做的只是执行你指定的配方。)

目标clean并非文件,而仅仅是一个操作的名称。由于通常你并不想执行这条规则中的操作,所以clean不是任何其他规则的先决条件。因此,除非你明确指示,否则make绝不会对它进行任何操作。请注意,这条规则不仅不是其他规则的先决条件,它自身也没有任何先决条件,所以该规则的唯一目的就是运行指定的配方。那些不指向文件、仅代表操作的目标被称为伪目标。有关此类目标的信息,请参见伪目标。要了解如何让make忽略rm或其他任何命令产生的错误,请参见处方中的错误