据我所知,当我将任何项目从模拟器切换到设备构建配置时,构建不再是分布式的,而是本地构建的。
那么,让Xcode使用分布式构建机制进行设备构建有什么魔力吗?有人对此有明确的说法,甚至有一些亲身经历吗?
除非您了解分布式构建和Xcode的主题,否则请不要否决或关闭。这不是一个关于签名分发的小问题。
我们还发现,尽管在Xcode Preferences->distributed builds下设置了所有必要的选项,但Xcode 3.2.5不会分发设备构建,而模拟器构建是使用distcc正确分发的。
但是,可以解决Xcode的限制,并强制它也分发设备构建。苹果方面似乎有疏忽(bug!),默认情况下他们没有启用设备分布式构建。
您需要采取的步骤如下:
-
增加Xcode用户默认值PBXNumberOfParallelBuildSubtasks的值。这限制了并行构建任务的最大数量,并默认为CPU内核的数量(有关详细信息,请参阅Apple自己的Xcode用户默认参考文档)。我把它从2增加到16,如下所示:
write com.apple.Xcode PBXNumberOfParallelBuildSubtasks 16
或用于Xcode 4.2defaults write com.apple.dt.Xcode IDEBuildOperationMaxNumberOfConcurrentCompileTasks 16
-
请确保重新启动Xcode以使上述更改生效。
-
您需要设置DISTCC_HOSTS环境变量的值,如
distcc
手册页中所述。 -
为此,您需要在自己的
/Developer/usr/bin/distcc
脚本中设置DISTCC_HOSTS(然后调用原始/Developer/usr/bin/distcc
二进制文件,然后将其重命名为其他文件)。请注意,Xcode为每个编译单元调用/Developer/usr/bin/distcc
,并在每次调用之前设置DISTCC_HOSTS,因此需要使用此伪装脚本来覆盖Xcode。 -
我自己的
distcc
脚本简单如下(我将原来的distcc
二进制文件重命名为distcc.orig
):#!/bin/sh export DISTCC_HOSTS="--randomize your list of hosts, each followed by ',cpp,lzo'" /Developer/usr/bin/distcc.orig "$@" exit $?
DISTCC_HOSTS中有很多选项可以调整,特别是关于使用您自己的本地主机也进行一些编译,而不是将所有内容都分解,但以上内容至少应该让您开始。什么最适合你显然取决于你自己的Mac硬件和网络性能。
根据我自己的经验,在相对较慢的网络上使用由几台四核Mac电脑和我自己的双核Mac电脑组成的分布式构建服务器设置,可以将整个设备重建时间从大约15分钟缩短到大约5分钟。
我实际上写了一个工具来管理网络上的机器组,以便分发构建。它包括对设置PBXNumberOfParallelBuildSubtasks
设置的支持(XCode 3.x+4.x之间不同)。它还可以在不安装XCode的构建支持机器的情况下工作。我之所以这么做,部分原因是XCode的分布式构建速度非常糟糕。去年,我们一直在工作中使用它,大约有50-100个可用CPU用于并发的android/iOS/DDesktop构建,速度非常棒!以下是SourceForge网站:http://sourceforge.net/projects/distccmanager.
我设想它允许跨平台编译支持(即windows+mac机器帮助android构建)。
欢迎任何贡献!
当我正要将其标记为重复时,我意识到上一个问题因不是真正的问题而被关闭。
我没有distcc的经验,但我知道问题出在哪里。设备构建需要签名,而不是模拟器构建。我想问题可能是签名只能在本地进行,或者XCode拒绝对任何远程构建的内容进行签名。
另一种可能性是,您只为模拟器构建而不是设备构建进行distcc配置。