LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 3702|回复: 16

大家makefile一般手写还是自动生成?

[复制链接]
发表于 2008-7-20 01:59:12 | 显示全部楼层 |阅读模式
请问,哪种比较好一些?
发表于 2008-7-20 09:58:13 | 显示全部楼层
具体情况具体分析吧.

以我个人来说, 有时临时实验一些十几行的小想法, 为了在 vim 中使用 :make 功能, 我可能会使用

  1. all: test
复制代码

这种全使用默认规则的 makefile. 对于代码 (文件) 比较多, 又非正式项目的情况, 手写一个较漂亮的 Makefile, 或者用 cmake, 也都不错.

我个人来说是不太欣赏 autoconf, automake 之类的工具的, 主要是太慢了, 对于小型工程不合适. 当然了, 我对于 auto* 工具的这种态度是偏见, 并不建议楼主貌然接受, 最好亲自去了解后再下结论
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-7-20 11:53:17 | 显示全部楼层
谢谢remote fish的详细解释。刚接触makefile,有点茫然。
回复 支持 反对

使用道具 举报

发表于 2008-7-20 13:18:21 | 显示全部楼层
其实初学者可以先用自动工具来自动生成makefile,这样不容易出错。
至于以后有什么特殊需求,也可以在自动生成的makefile的基础上再修改。
如果对makefile熟悉了,自己能写当然是最好了。但是如果使用了IDE,那还是自动生成好了。
回复 支持 反对

使用道具 举报

发表于 2008-7-20 20:20:20 | 显示全部楼层
"好" 的概念至少依赖于下面几个考虑:

- 你的项目的目的? 个人使用/团队使用/发布? 后面两种情况通常需要更加灵活的 Makefile, 例如, 不同的人的目录布局很可能是不一样的.

- 你是否准备使用提供了自动生成机制的集成开发工具? 如果是, 这些工具生成的 Makefile 足够好?

- 你的项目要支持哪些平台? 用哪种语言开发? 使用哪些二进制库? 使用哪些源代码库? 这些平台/语言/库对 Makefile 有没有特殊要求?

- 你需要支持哪些 Make 实现?

- 你的系统的复杂性如何? 对于一个包含许多子系统的复杂系统, 其 Makefile 通常自成体系, 对它的质量要求不亚于实际的代码.


在复杂的系统中, 使用工具生成 Makefile 可以在更高的层次上思考部件的依赖问题, 而不必去考虑不同 Make 实现的细节, 这通常能减轻维护的负担. 不过, 手工提供不同版本的 Makefile 也是可行的 (例如, Chicken Scheme http://www.call-with-current-continuation.org/ 就使用了这种方式), 只是对开发者的要求会高一些 (需要了解多种 Make 的实现, 并寻找在不同实现与项目本身之间平衡的方法).

但是无论是手工写还是使用工具生成, 都需要了解至少一种 Make 的工作原理, 并且理解 Makefile 中涉及到的各种常用概念. GNU/Linux 上目前比较流行的是 GNU Make, 我建议你在使用它之前先读读它的手册: http://www.gnu.org/software/make/manual/html_node/index.html 第 1, 2 两章是一定要首先读完的, 然后你可以浏览一下其余各章的介绍概念的部分.

PS: 试过 cmake 和 autotools 以后, 我比较倾向于喜爱 autotools. 我认为 cmake 提供的语言过于简陋, 不够灵活, 并且与进程的交互比较麻烦. 这样, 虽然 cmake 能够实现它最初的目标, 但并不优雅. Autotools 的实现也不优雅, 但我感觉它更接近于优雅.
回复 支持 反对

使用道具 举报

发表于 2008-7-22 22:37:14 | 显示全部楼层
我用eclipse+CDT,我写的程序的makefile都是自动生成的。
回复 支持 反对

使用道具 举报

发表于 2008-7-23 15:59:24 | 显示全部楼层
恩,前面的几位大侠讲的很详细,很有道理!
回复 支持 反对

使用道具 举报

发表于 2008-7-25 20:04:05 | 显示全部楼层
对于不大的项目,手工写makefile是完全没有问题的。并且效率只会更高。
但是对于多人开发的项目,手工写makefile处理依赖性问题很难足够理想。

我手头上有个项目,代码量是60万行。这个项目中我做了尝试:1。手工写Makefile,2。用cmake。3。用autotools。

结论是:
1。手工写的最容易掌握,把握其中的工作原理,但是复杂的依赖不好解决,而且维护这个Makefile系统将越来越痛苦。
2。cmake的功能比较简陋,基本上只有最新的cmake 2.6.0才能勉强满足要求,它实现的方式也不够优雅。它最大的好处是它远比autotools易学,而且提供了更多编译过程中的管理。它的侧重点似乎不在于编译前的检查,而在于编译时的管理,动态管理Release, Debug的不同版本,显示编译进度。
3。autotools工具链的功能无疑是最强的,也只有它才能可靠的对gcc,gdb这种重量级项目进行有效的编译,但是它的学习过于繁琐,普通人要想掌握好它绝对不是件容易的事。

如果说打个比方的话:手工写Makefile就好比LFS,autotools就好比gentoo,cmake就好比arch。
回复 支持 反对

使用道具 举报

发表于 2008-7-25 20:08:13 | 显示全部楼层
Post by remote fish;1876596
具体情况具体分析吧.
以我个人来说, 有时临时实验一些十几行的小想法, 为了在 vim 中使用 :make 功能, 我可能会使用

  1. all: test
复制代码

这种全使用默认规则的 makefile. 对于代码 (文件) 比较多, 又非正式项目的情况, 手写一个较漂亮的 Makefile, 或者用 cmake, 也都不错.


全默认规则的情况可以根本不写Makefile。

例如你只要写一个 hello.c
然后 make hello ,就可以编译出来,根本不需要写makefile。
象CFLAGS等变量会影响缺省规则,但是可以在shell里面用 export 设置

所以我常对人说:真正最简单的makefile,就是“心中有makefile,目录中没有makefile”。
回复 支持 反对

使用道具 举报

发表于 2008-7-26 12:47:15 | 显示全部楼层
我在 vim 中绑定了 :make 的快捷键, 要是用 :make test 这样的形式就得手敲了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表