【Makefile】makefile常用规则及语法

***********************************************

local OS :xp(SP3) 

VM OS: ubuntu-10.04.2

kernel: 2.6.32-41-generic

VM:VMware-workstation-7.1.4

***********************************************


+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

1.make的规则语法例子

2.依赖类型(常规依赖,order-only依赖,order-only依赖先不深入了解)

3.通配符("*"  " ?" " [...]")

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

1.make的规则语法例子

Makefile中,规则描述了在何种情况下使用什么命令来重建一个特定的文件,此文件被称为规则“目标”(通常规则中的目标只有一个)。规则中出目标之外的罗列的其它文件称为“目标”的依赖,而规则的命令是用来更新或者创建此规则的目标文件。makefile的第一个规则应该就是重建整个程序或者多个程序的依赖关系和执行命令的描述。


通常规则的语法格式如下:

法一:

TARGETS : PREREQUISITES PREREQUISITES1 PREREQUISITES2 PREREQUISITES3 \
			 PREREQUISITES4 PREREQUISITES5 PREREQUISITES6
	[TAB]COMMAND
...

法二:这种代码可读性不是很好

TARGETS : PREREQUISITES PREREQUISITES1 PREREQUISITES2 PREREQUISITES3;COMMAND
...


说明: 1.TARGETS :目标文件(执行文件或者是object file,还可以是个标签,如伪目标 【:clean】)

2. PREREQUISITES:目标生成依赖的文件或者目标的列表 用空格分开,一行太长可以用

3.COMMAND: 要执行的命令

4.COMMAND直接跟在PREREQUISITES列表后用分号“;”间隔,另起一行的话用反斜线

另外注释用 “#”不用“//” 或者 “/****  ***/"

看个例子:

main.o : mian.c defs.h               # module for twiddling the frobs
	cc -c -g main.c


例子中:

main.o 是要重建的文件,main.c,defs.h是重建main.o所要用的文件,重建的文件称为规则的“目标”(main.o),而把重新目标所需要的文件(main.c,defs.h)称为规则的“依赖”(或者目标的依赖)。规则中的第二行“cc -c -g main.c”是规则的“命令”。根据中心思想可知:如何确定目标文件是否过期(需要重建目标),过期是指目标文件不存在或者目标文件“main.o”在时间戳上比依赖文件中的任何一个(“main.c”或者“defs.h”)“老”。(这个问题在makefile FAQ——跟着陈皓写makefile的Q4:Q4:make: `edit' is up to date.有说明),说到文件的依赖我不得不提到kernel下基于Kconfig强大的模块依赖建立关系。

SO!!


 规则的中心思想是:目标文件的内容是由依赖文件文件决定,依赖文件的任何一处改动,将导致目前已经存在的目标文件的内容过期.

二、依赖类型

“order-only”依赖使用管道符号“|”开始,作为目标的一个依赖文件。规则依赖列表中管道符号“|”左边的是常规依赖,管道符号右边的就是“order-only”依赖。这样的规则书写格式如下:

TARGETS : NORMAL-PREREQUISITES | ORDER-ONLY-PREREQUISITES

举个例子:

LIBS = libtest.a
main: main.c | $(LIBS)
$(CC) $(CFLAGS) $< -o $@ $(LIBS)

说明:1.main.c 是常规依赖,$(LIBS)是order-only依赖


make在执行这个规则时,如果目标文件“main”已经存在。当“main.c”被修改以后,目标“main”将会被重建,但是当“libtest.a”被修改以后。将不执行规则的命令来重建目标“main”。规则中依赖文件$(LIBS)只有在目标文件不存在的情况下,才会参与规则的执行。当目标文件存在时此依赖不会参与规则的执行过程。


三、通配符

三种 通配符("*"  " ?" " [...]"),跟C差不多,用着还行,不做更多分析要用这些字符可以用转义字符“ \”。值得注意的是在使用 *.o呀等涉及到依赖的时候考虑:使用“wildcard”函数(变量定义“(wildcard *.o) 支持变量展开 和 *。o 的区别”)和实现字符串的置换。

 

四、 变量

一般在我们书写 Makefile 时,各部分变量引用的格式我们建议如下:
1. make 变量(Makefile 中定义的或者是 make 的环境变量)的引用使用“$(VAR)”
格式,无论“VAR”是单字符变量名还是多字符变量名。
2. 出现在规则命令行中 shell 变量(一般为执行命令过程中的临时变量,它不属于
Makefile 变量,而是一个 shell 变量)引用使用 shell 的“$tmp”格式。
3. 对出现在命令行中的 make 变量我们同样使用“$(CMDVAR)” 格式来引用。


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
详细易懂的Linux makefile教程 一、概述 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂。这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义。特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。 因为,makefile关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。 makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。 现在讲述如何写makefile的文章比较少,这是我想写这篇文章的原因。当然,不同产商的make各不相同,也有不同的语法,但其本质都是在“文件依赖性”上做文章,这里,我仅对GNU的make进行讲述,我的环境是RedHat Linux 8.0,make的版本是3.80。必竟,这个make是应用最为广泛的,也是用得最多的。而且其还是最遵循于IEEE 1003.2-1992 标准的(POSIX.2)。 在这篇文档中,将以C/C++的源码作为我们基础,所以必然涉及一些关于C/C++的编译的知识,相关于这方面的内容,还请各位查看相关的编译器的文档。这里所默认的编译器是UNIX下的GCC和CC。 二、关于程序的编译和链接 —————————— 在此,我想多说关于程序编译的一些规范和方法,一般来说,无论是C、C++、还是pas,首先要把源文件编译成中间代码文件,在Windows下也就是 .obj 文件,UNIX下是 .o 文件,即 Object File,这个动作叫做编译(compile)。然后再把大量的Object File合成执行文件,这个动作叫作链接(link)。 ...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值