· makefile采用自底向上组织,保证每个源代码文件单独可编译,每个模块单独可编译. 终产品版本的构建调用每个模块的makefile生成编译中间产物后进行链接. 不要采用自顶向下传递make参数的makefile工程管理模式,否则每次编译任何一个文件或者模块都要全编译所有代码.
  · 尽可能使用并行编译. 在Visual Studio下可以使用IncrediBuild分布式编译工具. 对于make使用-j选项,并且可以使用distcc来进行分布式编译.另外可以使用ccache来做缓存加速编译。
  · 将测试工程的编译构建和真实产品版本的构建分离,测试工程的编译构建可以采用更好的工具:例如cmake,rake等.
  · 保证增量编译可用,并且是可靠的.
  很多项目虽然有增量编译,但是都不够可靠,尤其是当有头文件删除的时候! 另外每次无论是否有依赖变化,makefile都要重新生成加载.d文件,效率也很低下. 所以大多数时候增量编译功能是关闭的!
  《GNU Make项目管理》一书中提供了很多大型工程中make组织的实践,其中有一段对增量编译可靠高效的makefile片段,我将其提炼成了一段make函数,见下面,大家可以使用.

  总结
  我过去几年的工作主要在大型电信系统的软件重构, 这篇文章基本上是自己工作实践的一些心得,包括对《重构》一书的一些精炼和总结. 当然关于重构精华的部分还是在原书的每一处细节中. 励志学好重构的同学对于《重构》一书好能够反复阅读实践.
  对于再大型的软件重构,无论你的目标架构多么漂亮,终还必须是一行一行的代码修改。如何安全可靠并且高效地修改代码,必然是落地的基本技能!
  对于日常开发也是如此, 保持代码符合简单设计是一项日常行为,重构是达成它的方式. 对重构的使用应该融入到代码开发的每时每刻,到后不必强行区分是在开发还是重构,像《重构》的序言中所说”变得像空气和水一样普通”. 希望每个学习重构的同学都能体会到这种感觉!