Autotools vs CMake用于Windows和Linux编译

Jul*_*rra 37 portability build-process autotools cmake

我一直在寻找Autotools和CMake的优点和缺点.但我想知道那些使用这些工具中的一个(或两个)的人的意见.

我基本上在一年前使用过Autotools,我知道其中一个优点是它依赖于shell脚本,因此不需要安装它来运行并使用可移植的shell脚本.但它看起来过于面向unix,并且无法在Windows上运行配置文件.

我现在要为开源项目选择一个构建系统工具,必须至少为Linux和Windows编译.它是用C++编写的,并使用Qt GUI前端,其余部分是"通用的".

谢谢你的帮助.

Ger*_*ago 74

2019年1月16日更新:作为工具发展的精致建议.

我之前使用过autotools已经有相当长的时间了.

目前我只在需要时才使用meson和cmake.

一些个人建议:

  1. 对于大型团队,如果你想利用XCode的生成器,坚持使用CMake.如果你不需要它,我会直接使用Meson.从版本0.49开始,Meson也支持查找CMake配置文件(尽管我还没有测试它的工作情况).此外,Visual Studio在这个时间点似乎得到了足够的支持,但是,我并没有尝试过自己.CMake的优势在于它具有Visual Studio集成功能.

  2. 丢弃自动工具.Meson已经涵盖了一切.他们的交叉编译模型令人惊讶地可以理解.在CMake,我上次检查时,一切都比较困难.

我也曾尝试使用SCons,WAFTUP.

最全功能,跨平台的系统,CMake但是,介子的DSL将更容易用于python和其他人.Meson也开始支持VS(一个VS2015发生器),一些项目已经有了实验支持,例如gstreamer.Gstreamer也是在windows中编译的meson.现在有VS2015发电机和VS2017,但我最近没有尝试自己的发电机.从介绍0.37.1需要一些工作,但他们正在改进它们,目前的版本已经是0.40.

介子

优点:

  • DSL根本不会妨碍.事实上,它是非常好的和熟悉的,基于python.
  • 精心设计的交叉编译支持.
  • 这些对象都是强类型的:你不能轻易地产生字符串替换错误,因为对象是诸如"依赖性","包含目录"等实体.
  • 如何为您的某个工具添加模块是非常明显的.
  • 交叉编译似乎更直接易用.
  • 真的很好想.Meson的设计师和主要作者在设计构建系统时非常了解他所谈论的内容.
  • 非常非常快,特别是在增量构建中.
  • 文档比cmake中的文档好10倍.访问http://mesonbuild.com,你会发现教程,howtos和一个很好的参考.它并不完美,但它确实是可以发现的.

缺点:

  • 虽然不像CMake那样成熟,但我认为它已经完全可用于C++.
  • 尽管如此,gnome,qt和常见的模块已经存在,但可用的模块并不多.
  • 项目生成器:似乎VS生成器现在运行得不好.CMake项目生成器更加成熟.
  • 有一个python3 +忍者依赖.

cmake的

优点:

  • 为许多不同的IDE生成项目.这对团队来说是一个非常好的功能.
  • 与自动工具不同,可以很好地使用Windows工具.
  • 成熟,几乎是事实上的标准.
  • Microsoft正在为Visual Studio进行CMake集成.

缺点:

  • 它不遵循任何众所周知的标准或指南.
  • 没有卸载目标.
  • DSL是很奇怪的,当你开始进行比较等等,而字符串vs列出事物或逃避字符时,你会犯很多错误,我很确定.
  • 交叉编译很糟糕.

自动工具

优点:

  • 最强大的交叉编译系统,恕我直言.
  • 生成的脚本除了make之外不需要任何其他东西,如果需要它,还需要构建一个编译器.
  • 命令行非常好并且一致.
  • unix世界的标准,很多文档.
  • 真正强大的命令行:更改安装,卸载,重命名二进制文件的目录...
  • 如果您定位unix,使用此工具打包源非常方便.

缺点:

  • 它不适用于微软工具.一个真正的showstopper.
  • 学习曲线是......好吧......但实际上我可以说CMake也不那么容易.
  • 递归make的使用在遗留项目中是普遍存在的.Automake 支持非递归构建,但它不是一种非常广泛使用的方法.

关于学习曲线,有两个非常好的资料来源:

第一个来源将让您更快地运行.这本书是一个更深入的讨论.

从Scons,waf和tup,Scons和tup更像是make.Waf更像是CMake和autotools.我起初尝试过waf而不是cmake.我认为它具有过度设计,因为它具有完整的OOP API.这些脚本看起来并不简单,对我来说工作目录的东西和相关的东西真的很混乱.最后,我发现autotools和CMake是更好的选择.我最喜欢这3个构建系统是tup.

托普

优点

  • 真的很正确.
  • 疯狂的快.你应该试着相信它.
  • 脚本语言依赖于一个非常简单的想法,可以在10分钟内理解.

缺点

  • 它没有功能齐全的配置框架.
  • 我找不到制作目标的方法doc,因为它们生成我不知道的文件,它们必须在生成之前列在输出中,或者至少,这是我现在的结论.这是一个非常烦人的限制,如果是的话,因为我不确定.

总而言之,我现在正在为新项目考虑的唯一事情是Cmake和Meson.当我有机会尝试tup,但它缺少配置框架,这意味着当你需要所有这些东西时它会使事情变得更复杂.另一方面,它真的很快.

  • 这本书也在网上 http://freesoftwaremagazine.com/books/autotools_a_guide_to_autoconf_automake_libtool/ 有史以来最好的自动工具教程。 (2认同)

rub*_*nvb 32

我不推荐Windows的autotools.使用CMake.

为什么?Windows没有本机sh.exe,仿真速度很慢.这也很容易让配置错误.我并不是说在CMake中这是不可能的,但CMake肯定会抽象出更多,所以你担心的更少.CMake文档可能有点难以阅读,但一旦设置完毕,您应该可以使用CMake所支持的所有工具链.CMake还集成了测试,包装等......

Autotools在Windows上运行缓慢,无法轻松使用MSVC,并且在Windows(和其他操作系统)方面存在奇怪的怪癖,难以调试且难以修复.libtool在Windows上也很糟糕,如果你认为应该也可以,它甚至会拒绝构建共享库.libtool也普遍存在工具链重定位问题,它可能会查看用户工具链中的错误文件.在这方面,CMake更容易.它假设目标平台是正常的,并创建通用和良好的构建指令.

此外,CMake有彩色输出:)和良好的进度百分比.

PS:作为用户,我只是在Windows上使用CMake和autotools有一些经验.CMake往往会起作用,当你不看的时候,autotools往往会咬你的耳朵,当它由于一些奇怪的错误而失败时会对你微笑......