Makefile 范例

我们通过两个 Makefile 范例,进一步理解编写 Makefile 规则,以及 Makefile 的运行过程。

 

1. 执行多个目标范例

.PHONY: cleanall cleanobj cleandiff

cleanall : cleanobj cleandiff
    rm program

cleanobj :
    rm *.o

cleandiff :
    rm *.diff

上面代码可以调用不同目标,删除不同后缀名的文件,也可以调用一个目标(cleanall),删除所有指定类型的文件。

.PHONY 定义了三个伪目标:cleanall cleanobj cleandiff。

  • 运行 make cleanobj,将执行 rm *.o,删除后缀为 o 的中间文件。
  • 运行 make cleandiff,将执行 rm *.diff,删除后缀为 diff 的中间文件。
  • 运行 make cleanall,将先执行 make cleanobj 和 cleandiff,再执行 rm program。

如果运行 make,后面不跟参数,那么将执行第一条规则 cleanall。

 

2. 编译C语言项目范例

edit : main.o kbd.o command.o display.o 
    cc -o edit main.o kbd.o command.o display.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
    cc -c display.c

.PHONY: clean
clean :
     rm edit main.o kbd.o command.o display.o

执行 make 或者 make edit,将编译链接整个工程,生成 edit 可执行文件。

clean 是伪目标,用于清理中间文件 *.o,但运行 make 或者 make edit 时不会被执行,因为它不是 edit 规则的前置条件。

如果将第一条规则修改为以下内容,那么 clean 规则将会被执行。

edit : main.o kbd.o command.o display.o clean