几年前,我研究过使用一些Make
不合适的构建系统,像CMake和SCons这样的工具似乎很原始.我想知道情况是否有所改善.因此,根据以下标准,目前最好的构建工具是什么:
平台不可知:应该在windows,linux,mac上工作
语言不可知:应该内置支持常见的东西,比如构建C/C++和其他静态语言.我想它不需要支持完整的autotools套件.
可扩展:我需要能够编写规则来生成文件,比如来自restructuredText,latex,自定义格式等.我真的不在乎我用什么语言编写规则,但我更喜欢真正的语言而不是DSL .
我宁愿避免手工编写任何XML,我认为这ant
需要.
免费提供(最好是开源)
"最佳"一词略显主观,但我认为答案可以通过上述标准客观地评价.
我明确地投票支持预制.虽然它没有它的兄弟那么强大,但它的主要优点是荒谬的简单性和易用性.使编写多编译器,多平台代码变得轻而易举,并且本机生成Visual Studio解决方案,XCode项目,Makefile等,无需任何额外的工作.
当然,这取决于您的优先事项.如果您主要是为了易用性,那么至少有两个新的构建系统可以挂钩到文件系统中,以与语言无关的方式自动跟踪依赖关系.
一个是tup:
http://gittup.org/tup/
另一个是制造:
http://code.google.com/p/fabricate/
似乎是表现最好,最便携,最成熟(也是我实际使用的那个)的那个是tup.写它的人甚至维护一个玩具linux发行版,其中一切都是git子模块,所有东西(包括内核)都是用tup构建的.从我读到的内核构建系统,这是一个相当大的成就.
此外,Tup清理旧目标和其他cruft,并可以自动维护您的.gitignore文件.结果是,尝试使用目标的布局和名称变得微不足道,并且您可以自信地在git修订版之间跳转而无需重建所有内容.它是用C语言写的.
如果您知道haskell并且正在寻找非常高级的用例,请查看shake:
http://community.haskell.org/~ndm/shake/
更新:我还没有尝试过,但这个新的"buildsome"工具也挂钩到文件系统,并受到tup的启发,因此是相关的:
https://github.com/ElastiLotem/buildsome
所以,在这个问题,这似乎是最适合构建系统规定的标准纯粹判断可能是WAF -纯Python,提供了对C++等语言,一般情况下,强大的,而不是一个DSL.
但是,根据我的个人经验,我更喜欢CMake for C++项目.(我试过CMake,SCons和waf,并按照这个顺序喜欢它们).CMake是一个通用的解决方案,但它内置了对C++的支持,这使得它比实际做C++时更通用的解决方案更好.
CMake的C++构建模型更具说明性,更少命令性,因此对我来说更容易使用.CMake语言语法不是很好,但是使用奇怪语法的声明性构建胜过Python中的命令式构建.在这三者中,CMake似乎也对"高级"事物(如预编译头文件)提供了最佳支持.设置预编译头文件可将重建时间缩短约70%.
CMake的其他优点包括体面的文档和相当大的社区.许多开源库都具有CMake构建文件,无论是在树中还是由CMake社区提供.有一些主要项目已经使用CMake(OGRE浮现在脑海中),其他主要项目,如Boost和LLVM,正在转向CMake.
我在试验构建系统时发现的部分问题是我试图在OS X上构建一个NPAPI插件,结果发现很少有构建系统被设置为给XCode提供这样做所需的标志的确切组合.CMake,认识到XCode是一个复杂且移动的目标,提供了一个钩子,用于在生成的XCode项目(和Visual Studio,我认为)中手动设置命令.就我而言,这非常聪明.
无论您是构建库还是应用程序,还可以确定哪种构建系统最佳.Boost仍然使用基于jam的系统,部分原因是它为管理比"Debug"和"Release"更复杂的构建类型提供了最全面的支持.大多数boost库有五个或六个不同版本,特别是在Windows上,预计需要兼容库的用户可以链接不同版本的CRT.
我在Windows上使用CMake没有任何问题,但当然你的里程可能会有所不同.有一个很好的用于设置构建依赖关系的GUI,尽管用于重建很笨拙.幸运的是,还有一个命令行客户端.到目前为止我已经解决的是有一个瘦的包装器Makefile从一个objdir调用CMake; 然后CMake在objdir中生成Makefile,原始的Makefile使用它们来进行构建.这可以确保人们不会意外地从源目录调用CMake并使其存储库变得杂乱无章.结合MinGW,这款"CMake三明治"提供了非常一致的跨平台构建体验!
CMake的
CMake是一个可扩展的开源系统,它以独立于编译器的方式管理操作系统中的构建过程.