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,那你为什么自找麻烦呢?

你可能感兴趣的:(linux环境)