make
指明了一个大程序的哪一部分需要重新构建,然后发出命令来重新编译它们。
Makefile介绍¶
Makefile
文件告诉make如何编译和链接一个程序。
规则介绍¶
rule模型
target … : prerequisites …
recipe
…
…
target通常是被一个程序生成的文件名(可执行的),也可以是一个可执行的动作。
prerequisites是输入文件。
recipe是将要执行的动作。需要在每行的开头键入一个tab字符。 通常一个recipe是一个带有先决条件和表现的规则来创建一个目标文件如果任何条件发生改变。但是,为目标指定一个recipe的rule不需要先决条件。
rule解释如何、何时重新构建某些特定规则的目标文件。make执行带有prerequisites的recipe创建、更新目标;rule也可以解释如何、何时执行动作。
Makefile还可以包含除了规则以外的其他文本。
那些不引用文件仅仅是操作的目标称为phony targets(伪目标)。 See Phony Targets。
See Errors in Recipes查看如何忽略错误。
make如何执行Makefile¶
make默认伴随着第一个目标开始。叫做default goal。Goals是make最终要更新的目标。
执行rule之前,需要满足prerequisites,所以会先执行满足prerequisites的rule。
objects = main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
edit : $(objects)
cc -o edit $(objects)
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 $(objects)
使用变量¶
定义变量:
objects = main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
使用变量:
$(objects)
让make推测recipe¶
例子:
不必为了单个C源文件拼写recipe
,因为make可以自动地解决:它有implicit rule(隐含规则)使用cc -c
命令更新一个.o
文件从相关的.c
文件。
objects = main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
edit : $(objects)
cc -o edit $(objects)
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
.PHONY : clean
clean :
rm edit $(objects)
Makefile的另一种风格¶
当Makefile文件只由implicit rule组成时,可以写成另一种的风格:通过他们的prerequisites将对象分组而不是他们的targets。
objects = main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
edit : $(objects)
cc -o edit $(objects)
$(objects) : defs.h
kbd.o command.o files.o : command.h
display.o insert.o search.o files.o : buffer.h
清理文件夹的规则¶
.PHONY : clean
clean :
-rm edit $(objects)
防止make被一个叫做clean的文件弄糊涂,并使其在出错的情况下继续执行。