经过大量搜索并阅读了大量信息后,我无法决定使用哪种工具来编译代码。我的代码库主要是c ++。我主要使用linux作为我的开发机器。
根据我之前阅读的意见,我的最终候选人是waf和cmake,但我不能自己决定哪一个应该更合适。
我的主要要求是:
一些强烈的偏好是:
有些问题:
现在我的感觉是我赞成使用waf作为一种工具,但cmake似乎无论出于什么原因都非常成功。
答案 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)
它非常适合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
javac
和jar
是WAF已知的。对于dx
和aapt2
,您需要
创建自己的任务,这非常
easy。
您最好制作一个WAF tool,然后 分享它。工具要么是WAF的一部分,要么是 waftools。 也有这些Steinwurf 工具。
如果您使用以下代码制作Android本机代码 NDK:
CLANG
您还提到了以下要求:
waf_unit_test
gnu_cross
编译。 Gnu工具链广为人知
目标。但是对于Android,您需要自己进行设置
使用SDK或NDK。对于NDK,您可以使用Gnu工具链。waf configure
,waf build
而不是configure
,
make
,但您可以将Configure
或Makefile
包裹在waf周围,
具有相同的命令。