什么是目前最好的构build系统

几年前,我研究了一些不是Make构build系统,像CMake和SCons这样的工具看起来很原始。 我想知道情况是否有所改善。 所以,根据以下标准,目前最好的构build工具是什么:

  • 平台不可知论:应该在Windows,Linux,Mac上工作
  • 语言不可知论者:应该内置对诸如构buildC / C ++和其他静态语言之类的常见事物的支持。 我想这不需要支持完整的autotools套件。
  • 可扩展的:我需要能够编写规则来生成文件,比如来自restructuredText,latex,自定义格式等。我真的不在乎我要写什么语言的规则,但我更喜欢真正的语言而不是DSL 。
  • 我宁愿避免手写任何XML,我认为,例如ant需要。
  • 免费提供(最好是开源)

“最好”这个词有点主观,但我认为答案可以用上面的标准客观地评价。

我肯定会把我的选票上预先 。 虽然它不如兄长那样强大,但它的主要优点是荒谬的简单性和易用性。 使编写多编译器,多平台代码变得轻而易举,并本地生成Visual Studio解决scheme,XCode项目,Makefiles和其他,而无需任何额外的工作。

因此,纯粹根据问题中提出的标准来判断,似乎最适合的构build系统可能是纯粹的Python,它支持C ++和其他通用的,强大的语言,而不是DSL。

但是,从我个人的经验来看,我更喜欢C ++项目的CMake。 (我尝试了CMake,SCons和waf,并且按照大概的顺序喜欢它们)。 CMake是一个通用的解决scheme,但是它内置了对C ++的支持,使得它在实际使用C ++的时候比普通的解决scheme更好。

CMake的C ++构build模型更具说明性,不太必要,因此对我来说更容易使用。 CMake语言的语法并不好,但是具有奇数语法的声明性构build却击败了Python中的命令式构build。 在这三者中,CMake似乎对预编译头文件等“高级”事物有最好的支持。 设置预编译头文件将重build时间减less了大约70%。

CMake的其他优势包括体面的文档和相当大的社区。 许多开源库都有CMake构build文件,这些文件可以是树中的,也可以是CMake社区提供的。 有一些重要的项目已经使用了CMake(OGRE),其他主要项目,如Boost和LLVM正在转向CMake。

我在试用构build系统时发现的部分问题是,我正在试图在OS X上构build一个NPAPI插件,结果certificate只有极less的构build系统能够为XCode提供所需的标志组合。 CMake,认识到XCode是一个复杂和移动的目标,提供了一个手动设置生成的XCode项目(和Visual Studio中,我认为)命令的钩子。 就我而言,这非常聪明。

无论你是build立一个图书馆还是一个应用程序,都可能决定哪个构build系统是最好的。 Boost仍然使用基于jam的系统,部分原因是它提供了对pipe理比“debugging”和“发布”更复杂的构buildtypes的最全面的支持。 大多数增强库有五六个不同的版本,特别是在Windows上,预计人们需要兼容库来链接不同版本的CRT。

我在Windows上没有任何问题,但当然你的里程可能会有所不同。 有一个像样的graphics用户界面来设置构build依赖关系,尽pipe使用重build很笨重。 幸运的是,还有一个命令行客户端。 到目前为止,我已经解决的是使用一个简单的包装Makefile从objdir调用CMake; CMake然后在objdir中生成Makefiles,原始的Makefile使用它们来构build。 这可以确保人们不会意外地从源代码目录中调用CMake并将其存储库混乱。 结合MinGW,这个“CMake三明治”提供了非常一致的跨平台构build体验!

当然,这取决于你的优先事项。 如果您主要是为了易于使用,至less有两个新的构build系统挂钩到文件系统,以自动跟踪语言不可知的方式依赖。

一个是tup:

http://gittup.org/tup/

另一个是制造:

http://code.google.com/p/fabricate/

似乎是performance最好的,便携的,成熟的(以及我实际使用的那个)是tup。 编写它的人甚至保留了一个玩具Linux发行版,其中一切都是git子模块,并且所有东西(包括内核)都是用tup构build的。 从我读到的关于内核构build系统的内容来看,这是相当成功的。

此外,TUP清理旧的目标和其他cruft,并可以自动维护您的.gitignore文件。 结果是试验你的目标的布局和名字变得微不足道,你可以自信地在git修订之间跳转,而不用重build所有东西。 它用C写成

如果你知道haskell,并且正在寻找非常高级的用例,请检查一下shake:

http://community.haskell.org/~ndm/shake/

更新:我还没有尝试过,但这个新的“buildsome”工具也挂钩到文件系统中,并受到tup的启发,所以相关的:

https://github.com/ElastiLotem/buildsome

CMake的

CMake是一个可扩展的开源系统,它以操作系统和编译器独立的方式pipe理构build过程。

Gradle似乎符合上面提到的所有标准。

这是一个使用Maven和Ant最好的构build系统。 对我来说,这是最好的。

Selenium项目正在转向Rake ,并不是因为它最好,而是因为它处理多种语言比所有其他构build工具稍微好一些,并且是跨平台(Ruby开发)。

所有的构build工具都有其问题,人们学习如何与之共存。 在JVM上运行的东西往往非常适合构build应用程序,所以Ant , Maven (我知道它可怕), Ivy , Rake

Final Builder在Windows世界中是众所周知的

顺利build立符合您的大部分要求。

  • 平台不可知论:是的,它是用java编写的
  • 语言是不可知的:它不支持c / c ++ t,但是只有java,但是它可以通过用java编写的插件来扩展,所以添加更多的编译器支持不是问题
  • 可扩展的:是的,你可以通过java插件实现stream畅的function,也可以通过将其定义为其他平滑函数构build的expression式来创buildstream畅的function。
  • 我宁愿避免写任何XML:你不会看到一个单一的顺利构build
  • 免费提供:是的,Apache 2许可证

披露:我是顺利build设的作者​​。