为多个移动平台构建工具

8
我们有一个复杂的C++代码库,针对多个移动平台。我们目前支持Windows CE(4.2到6.5,基于原始CE和Mobile),Android(2.1+),iPhone(4+),几乎可以工作的Bada(2.0+),如果新的C++/CX功能可用,可能会添加Windows Phone(8+)。此外,我们还在Win32上进行了测试版本,并在Win64上提供了服务应用程序,共享一些代码。我们还尝试在Linux上编译单元测试,但是由于业务量太小,所以尚未得到解决,但这可能会改变。
我们目前使用每个平台的本地工具来编译代码。每个工具都非常复杂,并且周围都有一些黑客技巧,以实现合理的单击构建。对于Bada而言,我们尚未解决Samsung调整过的Eclipse之外的构建问题,这是我们必须为生产做的事情。
到目前为止,它可以正常工作,但越来越成为维护问题。当前最大的问题是iPhone构建,因为与Visual Studio项目文件和普通的makefiles不同,无法手动在XCode项目中添加/删除/重命名文件,只有两个人拥有MacOS boxen并且有任何XCode的经验(而每个人都有Windows并且知道Visual Studio)。我们还需要为Bada目标创建一些makefiles(它是纯GNU工具链,因此任何能够使用这些交叉编译的东西都应该可以),并且我不介意摆脱Android构建中的一些修补程序:在cygwin下构建时处理依赖关系的错误修复,一些在ant构建脚本之上的黑客技巧和shell粘合剂来整理清单并将其全部保持在一起。
因此,我正在寻求有关统一此组不同平台的构建过程的建议。
  • 它绝对必须处理iPhone和Bada可执行文件以及Android构建的本地部分(因为没有人拥有三个平台来分别测试)。
  • 必须处理由多个共享库、一个主二进制文件、一个相同平台的测试二进制文件和仅在某些平台上构建的一些辅助二进制文件组成的大型项目(目前仅限于Win32)。
  • 必须能够从版本控制系统生成构建配置头文件和Java文件以及一些用户定义变量,因为我们为各种客户做了18个略有不同的构建,并且数量还在增加。
  • 当然,它必须自动处理依赖项(头文件),并且通常要可靠。
对于其他事情,我准备绕过任何不足之处,但是显然我希望将外壳管道和粘合剂的数量保持最小化,因此它应该:
  • 能够与Visual Studio、Eclipse和XCode集成,以便每个环境都能触发构建、上传构建产品到相应的目标并在那里附加调试器。
  • 能够构建Java并调用Android的自定义打包工具,这样我们就不必再去修改Google过去两年中任意更改了两次的ant构建脚本(而且旧版SDK无法下载)。
  • 能够安装各种数据文件并调用随机打包程序、其他随机脚本和工具等,这样就不必混合太多shell脚本。

到目前为止,我们已经开始尝试使用CMake(由于时间不充足,所以没有取得太大进展,但很快就必须做些什么),同时也考虑过SCons。然而,我几年前曾尝试使用SCons为Windows CE构建,但由于它会为Visual Studio生成类似于makefile的项目,而这些项目在VS2005中无法在嵌入式平台上运行,所以我放弃了。CMake可以生成本地makefiles,但需要一个自定义、有点过时的分支来支持CE。因此,我想问一下,是否还有其他工具值得我们研究,或者这些工具存在什么已知的障碍问题需要我们注意。

更新:我在几个地方找到了关于Android本机二进制文件的说明,pixellight甚至有一个cmake脚本,通过直接调用打包工具来生成apk。此外,这个shell脚本也可以实现。在iPhone上使用似乎在这里有记录。


请查看vs android(http://code.google.com/p/vs-android/) - Asaf
@Asaf:谢谢,但我们仍然被困在VS2008中,现在升级似乎不值得花这笔钱。而且它对我们的iPhone也没有帮助,因为VS不能在MacOS上工作,我从未听说过一个能在Windows上运行的面向iPhone的编译器。 - Jan Hudec
Mac现在不是*nix盒子吗?你为什么不放弃使用VS构建,而使用另一个C++编译器呢?你可能需要调整你的代码以更符合ANSI标准,但这也是最佳实践。 - baash05
@baash05:我们的代码已经可以在所有需要的编译器上编译通过。其中一个是Visual C++(用于WinNT和WinCE),其他的是各种版本的gcc。我需要的是统一构建系统的技巧,这样当我们重构代码时就不会疯狂地维护4个完全不同的构建脚本了。 - Jan Hudec
2个回答

6
同样的 CMake 构建文件可以用于生成和构建至少适用于 Win32(VS2005)、Linux(Ubuntu)和 OS X(10.5.8 Leopard)等多个平台的项目,这是根据我的个人经验。在 Android 应用程序构建过程中,有多个项目可使用 CMake,例如 http://code.google.com/p/android-cmake/。考虑到所有这些选项,我认为 CMake 是一个不错的选择。此外,CMake 很容易上手,如果你之前有写 configure.ac 和 Makefile.ac 文件的经验,会更加容易理解。
注意:CMake 的工作原理如下:
1. 开发人员/维护人员创建 CMakefile。 2. 构建者运行 cmake,使用 CMakefile 生成特定于平台的构建文件。(Linux makefiles / OSX makefiles / VS 项目文件) 3. 构建者启动构建命令。

请注意,对于交叉编译,您需要一个工具链文件将CMake引入交叉编译环境,请参见CMake Wiki。有ios-cmakeandroid-cmake项目,分别为iOS和Android提供工具链文件。 - Michael Wild

3

CMake是最好的选择。 从CMake 2.8.11开始,Windows CE可以直接支持。在该版本发布之前,可以使用CMake的每夜构建版本


谢谢。我们需要查看一下;目前我们正在使用从http://gitorious.org/~paroga/cmake/parogas-cmake.git获取的分支,该分支基于2.8.3版本。 - Jan Hudec
我目前遇到一个小问题。它假设ARM始终为ARMV4I,因此应该设置/MACHINE:THUMB,但我们仍在为Pocket PC 2003 (ARMV4)编译,应该使用/MACHINE:ARM - Jan Hudec
我应该指出,这个问题很容易解决; /MACHINE标志只出现在CMAKE_*_LINKER_FLAGS中,而且我在旧版本中也需要进行一些调整。 - Jan Hudec

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接