1

经过大量搜索和阅读大量信息后,我无法决定应该使用哪个工具来编译我的代码。我的代码库主要是 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 似乎都相当成功。

4

2 回答 2

4

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

我的主要要求是:

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

CMake 在 Windows 和 Linux 上做得非常好,但任何其他值得一提的构建系统也是如此。 有人为 CMake 编写了一些 Android 脚本。找不到类似 waf 的东西(我的 Google-fu 什么也没找到。)

必须准备好运行测试。

CMake 有一个兄弟测试框架

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

CMake 与 pkg-config 有很好的集成,并且可以链接到任意共享库。

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

CMake 可以生成自定义规则

一些强烈的偏好是:

准备支持 MAC 编译。

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

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

CMake 支持交叉编译。CMake 不会是交叉编译带来痛苦的主要来源——实际上其他一切都会。

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

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

可以做iOS交叉编译,但需要Mac。

如果调用接口类似于 autotools 的调用接口会很好,因为它是很多人都知道的并且有据可查。

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

一些问题:

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

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

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

CMake 成熟且维护良好。

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

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

于 2013-10-08T04:00:06.463 回答
2

WAF

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

它适用于 Linux、Mac 或 Windows。

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

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

SDK有

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

javac并且jar为 WAF 所知。因为你需要创建自己的任务,这 dx容易aapt2

你最好制作一个WAF工具并分享它。工具要么是 WAF 的一部分,要么是 waftools。还有这些Steinwurf 工具。

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

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

进一步关于你提到的要求:

  • WAF有waf_unit_test
  • WAF 可以做gnu_cross编译。Gnu 工具链知道许多目标。但对于 Android,您需要使用 SDK 或 NDK 自行设置。对于 NDK,您可以使用 Gnu 工具链。
  • 你会做waf configure,waf build而不是configure, make,但你可以用 a Configureor包裹Makefilewaf 以获得相同的命令。
  • WAF 很容易用 Python 扩展
  • WAF 现在在 gitlab 上并不断努力。
  • 社区肯定比 CMake 的要小。但它是 Python。您可以查看它并自己找出答案。您也可以做出贡献并成为社区的一员。
于 2018-10-06T14:44:52.947 回答