一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中。
makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文化需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个shell脚本一样,其中也可以执行操作系统的命令。
makefile带来的好处就是-----“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
makefile的工作流程:
1. 如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。
2. 如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程序。
3. 如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。
只要我们的makefile写的够好,只用一个make命令就可以完成,make命令会自动智能地根据当前的文件修改的情况来确定哪些文件需要重编译,从而自己编译所需要的文件和链接目标程序。
1.1 makefile的规则
target...:prerequisites:...
command
...
target也就是一个目标文件,可以是object file,也可以是执行文件。还可以是一个标签(label)。
prerequisites就是,要生成那个target所需的文件或是目标。
command也就是make需要执行的命令。(任意的shell命令)。
这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command中。
1.2 一个例子
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”或“makefile”的文件中,然后在该目录下直接输入命令“make”就可以生成执行文件edit。如果要删除执行文件盒所有的中间文件,那么,只要简单地执行以下“make clean”就可以了。
注意:command一行必须以一个Tab键作为开头。
1.3 引入变量
objects =main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
edit:$(objects)
cc -o edit $(objects)
...
clean:
rm edit $(objetcs)
1.4 省略风格
objects=main.o kbd.o command.o display.o \
insert.o search.o files.o util.o
edit:$(objetcs)
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
file.o:defs.h buffer.h command.h
utils.o:defs.h
.PHONY:clean
clean:
rm edit $(objects)
1.5 另类风格的makefile
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)
1.6 包含其他的makefile
makefile文件中包含其他makefile文件的关键字是include。
include filenames ...