Makefile管理工程

Makefile与shell脚本对比
相同点:都是文本文件格式的脚本;都可以执行shell命令;都可以定义变量,和条件控制语句(使用格式有差别)
不同点:解释器不同,shell脚本是由对应shell程序解释,Makefile由make程序解释;
shell脚本以命令行为基本单位,而Makefile以规则为基本单位;shell脚本只要有执行权限即可直接执行,Makefile必须要用make来显式调用,本身不需要执行权限。
在开发领域Makefile具有自动推导,判断源码依赖关系的功能;可以使用隐含规则来简化Makefile的编写但会带来Makefile可读性降低。Makefile记录了文件之间的依赖关系,通过比对目标文件和依赖文件的时间戳决定是否需要执行相应的命令;同时,Makefile还可以定义变量,接受用户传递的参数变量,通过这些元素的相互配合,省去了繁杂的编译命令,不仅节省时间也减少了出错效率。
(目标文件): (依赖文件1) (依赖文件2) (依赖文件…)
(命令1)
(命令2)
(命令…)
例子

all:m
#m:point.c
#    gcc point.c -o m
    
#目标:依赖
#<tab>命令1
#<tab>命令2
#<tab>命令3
#Makefile并不是安书写的先后顺序来执行各个规则的
#若命令行指定了目标则直接执行
m:point.o
    gcc  point.o -o m
point.o:point.s
    gcc -c point.s -o point.o
point.s:point.i
    gcc -S point.i -o point.s
point.i:point.c
    gcc -E point.c -o point.i
#删除规则没有依赖直接执行命令;必须从命令行指定目标clean
clean:
    rm -rf *.i *o *.s m

产生文件正常顺序是下图所示;在Makefile中先从第一条命令没有point.o文件往下走走到-E时才产生point.i文件再往上走。
图
图2
当文件由于不同系统的时间上的差异,造成一个文件可能修改时间为未来的某个时间,这样编译器hi产生警告 甚至错误,为了消除问题,使用touch*来将当前目录下所有文件的时间日期改为当前时间日期。
在这里插入图片描述
一个Makefile可以看作是一系列规则的组合,规则是make进行处理的依据规则的格式。跟shell不同,在Makefile规则的的前后顺序不太重要,实际的调用顺序取决目标之间的依赖关系。因此make会采用逆推的方式来判断和执行目标,首先make找到Makefile的入口规则,一般是all。或者是用户在命令行指定的target;顺着入口规则的依赖对象查找下去,检查一直查找到最终的目标,即只有被依赖而没有依赖其它对象的目标,即终目标从最终目标顺着依赖关系依次执行到入口规则,中间只有运行命令出错,才会停止执行;若是依赖文件,make会自动检测最后更新时间,只会区执行已经修改过的文件,以此来减少编译时间。
规则书写习惯:
Makefile第一个规则通常是all;规则之间最好用空行隔开;规则可能没有依赖对象,或者没有命令列表,但两者必须有一个。
一般的目标最终结果都是生成一个文件,但有一些目标可以不生成结果文件,只是为了调用命令或依赖对象,这称为伪目标。make内置一些常用的伪目标:
1)若执行make命令行没有指定目标名称,第一个目标则会自动被调用,通常被all作为缺省的目标入口。
2)clean清除项目生成的中间文件和最终成文件,如何清除需要开发者自行编写
3)install项目如何安装,具体动作要开发者自行编写
4)uninstall项目如何卸载具体动作要开发者自行编写。
为了让make程序不至于产生误解,可以用.PHONY关键字来声明伪目标,但这不是必须的
如: .PHONY clear install all uninstall distclean
makefie命令行特殊性:
命令行前加-表示若命令出错不终止Makefile的执行否则执行出错就立即终止;
如: -rm -f *.o 即便是没有删除文件成功也要继续执行后面的命令;
命令行前加@表示,执行命令时不显示命令行,直接显示命令行结果;
如:@echo “123” 若没加@表示则打印: echo “123” 123;显示就会多一行

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值