makefile笔记

makefile rule

1
2
3
4
target … : prerequisites …
recipe
  • target: 生成目标,可执行文件或者中间object文件
  • prerequisites: 生成target所需的文件,作为recipe的输入
  • recipe: make需要执行的具体命令

Note: 每隔recipe前面需要有个tab。

换行使用\进行。

1
2
3
4
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

只有recipe,不依赖文件的target,称为phony targets, 如clean:

1
2
3
clean :
rm edit main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o

make执行流程

make读取当前目录下的makefile,从第一个rule开始执行,如果这个rule依赖其它文件,则make需要先执行依赖文件的rule。

使用变量

使用变量可以简化makefile的书写。

1
2
3
4
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

可以使用变量把object文件包含:

1
2
3
4
5
objects = main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
edit : $(objects)
cc -o edit $(objects)

make自动推导规则

make具有隐藏推导规则的功能,可以省略依赖的.c文件和recipe规则。

1
2
3
4
5
6
7
8
main.o : defs.h
kbd.o : defs.h command.h
command.o : defs.h command.h
display.o : defs.h buffer.h
insert.o : defs.h buffer.h
search.o : defs.h buffer.h
files.o : defs.h buffer.h command.h
utils.o : defs.h

清理目录的规则

1
2
3
.PHONY : clean
clean :
-rm edit $(objects)

这样规避了如果有clean文件生成的规则。

clean不能放在最前面,会被当成default rule执行。

make寻找makefile文件顺序

GNUmakefile, makefile and Makefile

建议使用Makefile,如果想用其它名字的文件,可以make -f指定文件名。

相关链接

  1. gnu make

本文标题:makefile笔记

文章作者:Louis

发布时间:2017年11月02日 - 18:11

最后更新:2017年11月02日 - 20:11

原始链接:/2017/11/02/makefile/

许可协议: Louis-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。