Make简介 Makefile基本结构与规则

Make是一个自动编译工具,通过分析文件依赖关系更新目标文件。编写makefile描述文件间的依赖,并提供更新命令。规则通常包含目标、先决条件和清单,目标可以是文件或操作,如clean。当先决条件改变时,make会根据清单执行相应命令。简单的makefile展示了一个编辑器程序,其可执行文件依赖于多个目标文件,每个目标文件由C源文件和头文件生成。执行make命令可以自动编译和链接,而make clean则用于清除目标文件。

Make简介
make实用程序自动确定大型程序的哪些部分需要重新编译,
并发出命令重新编译它们。
您可以使用它来描述任何任务,
其中某些文件必须在其他文件 更改时 从 其他文件 自动更新,
即所谓的依赖依赖关系

要准备使用make,
必须编写一个名为makefile的文件,
该文件描述程序中文件之间的关系,
并提供用于更新每个文件的命令。

通常,在程序中,可执行文件是从目标文件更新而来的,
而目标文件又是通过编译源文件而生成的。

一旦存在合适的makefile,每次更改一些源文件时,
执行这个简单的shell命令:make就足以执行所有必要的重新编译。

make程序使用makefile数据库和文件的最后修改时间来决定哪些文件需要更新。
对于每个文件,它都会发布于数据库中记录的清单(recipe)中。
您可以提供命令行参数来控制哪些文件应该重新编译,
以及如何重新编译。

介绍Makefile
您需要一个名为makefile的文件来告诉make要做什么。
大多数情况下,makefile告诉make如何编译和链接程序。

我们将讨论一个简单的makefile,
它描述了如何编译和链接一个由8个C源文件和3个头文件组成的文本编辑器editor。

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还可以告诉make如何在显式请求时运行杂项命令,
例如,作为清理(clean)操作删除某些文件。

当make重新编译editor时,必须重新编译每个更改的C源文件。
如果头文件已经更改,则必须重新编译包含头文件的每个C源文件以确保安全。
每次编译都会生成一个与源文件对应的目标文件。
最后,如果任何源文件已经重新编译,那么所有的目标文件,
无论是新创建的还是从以前的编译中保存的,都必须链接在一起,
以生成新的可执行editor。

  1. 规则
    一个简单的makefile由以下形状的规则组成:
target ... : prerequisites ...
recipe
...
...

target通常是由程序生成的文件的名称;
target 列举的是可执行文件或目标文件。
target也可以是要执行的操作的名称,例如clean。

先决条件(prerequisites)是用作创建目标的输入的文件。
目标(target)通常取决于几个文件。

recipe(清单) 是制定实施的一项行动。
一个 recipe 可能有多个命令,
要么在同一条线上,要么在各自的线上。
请注意:您需要放一个 tab(键盘上跳格键TAB) 在每行 recipe 的开头!

通常, recipe 包含有先决条件(prerequisites)的规则,
用于在任何先决条件(prerequisites)发生更改时创建目标文件。

但是,为目标(target)指定recipe 的规则不需要先决条件。
例如,包含与target “clean” 关联的delete命令的规则没有先决条件。

然后,规则解释如何以及何时重新生成作为特定规则目标的某些文件。
make执行此recipe 的先决条件是创建或更新目标。
规则(rule)还可以解释如何以及何时执行某个操作。

一个makefile可以包含除规则之外的其他文本,但是一个简单的makefile只需要包含规则。
规则看起来可能比这个模板中显示的要复杂一些,但是它们或多或少都符合这个模式。

上面的例子是一个简单的makefile,
它描述了一个名为edit的可执行文件依赖于8个目标文件的方式,
而这8个目标文件又依赖于8个C源代码和3个头文件。
在这个例子中,
所有的C文件都包括defs.h,
但只有那些定义编辑命令才包括command.h.
只有修改编辑器缓冲区的低级文件才包括buffer.h。
我们使用反斜杠/换行符将每一个长行分割成两行;
这就像使用一个很长的行,但更容易阅读。

要使用此makefile创建名为edit的可执行文件,键入:

make

要使用这个makefile从目录中删除可执行文件和所有目标文件,输入:

make clean

先决条件(prerequisites)是像main.c和def .h这样的文件。

实际上,每个.o文件既是目标又是先决条件。

清单(recipe)包括cc -c main.c和cc -c kbdc。

当 target 是一个文件时,如果它的任何prerequisites发生变化,就需要重新编译或重新链接。
此外,自动生成的任何prerequisites都应该首先更新。

在本例中,编辑依赖于八个目标文件中的每一个;
目标文件main.o取决于源文件main.c和头文件defs.h。

recipe可能遵循包含target和prerequisites的每一行。
这些recipe说明了如何更新目标文件。
tab必须位于recipe中的每一行的开头,以便将recipe与makefile中的其他行区分开来。
请记住,make对这些recipe的作用一无所知,
您可以提供正确更新目标文件的recipe。
所有make操作都是在需要更新target文件时执行指定的recipe。

target : clean 不是一个文件,而是一个操作的名称。
由于您通常不希望执行此规则中的操作,所以clean不是任何其他规则的先决条件prerequisites。
因此,除非您特别说明,否则make永远不会对它做任何事情。
请注意,此规则不仅不是先决条件(prerequisites),而且也没有任何先决条件,因此该规则的唯一目的是运行指定的清单(recipe)。
不引用文件但只是操作的目标称为伪目标( phony targets)。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值