GNU Make 简介

Make 程序最初设计是为了维护C 程序文件防止不必要的重新编译 。在使用命令行编译器的时候,修改了一个工程中的头文件,如何确保包含这个头文件的所有文件都得到编译?现在10 机的版本生成是使用批处理程序,编译那些文件依赖于程序的维护者,在模块之间相互引用头文件的情况下,要将所有需要重新编译的文件找出来是一件痛苦的事情;在找到这些文件之后,修改批处理进行编译 。实际上这些工作可以让make 程序来自动完成,make 工具对于维护一些具有相互依赖关系的文件特别有用,它对文件和命令的联系(在文件改变时调用来更新其它文件的程序)提供一套编码方法 。Make 工具的基本概念类似于Proglog语言,你告诉make 需要做什么,提供一些规则,make 来完成剩下的工作 。

1 简介

make 工作自动确定工程的哪部分需要重新编译,执行命令去编译它们 。虽然make多用于C 程序,然而只要提供命令行的编译器,你可以将其用于任何语言 。实际上,make 工具的应用范围不仅于编程,你可以描述任和一些文件改变需要自动更新另一些文件的任务来使用它 。

1.1 准备工作

如果要使用make,你必须写一个叫做“makefile”的文件,这个文件描述工程中文件之间的关系,提供更新每个文件的命令 。典型的工程是这样的:可执行文件靠目标文件来更新,目标文件靠编译源文件来更新 。

Makefile 写好之后,每次更改了源文件后,只要执行make 就足够了,所有必要的重新编译将执行 。Make 程序利用makefile 中的数据库和文件的最后修改时间来确定那个文件需要更新;对于需要更新的文件,make 执行数据库中记录的命令 。可以提供命令行参数给make 来控制那个文件需要重新编译 。

1.2 Makefile 介绍

Makefile 文件告诉make 做什么,多数情况是怎样编译和链接一个程序 。这里有一个简单的makefile,描述如何编译链接由8 个C 文件和3 个头文件组成的一个编辑器:

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

kdb.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 就可以了;如果要将可执行文件和目标文件删除,执行make clean

make 重新编译这个编辑器时,每个更改的C 文件必须重新编译;如果头文件更改了,每个包含头文件的C 文件必须重新编译;每次编译产生一个对应于原文件的目标文件 。最终,目标文件链接在一起产生新的可执行文件 。

1.3 规则简介

makefile 中的规则是这样的:

TARGET... : DEPENDENCIES ...
COMMAND
...

目标(TARGET)程序产生的文件,如可执行文件和目标文件;目标也可以是要执行的动作,如“clean” 。

依赖(DEPENDENCIES)是用来产生目标的输入文件,一个目标通常依赖于多个文件 。

推荐阅读