cmake vs waf:主要用于c ++ windows / linux和android

时间:2013-10-08 03:09:24

标签: android c++ linux cmake waf

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

根据我之前阅读的意见,我的最终候选人是wafcmake,但我不能自己决定哪一个应该更合适。

我的主要要求是:

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

    1. 准备支持MAC编译。
    2. 能够从linux尽可能多的平台交叉编译(也许是windows / linux / android但不能MAC?)
    3. 如果需要,可以添加对iOS编译的支持。
    4. 如果调用界面类似于autotools,那会很好,因为它是很多人都知道的,并且有很好的文档记录。
    5. 有些问题:

      1. 如果我有一些罕见的要求,哪个构建系统可以更好地扩展?
      2. 两者目前维护得很好吗? (我主要想知道waf。)
      3. 社区:如果我发现问题,根据您的经验,两个社区都足以支持我吗?
      4. 现在我的感觉是我赞成使用waf作为一种工具,但cmake似乎无论出于什么原因都非常成功。

2 个答案:

答案 0 :(得分:4)

对waf不太了解,但CMake非常符合您的要求。我知道waf是用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工具链,您应该能够与CMake交叉编译,就好像它是任何其他Unix平台一样。

  

如果需要,可以添加对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成熟且维护良好。

  

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

社区和扩展可以让我回到CMake,从bakefile这样的东西,老实说。

答案 1 :(得分:1)

WAF

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

它非常适合Linux,Mac或Windows。

在Android上,gradle是Google选择的构建工具。要使用的是 明智的做法,因为它是由Google设置的。您可以通过以下方式致电waf gradle,反之亦然。

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

SDK具有

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

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

您最好制作一个WAF tool,然后 分享它。工具要么是WAF的一部分,要么是 waftools。 也有这些Steinwurf 工具。

如果您使用以下代码制作Android本机代码 NDK

  • 您使用WAF已知的CLANG

您还提到了以下要求:

  • WAF有waf_unit_test
  • WAF可以进行gnu_cross编译。 Gnu工具链广为人知 目标。但是对于Android,您需要自己进行设置 使用SDK或NDK。对于NDK,您可以使用Gnu工具链。
  • 您应该使用waf configurewaf build而不是configuremake,但您可以将ConfigureMakefile包裹在waf周围, 具有相同的命令。
  • WAF可以很容易地用Python扩展
  • WAF is now on gitlab和 不断努力。
  • 社区肯定比CMake小。但这是Python。 您可以调查一下并自己寻找。你也可以 做出贡献并成为社区的一部分。