Makefile&Shell

作者:qin meng
链接:https://www.zhihu.com/question/22697903/answer/36611257
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

GNU的Make和脚本不是一个东西,虽然看着很像其实完全不是一码事。为什么选择makefile,个人觉得有以下几点:
1、首先,Shell有好多种, Bash、ash、csh等等,甚至dos command,虽然看起来类似,但实际上语法细微差别很多,写通用的shell脚本其实是很有挑战的。如果用shell来写工程的build文件,不是不可以,但是移植性会很差。

2、Shell虽然灵活,但是实际上更多的依赖于系统中其他的命令,比如sed、awk、grep、echo等等。shell更像是功能合集,灵活的同时难题也很多,你没办法保证这些工具在所有平台上的行为都是一致的。

3、make的思路其实跟shell完全不同,Makefile更像是宏替换文法语言,精妙之处在于处理各种文件和串的方式都是字符串的替换过程,这个过程不是”顺序执行的“,而是发生在编译之前,在执行过程则完全依赖于shell,跟脚本无任何区别。shell脚本始终是执行的,对于处理串的来说相比之下要逊色很多,而且重度依赖于sed和awk等等。

4、make另外一个好处就是编译的依赖,可以说make就是为了解决这个问题而生的,shell也不是不能解决这个问题,但是相比之下要麻烦的多,想想用脚本处理文件的时间和内部头文件的依赖关系是个多么烦人的工作吧。

5、现在的GNU make都是支持多线程的,多并发、依赖关系良好的makefile会大幅度压缩项目构建的时间,多线程的脚本也不是不行,不过这就难得多了,用文件锁保证某个目录不能被同时编译这种事对于你的脚本来说有时候是必须的。实际上这同并行编程需要注意的事情一样多,而make只需要一个-j,那你为什么自找麻烦呢?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: Makefileshell脚本在以下几个方面有所不同: 1. 变量引用方式不同: 在shell脚本中,所有以$打头的变量引用后需要加上{},而在Makefile中,变量引用后需要加上()。例如,在Makefile中定义变量PATH="/data/",则在使用时应该写成SUBPATH=$(PATH)。\[1\] 2. make命令和shell命令的本质不同: make命令本质上是一个shell命令,和ls、cd等命令没有太大区别,只是make命令会根据当前目录下的Makefile来进行工作。可以通过which make命令查看make命令的路径,通过man 1 make命令查看make命令的用法。\[2\] 3. 区分Makefile中的变量和shell中的变量: 如果在Makefile中定义了一个变量,而Makefile中所调用的shell命令也定义了一个同名的变量,为了区分它们,Makefile规定,在引用shell变量时,需要在变量前添加两个美元符号($$)。例如,在Makefile中使用shell变量subdir时,应该写成$$subdir。\[3\] 总结起来,Makefileshell脚本在变量引用方式、命令本质和变量区分等方面存在差异。 #### 引用[.reference_title] - *1* [Makefileshell脚本的区别](https://blog.csdn.net/daizhichaoaa/article/details/130792825)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [MakefileShell 脚本的区别与联系](https://blog.csdn.net/oqqHuTu12345678/article/details/129295301)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值