【问题标题】:cmake vs waf: mainly for c++ windows/linux and androidcmake vs waf:主要针对 c++ windows/linux 和 android
【发布时间】:2013-10-08 03:09:24
【问题描述】:

经过大量搜索和阅读大量信息后,我无法决定应该使用哪个工具来编译我的代码。我的代码库主要是 c++。我主要使用 linux 作为我的开发机器。

根据我之前阅读的意见,我的最终候选人是wafcmake,但我无法决定哪个更合适。

我的主要要求是:

  1. 必须能够在windows/linux和android中编译软件。
  2. 必须准备好运行测试。
  3. 必须能够很好地与其他必须使用其他构建系统编译但很可能必须从源代码编译的库配合使用。
  4. 必须能够添加自定义步骤,例如,在编译之前从某些文件(主要是图形)生成一些数据,所有这些都集成在构建系统中。

一些强烈的偏好是:

  1. 准备支持 MAC 编译。
  2. 能够从 linux 交叉编译尽可能多的平台(可能是 windows/linux/android 但不能是 MAC?)
  3. 如果需要,可以添加对 iOS 编译的支持。
  4. 如果调用界面与 autotools 的类似,那就太好了,因为它是很多人都知道的并且有据可查。

一些问题:

  1. 如果我有一些罕见的需求,哪个构建系统更适合扩展?
  2. 目前都维护得很好吗? (我主要想知道 waf)。
  3. 社区:如果我发现问题,根据您的经验,两个社区都足以支持我吗?

目前我的感觉是,我有点偏爱 waf 作为工具,但无论出于何种原因,cmake 似乎都相当成功。

【问题讨论】:

    标签: android c++ linux cmake waf


    【解决方案1】:

    对 waf 了解不多,但 CMake 非常适合您的要求。我知道 waf 是用 Python 编写的,Python 是我个人最喜欢的编程语言 ATM。

    我的主要要求是:

    必须能够在windows/linux和android中编译软件。

    CMake 在 Windows 和 Linux 上做得非常好,但任何其他值得一提的构建系统也是如此。 Someone wrote some Android scripts for CMake. 找不到类似 waf 的东西(我的 Google-fu 什么也没找到。)

    必须准备好运行测试。

    CMake 有一个兄弟testing framework

    必须能够很好地与其他必须使用其他构建系统编译但很可能必须从源代码编译的库配合使用。

    CMake has good integration with pkg-config,并且可以链接任意共享库。

    必须能够添加自定义步骤,例如,在编译之前从某些文件(主要是图形)生成一些数据,所有这些都集成在构建系统中。

    CMake can generate custom rules.

    一些强烈的偏好是:

    准备支持 MAC 编译。

    CMake 很好地支持 Mac。如果你愿意,它甚至可以让你成为一个 Xcode 项目,但它也可以进行命令行构建。

    能够从 linux 交叉编译尽可能多的平台(可能是 windows/linux/android 但不能是 MAC?)

    Cross-compiling is supported in CMake。 CMake 不会是交叉编译带来痛苦的主要来源——实际上其他所有东西都会。

    尤其是关于 Mac 的交叉编译。考虑到您无论如何都需要访问 Mac 以获取库和头文件,您需要修补 GCC 和 clang 以及 LLVM 等,为该平台进行交叉编译是可能的,但不值得。我唯一合理的理由听说经历了这么多痛苦的是运行一个自动构建服务器。无论如何,如果你有一个可以工作的 Linux -> Mac 工具链,你应该能够像使用任何其他 Unix 平台一样与 CMake 进行交叉编译。

    如果需要,能够添加对 iOS 编译的支持。

    iOS cross-compilation can be done,但你需要一台 Mac。

    如果调用界面类似于 autotools 的调用界面就更好了,因为它是很多人都知道的并且有据可查。

    编写一个只调用 CMake (cmake .) 的配置脚本。然后您的用户可以在有意义的平台上执行./configure && make && make install。还有CPack,可以让您生成DEB、RPM、NSIS (Windows) 和DMG (Mac) 安装程序/包。

    一些问题:

    如果我有一些罕见的需求,哪个构建系统更适合扩展?

    CMake 具有很强的可扩展性。它可以扩展以支持新的语言和目标平台。 (鉴于 waf 是用 Python 编写的,它也将非常容易破解。)

    目前两者都维护得很好吗? (我主要想知道 waf)。

    CMake 成熟且维护良好。

    社区:如果我发现问题,根据您的经验,两个社区都足以支持我吗?

    老实说,社区和可用的扩展是让我从像 bakefile 这样的东西回到 CMake 的原因。

    【讨论】:

    • 您的回复信息量很大。我投了赞成票,但不会作为最终答案结束,只是因为我希望有人在 waf 上为所有问题制作类似的 cmets。在类似的功能下,我宁愿使用 waf,因为我知道 python。除非waf有什么大的不便,当然……
    • 我已经尝试过 waf。该工具很好,可以完成工作,但似乎没有太多开箱即用的功能。我觉得使用自动工具,即使更困难,一切都更短,更自动化。我将尝试 CMake 并分享我的经验。值得一提的是,最近 tup 因其超快速的构建而引起了我的注意,尽管那里没有标准的“autoconf”。这只是一个替代品。
    • CMake 在某些平台上支持ninjamake 替代品),这将使您更快地构建。
    • 公平地说,作为用户,我从来没有发现使用 CMake 的软件包与 autoconf 相比,安装起来像最终用户一样直观。 CMake 包上的配置选项需要-DMYOPTION=SOMEVALUE 形式的标志,这不像--MYOPTION MYVALUE 那样直观(比如configure)IMO。但是,这不是一个大问题,可以通过提供configure 样式的包装脚本轻松解决。 CMake 有一个用于设置配置选项的 GUI,这在 Windows 上非常好,但在命令行至高无上的 Unix 上感觉很奇怪。
    【解决方案2】:

    WAF

    • 是纯Python
    • 成为您项目的一部分,即没有外部依赖
    • 支持多种构建工具
    • 可用于执行各种自动化,而不仅仅是建筑

    它适用于 Linux、Mac 或 Windows。

    在 Android 上,gradle 是 Google 选择的构建工具。使用它是 明智的,因为它是由谷歌设置的。您可以拨打waf gradle 反之亦然。

    如果你想学习所有的低级 Android SDK 工具,你也可以使用 直接WAF。

    SDK 有

    • javac 用于 Android Runtime(以前称为 Dalvik),Android 的 JVM,并生成 .class 文件
    • jar 也可用于安卓
    • d8(以前的 dx)生成 .dex 文件,带有 Dalvik 可执行代码
    • 然后aapt2 可以生成.apk

    javacjar 是 WAF 已知的。对于dxaapt2,您需要 创建自己的任务,这是非常 easy.

    您最好创建一个WAF tool 和 分享它。工具要么是 WAF 的一部分,要么是 waftools。 还有这些Steinwurf 工具。

    如果您使用 Android 原生代码 NDK:

    • 您使用 CLANG,这是 WAF 已知的

    关于您提到的要求的进一步说明:

    • WAF 有waf_unit_test
    • WAF 可以做gnu_cross 编译。 Gnu 工具链知道很多 目标。但对于 Android,您需要自己设置 使用 SDK 或 NDK。对于 NDK,您可以使用 Gnu 工具链。
    • 你会用waf configure, waf build 而不是configure, make,但您可以将 ConfigureMakefile 包裹在 waf 周围 具有相同的命令。
    • WAF 很容易使用 Python 进行扩展
    • WAF is now on gitlab 和 不断努力。
    • 社区肯定比 CMake 的要小。但它是 Python。 您可以查看它并自己找出答案。你也可以 做出贡献并成为社区的一员。

    【讨论】:

      猜你喜欢
      • 2023-03-10
      • 2011-08-15
      • 2023-03-09
      • 2014-02-15
      • 1970-01-01
      • 1970-01-01
      • 2011-05-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多