2011-05-27 58 views
13

据我所知,当我将我的任何项目从模拟器切换到设备构建配置时,构建不再分布,而是在本地构建。是否可以使用distcc构建iPhone设备版本?

那么,是否有任何一种魔法让Xcode使用分布式构建机制来实现设备构建?任何人都有一个明确的话,甚至一些实践经验?

请不要downvote或关闭,除非你了解分布式构建和Xcode的主题。这并不是一个关于签署分发的无关紧要的问题。

+0

我不是在批评,但是有没有真正的理由要分发构建?项目庞大,需要很长时间才能在一台机器上进行构建? – Jasarien 2011-05-27 11:19:18

+0

@Jasarien http://stackoverflow.com/questions/6136719/can-iphone-device-builds-be-built-using-distcc-for-distributed-builds – 2011-05-27 11:29:02

+0

@Jasarien,看到我在这个问题上的最新评论。是的,这很重要。完全重建(这些并不少见)可能需要长达半个小时。 – 2011-05-27 11:46:32

回答

8

我们还发现,的Xcode 3.2.5不分发设备建立,而建立模拟器与distcc的合理分配,尽管下Xcode的偏好设置所有必要的选项 - >分布式构建

但是,可以解决Xcode的限制,并强制它也分发Device构建。它看起来像是苹果方面的一个疏忽(bug!),他们没有默认启用Device分布式构建。是

你需要采取的步骤如下:

  • 增加Xcode的用户默认PBXNumberOfParallelBuildSubtasks的价值。这限制了并行构建任务的最大数量,并将默认值限制为CPU内核数量(有关详细信息,请参阅Apple自己的Xcode用户默认参考文档文档)。我增加了从2到16个,具体如下:

    write com.apple.Xcode PBXNumberOfParallelBuildSubtasks 16 或Xcode的4.2 defaults 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 "[email protected]" 
    exit $? 
    

有很多的选项DISTCC_HOSTS来调整,使用特别是有关你自己的本地主机也可以做一些编辑,而不是将所有的东西都挖出来,但上面应该至少让你开始。什么最适合你,显然取决于你自己的Mac硬件和网络性能。根据我自己的经验,使用分布式构建服务器安装程序(包括几个四核Mac以及我自己的双核Mac在相对较慢的网络上)将整个Device重新构建时间从大约15分钟缩短到大约5.

+1

尊敬的用户776140,这太棒了,它的工作原理!一个小问题,我必须将$ *更改为“$ @”(带引号)以正确引用带空格的参数。作为参考,我的DISTCC_HOSTS现在看起来像:'export DISTCC_HOSTS =“ - randomize machine1.local,cpp,lzo machine2.local,cpp,lzo”'(实际上还有更多的机器)。祝你的项目好运,这听起来很有趣。 – 2011-05-30 12:42:19

+0

这看起来像它不能在xcode 4上工作。有人可以确认吗? – pqnet 2011-08-31 09:24:22

0

当我意识到上一个问题因为不是真正的问题而关闭时,我正要将其标记为重复。

我没有distcc的经验,但我有一个什么可能是问题的想法。设备构建需要签名,而不是模拟器构建。我猜这个问题可能是签名只能在本地发生,或者XCode拒绝签署任何已经远程构建的东西。

另一种可能性是,您仅针对模拟器构建而不是设备构建执行了distcc配置。

+1

所有的编译前和编译后步骤(如NIB编译,链接)始终在本地执行。这些步骤包括签名,所以这不应该是一个问题。 – 2011-05-27 11:49:02

+0

@Steven您是否确定编译设备时使用distcc进行编译?也许你只为模拟器配置distcc? – 2011-05-27 13:35:46

1

我实际上编写了一个工具来管理网络上用于分发构建的机器组。它支持设置PBXNumberOfParallelBuildSubtasks设置(XCode 3.x + 4.x不同)。它也可以在不安装支持XCode的机器上运行。我做到了这一点,部分原因是我们使用XCode获得了糟糕的分布式构建速度。在去年的工作中,我们一直在使用它,使用约50-100个可用的CPU用于并发的android/iOS/Desktop版本,速度非常棒!这是SourceForge站点:http://sourceforge.net/projects/distccmanager

我设想它允许跨平台编译支持(即帮助android构建的Windows + mac机器)。

欢迎任何贡献!

相关问题