全部学习汇总: GitHub - GreyZhang/g_SCons: A new member in my toolbox, looking forward to replacing make tool later.
使用Makefile来处理工程构建很好的一点就是在于可以实现“差分式”更新,SCons也可以做到这一点。这就得准确处理依赖的关系,而这个依赖的可能不仅有文件。
SCons的差分式更新默认采用的是MD5签名或者校验和的方式来实现的,也可以配置成为检查时间戳。检查时间戳是Make常用的方式,如果二选一的话或许我会选择时间戳变化吧。此外,SCons还提供了其他的检查变化方式定制的可能性。
如果使用MD5,在很多场景下是可以节省时间的。比如,注释修改后,最多会更新目标文件。但是,由于目标文件的MD5不会发生变化,因此剩下的部分不会进行构建。这样,可以减少链接过程所消耗的时间。
如果采用类似make的处理方式,判断时间戳。那么可以使用Decider来指定。这种指定有两种方式,一个是从时间戳的角度描述,另一个从工具集成角度描述。两个效果其实是一致的。这样,如果想对标make,其实这里就有很好的答案了。自然,之前也遇到过一些纯粹靠时间戳的方式中的问题。或许,MD5也可以作为尝试吧!
这真是一个好消息!看起来,这里给了一个超级糖果!MD5与时间戳对比的方式可以结合在一起,这样就能够做到又快又好了。看到这里,基本上就可以确定后续直接用这个配置了。但是这个配置有一个缺点,那就是如果代码在1秒的时间差之内做了修改,可能工具识别不到。但是反过来考虑,这样的情况基本不会出现在手动的编码过程中。
检查文件更新的方式也可以自己定义,但是从目前我自己的经历角度考虑,对我来说这个意义不大。前面提供出来的几种选择基本上已经够了。
Scons还允许通过环境变量创建的方式在一个配置文件中用不同的方式来构建不同的可执行程序。诚然,这个是一个有用的特性。但是从工具箱简化的角度考虑,直接创建两个独立的环境就好了。
多目录的管理以及头文件搜索,从开始就一直想知道解决方案的问题,在这里找到答案了。
可以通过缓存隐含依赖的方式增加效率,也是一个很好的功能,但是也是锦上添花的功能。对于大型项目来说自然是至关重要,但是我所接触到的项目这方面可能并不需要什么特别的关注。可以先考虑能够实现,后面再考虑可能的优化。比较直接的两个优化可以从上面的两个选项开始。
如果从基本的C工程信息中心找不到的依赖关系,可以采用显式指定的方式来处理。类似的功能可以用来实现一个版本号升级之类的功能。处理这种特殊需求,类似的需求其实可以从工程管理的角度来避开。
外部文件的依赖性,类似的功能需求也可以通过工程管理的方式解决。如果有类似的更新而配置中没有良好的规则实现,干脆直接做一次全新的编译即可。
库文件等文件的更新,解决的方式还是重新编译好一些。这样的处理其实是自然而简单的。
order-only依赖,类似的处理如果是我遇到可能会直接甲苯实现一个独立的补丁功能。这样,保证SCons本身用途的专一性和简洁性。
指定某一个程序始终编译构建,这样可以保证每一次的生成文件都得到更新。
这一次看的信息很多,接下来我应该可以尝试构建一个多目录、多文件、复杂依赖的工程编译了。