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

时间:2009-12-18 18:10:49

标签: build-process makefile

几年前,我开始研究使用一些不是Make的构建系统,而像CMake和SCons这样的工具似乎非常原始。我想知道情况是否有所改善。因此,根据以下标准,目前最好的构建工具是什么:

  • 平台不可知:应该适用于windows,linux,mac
  • 语言无关:应该内置支持常见的东西,比如构建C / C ++和其他静态语言。我想它不需要支持完整的autotools套件。
  • 可扩展:我需要能够编写规则来生成文件,比如来自restructuredText,latex,自定义格式等。我真的不在乎我用什么语言编写规则,但我更喜欢真正的语言而不是而不是DSL。
  • 我宁愿避免手工编写任何XML,我认为例如ant需要。
  • 免费提供(最好是开源)

“最佳”一词略显主观,但我认为答案可以通过上述标准客观评价。

8 个答案:

答案 0 :(得分:24)

我明确表示赞成premake。虽然它没有它的兄弟那么强大,但它的主要优点是荒谬的简单性和易用性。使编写多编译器,多平台代码变得轻而易举,并且本机生成Visual Studio解决方案,XCode项目,Makefile等,无需任何额外的工作。

答案 1 :(得分:14)

当然,这取决于您的优先事项。如果您主要是为了易用性,那么至少有两个新的构建系统可以挂钩到文件系统中,以与语言无关的方式自动跟踪依赖关系。

一个是tup:

http://gittup.org/tup/

另一个是制造:

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

那个看起来性能最好,最便携,最成熟(也就是我实际使用的那个)的东西就是tup。写它的人甚至维护一个玩具linux发行版,其中一切都是git子模块,所有东西(包括内核)都是用tup构建的。从我读到的关于内核构建系统的内容来看,这是一个相当大的成就。

此外,Tup清理旧目标和其他残骸,并可以自动维护您的.gitignore文件。结果是,尝试使用目标的布局和名称变得微不足道,并且您可以自信地在git修订版之间跳转而无需重建所有内容。它是用C语言编写的。

如果您知道haskell并且正在寻找非常高级的用例,请查看shake:

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

更新:我还没有尝试过,但是这个新的“构建体”工具也会挂钩到文件系统,并受到tup的启发,因此是相关的:

https://github.com/ElastiLotem/buildsome

答案 2 :(得分:13)

因此,纯粹根据问题中提出的标准判断,看起来最合适的构建系统可能是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三明治”提供了非常一致的跨平台构建体验!

答案 3 :(得分:6)

CMake

  

CMake是一个可扩展的开源软件   管理构建过程的系统   在一个操作系统和一个   与编译器无关的方式。

答案 4 :(得分:2)

Gradle似乎符合上述所有标准。

这是一个构建系统,它充分利用了Maven和Ant的组合。对我来说,这是最好的。

答案 5 :(得分:1)

Selenium项目正在转移到Rake,不是因为它是最好的,而是因为它处理多种语言略好于所有其他构建工具,并且是跨平台的(用Ruby开发)。

所有构建工具都存在问题,人们会学会与它们共存。在JVM上运行的东西往往非常适合构建应用程序,因此AntMaven(我知道它很可怕),IvyRake

答案 6 :(得分:-1)

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

答案 7 :(得分:-2)

smooth build符合您的大部分要求。

  • 平台不可知:是的,它是用java编写的
  • 语言不可知:它不支持c / c ++ t,只有java但它可以通过用java编写的插件进行扩展,因此添加更多编译器支持不是问题
  • 可扩展:是的,您可以通过java插件实现平滑功能,也可以通过将其定义为由其他平滑函数构建的表达式来创建平滑函数。
  • 我宁愿避免编写任何XML:你不会在平滑构建中看到它的一行
  • 免费提供:是的,Apache 2许可证

披露:我是顺利构建的作者。