Linux系统编程.NO4——makefile总结性理解

关于makefile我也是从别人的贴子中总结出来的,而且只总结了一部分,如果想要了解得更多,可以去访问原文:http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=408225&extra=&authorid=10610714&page=1

2.4.Makefile总述

2.4.1.Makefile主要内容

1.显式规则
由Makefile编写者指明的依赖关系和执行命令
2.隐晦规则
由make自动推导出来的规则,也就是可以省略的部分
3.变量定义
像定义宏一样定义一个变量去使用
4.文件指示
文件指示包括了三部分,一个是在一个Makefile中引用另一个Makefile;一个是根据某些情况指定Makefile中的有效部分,就像C语言中的预编译一样;还有就是定义一个多行的命令
5.注释
Makefile文件属于shell脚本,注释使用#

2.4.2.Makefile文件命名

默认情况下,make命令会在当前目录下按顺序找文件名为“GNUnakefile”,”makefile”,”Makefile”的文件,一般使用Makefile文件,而GNUmakefile只被GNU的make所识别,一般的make都识别Makefile和makefile,极少数的make不识别Makefile。
除了默认,也可以自定义文件名,如自定义文件make.linux,这个不能自动识别,所以使用的时候就要写成make -f make.linux即可,也就是加上参数-f(–file也可以)指明使用的Makefile文件。

2.4.3.Makefile引用功能

在一个Makefile中可以引用其他的Makefile,就像c语言中的#include,包含的语法是:
include filename1 filename2 filename3…
filename可以是当前系统shell的文件(可以包含路径和通配符,也支持变量),在include前可以有空格(但绝对不能是开始)
如有几个Makefile,分别是a.mk,b.mk,c.mk,e.mf,f.mf.foo.make这样六个不同的Makefile需要在这里引用:
bar=e.mf f.mf //定义变量
include foo.make *.mk $(bar)
等价于include a.mk b.mk c.mk e.mf f.mf foo.make
在make命令一开始,就会去找寻include所指出的其他Makefile,并且把内容安置在当前位置。如果文件没有指定路径的话make就会首先在当前目录下寻找,如果没有就再去另外的地方查找。
另外的地方指:
执行make时候有-I或者- -include-dir参数,那么make就去这个参数指定的位置查找,若目录/include存在的话,make也会去寻找。如果想让make不理会那些找寻不到的Makefile文件而继续执行后面的功能,就在include前加一个减号-.
-inlcude filename1 filename2 filename3…

2.4.4.Makefile工作方式

1.读入所有的Makefile。
2.读入被include的其它Makefile。
3.初始化文件中的变量。
4.推导隐晦规则,并分析所有规则。
5.为所有的目标文件创建依赖关系链。
6.根据依赖关系,决定哪些目标要重新生成。
7.执行生成命令。

2.5.Makefile书写规则

2.5.1.语法规则

语法规则包含了两个部分,一个是依赖关系,一个是生成目标的方法,在Makefile中,规则顺序是很重要的,因为Makefile只有一个最终目标,一般来说,定义在Makefile的第一条规则的目标被确立为最终目标,如果第一条规则中的目标有多个,那么第一个目标会成为最终目标。
其实在语法定义中,command是可以写在prerequisites后面的,只需要在prerequisites后面加个分号;即可,但是为了规范,一般选择提行再写command(必须以键开头),如果命令太长,可以使用反斜线(‘\’)作为换行符。

2.5.2.通配符

”波浪号表示家目录,如“/test”表示当前用户的家目录下的test目录;“~fox/test”则表示用户fox的家目录下的test目录。
“*”星号,和一般通配符一样,代替任意个数的任意字符

2.5.3.文件搜寻

在一个大型的工程中,往往不是所有的代码都放在同一个目录中,当然可以在每个依赖文件前都写好路径,但是这样十分麻烦,所以其实可以指明其他路径,让make自己去找文件。这时,要用到Makefile中的特殊变量:VPATH=/src:…/headers,这样就指定了除当前目录外的另外两个目录(可以是绝对路径,也可以是相对路径),这样当make工具去找寻依赖文件的时候,除了当前目录还会去查询这两个目录下的内容,两个路径之间使用冒号:分隔开。最高搜索优先级始终是当前目录。
还有一种文件搜寻的方式是使用“vpath”(全小写)关键字,这不是变量,这是一个make的关键字,和VPATH的功能类似,并且更加灵活,他可以指定不同的文件在不同的搜索目录中。vpath一般使用方法:
vpath %pattern directories,如:
vpath %.h …/headers 表示要求make在…/headers目录下搜索所有以.h结尾的文件。

2.5.4.伪目标

之前写到用.PHONY来声明clean是一个伪目标,伪目标不是一个文件,而是一个标签,所以make是无法生成它的依赖关系和决定是否要去执行,所以需要明确指明这个目标需要被执行,这个时候,就需要使用.PHONY来做声明。
被.PHONY声明的文件会被make视为伪目标,只要执行了命令就会跳过检查直接执行目标下的命令。而且也不仅仅是clean是一个伪目标,其他的也可以是伪目标。
一般来说,一个Makefile只会生成一个可执行文件,但是通过伪目标却可以生成多个可执行文件(实际上make编译的内容都是在最终目标定义时的依赖文件,对于其他没有依赖性的定义make是不会是主动执行的)。如:
all : prog1 prog2 prog3
.PHONY : all
prog1 : prog1.o utils.o
cc -o prog1 prog1.o utils.o
prog2 : prog2.o
cc -o prog2 prog2.o
prog3 : prog3.o sort.o utils.o
cc -o prog3 prog3.o sort.o utils.o
这三个目标prog1,prog2,prog3和最终目标没有关系,但是任然被定义在同一个Makefile中,命令make prog1 就能生成prog1这个可执行文件。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值